1. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    
  2. from django.contrib.contenttypes.models import ContentType
    
  3. from django.db import models
    
  4. 
    
  5. __all__ = (
    
  6.     "Link",
    
  7.     "Place",
    
  8.     "Restaurant",
    
  9.     "Person",
    
  10.     "Address",
    
  11.     "CharLink",
    
  12.     "TextLink",
    
  13.     "OddRelation1",
    
  14.     "OddRelation2",
    
  15.     "Contact",
    
  16.     "Organization",
    
  17.     "Note",
    
  18.     "Company",
    
  19. )
    
  20. 
    
  21. 
    
  22. class Link(models.Model):
    
  23.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  24.     object_id = models.PositiveIntegerField()
    
  25.     content_object = GenericForeignKey()
    
  26. 
    
  27. 
    
  28. class LinkProxy(Link):
    
  29.     class Meta:
    
  30.         proxy = True
    
  31. 
    
  32. 
    
  33. class Place(models.Model):
    
  34.     name = models.CharField(max_length=100)
    
  35.     links = GenericRelation(Link, related_query_name="places")
    
  36.     link_proxy = GenericRelation(LinkProxy)
    
  37. 
    
  38. 
    
  39. class Restaurant(Place):
    
  40.     pass
    
  41. 
    
  42. 
    
  43. class Cafe(Restaurant):
    
  44.     pass
    
  45. 
    
  46. 
    
  47. class Address(models.Model):
    
  48.     street = models.CharField(max_length=80)
    
  49.     city = models.CharField(max_length=50)
    
  50.     state = models.CharField(max_length=2)
    
  51.     zipcode = models.CharField(max_length=5)
    
  52.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  53.     object_id = models.PositiveIntegerField()
    
  54.     content_object = GenericForeignKey()
    
  55. 
    
  56. 
    
  57. class Person(models.Model):
    
  58.     account = models.IntegerField(primary_key=True)
    
  59.     name = models.CharField(max_length=128)
    
  60.     addresses = GenericRelation(Address)
    
  61. 
    
  62. 
    
  63. class CharLink(models.Model):
    
  64.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  65.     object_id = models.CharField(max_length=100)
    
  66.     content_object = GenericForeignKey()
    
  67. 
    
  68. 
    
  69. class TextLink(models.Model):
    
  70.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  71.     object_id = models.TextField()
    
  72.     content_object = GenericForeignKey()
    
  73. 
    
  74. 
    
  75. class OddRelation1(models.Model):
    
  76.     name = models.CharField(max_length=100)
    
  77.     clinks = GenericRelation(CharLink)
    
  78. 
    
  79. 
    
  80. class OddRelation2(models.Model):
    
  81.     name = models.CharField(max_length=100)
    
  82.     tlinks = GenericRelation(TextLink)
    
  83. 
    
  84. 
    
  85. # models for test_q_object_or:
    
  86. class Note(models.Model):
    
  87.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  88.     object_id = models.PositiveIntegerField()
    
  89.     content_object = GenericForeignKey()
    
  90.     note = models.TextField()
    
  91. 
    
  92. 
    
  93. class Contact(models.Model):
    
  94.     notes = GenericRelation(Note)
    
  95. 
    
  96. 
    
  97. class Organization(models.Model):
    
  98.     name = models.CharField(max_length=255)
    
  99.     contacts = models.ManyToManyField(Contact, related_name="organizations")
    
  100. 
    
  101. 
    
  102. class Company(models.Model):
    
  103.     name = models.CharField(max_length=100)
    
  104.     links = GenericRelation(Link)
    
  105. 
    
  106. 
    
  107. class Team(models.Model):
    
  108.     name = models.CharField(max_length=15)
    
  109. 
    
  110.     def __len__(self):
    
  111.         return 0
    
  112. 
    
  113. 
    
  114. class Guild(models.Model):
    
  115.     name = models.CharField(max_length=15)
    
  116. 
    
  117.     def __bool__(self):
    
  118.         return False
    
  119. 
    
  120. 
    
  121. class Tag(models.Model):
    
  122.     content_type = models.ForeignKey(
    
  123.         ContentType, models.CASCADE, related_name="g_r_r_tags"
    
  124.     )
    
  125.     object_id = models.CharField(max_length=15)
    
  126.     content_object = GenericForeignKey()
    
  127.     label = models.CharField(max_length=15)
    
  128. 
    
  129. 
    
  130. class Board(models.Model):
    
  131.     name = models.CharField(primary_key=True, max_length=25)
    
  132. 
    
  133. 
    
  134. class SpecialGenericRelation(GenericRelation):
    
  135.     def __init__(self, *args, **kwargs):
    
  136.         super().__init__(*args, **kwargs)
    
  137.         self.editable = True
    
  138.         self.save_form_data_calls = 0
    
  139. 
    
  140.     def save_form_data(self, *args, **kwargs):
    
  141.         self.save_form_data_calls += 1
    
  142. 
    
  143. 
    
  144. class HasLinks(models.Model):
    
  145.     links = SpecialGenericRelation(Link, related_query_name="targets")
    
  146. 
    
  147.     class Meta:
    
  148.         abstract = True
    
  149. 
    
  150. 
    
  151. class HasLinkThing(HasLinks):
    
  152.     pass
    
  153. 
    
  154. 
    
  155. class A(models.Model):
    
  156.     flag = models.BooleanField(null=True)
    
  157.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  158.     object_id = models.PositiveIntegerField()
    
  159.     content_object = GenericForeignKey("content_type", "object_id")
    
  160. 
    
  161. 
    
  162. class B(models.Model):
    
  163.     a = GenericRelation(A)
    
  164. 
    
  165.     class Meta:
    
  166.         ordering = ("id",)
    
  167. 
    
  168. 
    
  169. class C(models.Model):
    
  170.     b = models.ForeignKey(B, models.CASCADE)
    
  171. 
    
  172.     class Meta:
    
  173.         ordering = ("id",)
    
  174. 
    
  175. 
    
  176. class D(models.Model):
    
  177.     b = models.ForeignKey(B, models.SET_NULL, null=True)
    
  178. 
    
  179.     class Meta:
    
  180.         ordering = ("id",)
    
  181. 
    
  182. 
    
  183. # Ticket #22998
    
  184. 
    
  185. 
    
  186. class Node(models.Model):
    
  187.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  188.     object_id = models.PositiveIntegerField()
    
  189.     content = GenericForeignKey("content_type", "object_id")
    
  190. 
    
  191. 
    
  192. class Content(models.Model):
    
  193.     nodes = GenericRelation(Node)
    
  194.     related_obj = models.ForeignKey("Related", models.CASCADE)
    
  195. 
    
  196. 
    
  197. class Related(models.Model):
    
  198.     pass
    
  199. 
    
  200. 
    
  201. def prevent_deletes(sender, instance, **kwargs):
    
  202.     raise models.ProtectedError("Not allowed to delete.", [instance])
    
  203. 
    
  204. 
    
  205. models.signals.pre_delete.connect(prevent_deletes, sender=Node)