models.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from django.contrib.contenttypes.fields import (
  2. GenericForeignKey, GenericRelation,
  3. )
  4. from django.contrib.contenttypes.models import ContentType
  5. from django.db import models
  6. from django.db.models.deletion import ProtectedError
  7. __all__ = ('Link', 'Place', 'Restaurant', 'Person', 'Address',
  8. 'CharLink', 'TextLink', 'OddRelation1', 'OddRelation2',
  9. 'Contact', 'Organization', 'Note', 'Company')
  10. class Link(models.Model):
  11. content_type = models.ForeignKey(ContentType, models.CASCADE)
  12. object_id = models.PositiveIntegerField()
  13. content_object = GenericForeignKey()
  14. def __str__(self):
  15. return "Link to %s id=%s" % (self.content_type, self.object_id)
  16. class Place(models.Model):
  17. name = models.CharField(max_length=100)
  18. links = GenericRelation(Link)
  19. def __str__(self):
  20. return "Place: %s" % self.name
  21. class Restaurant(Place):
  22. def __str__(self):
  23. return "Restaurant: %s" % self.name
  24. class Address(models.Model):
  25. street = models.CharField(max_length=80)
  26. city = models.CharField(max_length=50)
  27. state = models.CharField(max_length=2)
  28. zipcode = models.CharField(max_length=5)
  29. content_type = models.ForeignKey(ContentType, models.CASCADE)
  30. object_id = models.PositiveIntegerField()
  31. content_object = GenericForeignKey()
  32. def __str__(self):
  33. return '%s %s, %s %s' % (self.street, self.city, self.state, self.zipcode)
  34. class Person(models.Model):
  35. account = models.IntegerField(primary_key=True)
  36. name = models.CharField(max_length=128)
  37. addresses = GenericRelation(Address)
  38. def __str__(self):
  39. return self.name
  40. class CharLink(models.Model):
  41. content_type = models.ForeignKey(ContentType, models.CASCADE)
  42. object_id = models.CharField(max_length=100)
  43. content_object = GenericForeignKey()
  44. class TextLink(models.Model):
  45. content_type = models.ForeignKey(ContentType, models.CASCADE)
  46. object_id = models.TextField()
  47. content_object = GenericForeignKey()
  48. class OddRelation1(models.Model):
  49. name = models.CharField(max_length=100)
  50. clinks = GenericRelation(CharLink)
  51. class OddRelation2(models.Model):
  52. name = models.CharField(max_length=100)
  53. tlinks = GenericRelation(TextLink)
  54. # models for test_q_object_or:
  55. class Note(models.Model):
  56. content_type = models.ForeignKey(ContentType, models.CASCADE)
  57. object_id = models.PositiveIntegerField()
  58. content_object = GenericForeignKey()
  59. note = models.TextField()
  60. class Contact(models.Model):
  61. notes = GenericRelation(Note)
  62. class Organization(models.Model):
  63. name = models.CharField(max_length=255)
  64. contacts = models.ManyToManyField(Contact, related_name='organizations')
  65. class Company(models.Model):
  66. name = models.CharField(max_length=100)
  67. links = GenericRelation(Link)
  68. def __str__(self):
  69. return "Company: %s" % self.name
  70. # For testing #13085 fix, we also use Note model defined above
  71. class Developer(models.Model):
  72. name = models.CharField(max_length=15)
  73. class Team(models.Model):
  74. name = models.CharField(max_length=15)
  75. members = models.ManyToManyField(Developer)
  76. def __str__(self):
  77. return "%s team" % self.name
  78. def __len__(self):
  79. return self.members.count()
  80. class Guild(models.Model):
  81. name = models.CharField(max_length=15)
  82. members = models.ManyToManyField(Developer)
  83. def __bool__(self):
  84. return False
  85. class Tag(models.Model):
  86. content_type = models.ForeignKey(ContentType, models.CASCADE, related_name='g_r_r_tags')
  87. object_id = models.CharField(max_length=15)
  88. content_object = GenericForeignKey()
  89. label = models.CharField(max_length=15)
  90. class Board(models.Model):
  91. name = models.CharField(primary_key=True, max_length=15)
  92. class SpecialGenericRelation(GenericRelation):
  93. def __init__(self, *args, **kwargs):
  94. super().__init__(*args, **kwargs)
  95. self.editable = True
  96. self.save_form_data_calls = 0
  97. def save_form_data(self, *args, **kwargs):
  98. self.save_form_data_calls += 1
  99. class HasLinks(models.Model):
  100. links = SpecialGenericRelation(Link)
  101. class Meta:
  102. abstract = True
  103. class HasLinkThing(HasLinks):
  104. pass
  105. class A(models.Model):
  106. flag = models.NullBooleanField()
  107. content_type = models.ForeignKey(ContentType, models.CASCADE)
  108. object_id = models.PositiveIntegerField()
  109. content_object = GenericForeignKey('content_type', 'object_id')
  110. class B(models.Model):
  111. a = GenericRelation(A)
  112. class Meta:
  113. ordering = ('id',)
  114. class C(models.Model):
  115. b = models.ForeignKey(B, models.CASCADE)
  116. class Meta:
  117. ordering = ('id',)
  118. class D(models.Model):
  119. b = models.ForeignKey(B, models.SET_NULL, null=True)
  120. class Meta:
  121. ordering = ('id',)
  122. # Ticket #22998
  123. class Node(models.Model):
  124. content_type = models.ForeignKey(ContentType, models.CASCADE)
  125. object_id = models.PositiveIntegerField()
  126. content = GenericForeignKey('content_type', 'object_id')
  127. class Content(models.Model):
  128. nodes = GenericRelation(Node)
  129. related_obj = models.ForeignKey('Related', models.CASCADE)
  130. class Related(models.Model):
  131. pass
  132. def prevent_deletes(sender, instance, **kwargs):
  133. raise ProtectedError("Not allowed to delete.", [instance])
  134. models.signals.pre_delete.connect(prevent_deletes, sender=Node)