models.py 5.5 KB

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