1. """
    
  2. Testing of admin inline formsets.
    
  3. """
    
  4. import random
    
  5. 
    
  6. from django.contrib.contenttypes.fields import GenericForeignKey
    
  7. from django.contrib.contenttypes.models import ContentType
    
  8. from django.core.exceptions import ValidationError
    
  9. from django.db import models
    
  10. 
    
  11. 
    
  12. class Parent(models.Model):
    
  13.     name = models.CharField(max_length=50)
    
  14. 
    
  15.     def __str__(self):
    
  16.         return self.name
    
  17. 
    
  18. 
    
  19. class Teacher(models.Model):
    
  20.     name = models.CharField(max_length=50)
    
  21. 
    
  22.     def __str__(self):
    
  23.         return self.name
    
  24. 
    
  25. 
    
  26. class Child(models.Model):
    
  27.     name = models.CharField(max_length=50)
    
  28.     teacher = models.ForeignKey(Teacher, models.CASCADE)
    
  29. 
    
  30.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  31.     object_id = models.PositiveIntegerField()
    
  32.     parent = GenericForeignKey()
    
  33. 
    
  34.     def __str__(self):
    
  35.         return "I am %s, a child of %s" % (self.name, self.parent)
    
  36. 
    
  37. 
    
  38. class Book(models.Model):
    
  39.     name = models.CharField(max_length=50)
    
  40. 
    
  41.     def __str__(self):
    
  42.         return self.name
    
  43. 
    
  44. 
    
  45. class Author(models.Model):
    
  46.     name = models.CharField(max_length=50)
    
  47.     books = models.ManyToManyField(Book)
    
  48.     person = models.OneToOneField("Person", models.CASCADE, null=True)
    
  49. 
    
  50. 
    
  51. class NonAutoPKBook(models.Model):
    
  52.     rand_pk = models.IntegerField(primary_key=True, editable=False)
    
  53.     author = models.ForeignKey(Author, models.CASCADE)
    
  54.     title = models.CharField(max_length=50)
    
  55. 
    
  56.     def save(self, *args, **kwargs):
    
  57.         while not self.rand_pk:
    
  58.             test_pk = random.randint(1, 99999)
    
  59.             if not NonAutoPKBook.objects.filter(rand_pk=test_pk).exists():
    
  60.                 self.rand_pk = test_pk
    
  61.         super().save(*args, **kwargs)
    
  62. 
    
  63. 
    
  64. class NonAutoPKBookChild(NonAutoPKBook):
    
  65.     pass
    
  66. 
    
  67. 
    
  68. class EditablePKBook(models.Model):
    
  69.     manual_pk = models.IntegerField(primary_key=True)
    
  70.     author = models.ForeignKey(Author, models.CASCADE)
    
  71.     title = models.CharField(max_length=50)
    
  72. 
    
  73. 
    
  74. class Holder(models.Model):
    
  75.     dummy = models.IntegerField()
    
  76. 
    
  77. 
    
  78. class Inner(models.Model):
    
  79.     dummy = models.IntegerField()
    
  80.     holder = models.ForeignKey(Holder, models.CASCADE)
    
  81.     readonly = models.CharField("Inner readonly label", max_length=1)
    
  82. 
    
  83.     def get_absolute_url(self):
    
  84.         return "/inner/"
    
  85. 
    
  86. 
    
  87. class Holder2(models.Model):
    
  88.     dummy = models.IntegerField()
    
  89. 
    
  90. 
    
  91. class Inner2(models.Model):
    
  92.     dummy = models.IntegerField()
    
  93.     holder = models.ForeignKey(Holder2, models.CASCADE)
    
  94. 
    
  95. 
    
  96. class Holder3(models.Model):
    
  97.     dummy = models.IntegerField()
    
  98. 
    
  99. 
    
  100. class Inner3(models.Model):
    
  101.     dummy = models.IntegerField()
    
  102.     holder = models.ForeignKey(Holder3, models.CASCADE)
    
  103. 
    
  104. 
    
  105. # Models for ticket #8190
    
  106. 
    
  107. 
    
  108. class Holder4(models.Model):
    
  109.     dummy = models.IntegerField()
    
  110. 
    
  111. 
    
  112. class Inner4Stacked(models.Model):
    
  113.     dummy = models.IntegerField(help_text="Awesome stacked help text is awesome.")
    
  114.     holder = models.ForeignKey(Holder4, models.CASCADE)
    
  115. 
    
  116.     class Meta:
    
  117.         constraints = [
    
  118.             models.UniqueConstraint(
    
  119.                 fields=["dummy", "holder"], name="unique_stacked_dummy_per_holder"
    
  120.             )
    
  121.         ]
    
  122. 
    
  123. 
    
  124. class Inner4Tabular(models.Model):
    
  125.     dummy = models.IntegerField(help_text="Awesome tabular help text is awesome.")
    
  126.     holder = models.ForeignKey(Holder4, models.CASCADE)
    
  127. 
    
  128.     class Meta:
    
  129.         constraints = [
    
  130.             models.UniqueConstraint(
    
  131.                 fields=["dummy", "holder"], name="unique_tabular_dummy_per_holder"
    
  132.             )
    
  133.         ]
    
  134. 
    
  135. 
    
  136. # Models for ticket #31441
    
  137. 
    
  138. 
    
  139. class Holder5(models.Model):
    
  140.     dummy = models.IntegerField()
    
  141. 
    
  142. 
    
  143. class Inner5Stacked(models.Model):
    
  144.     name = models.CharField(max_length=10)
    
  145.     select = models.CharField(choices=(("1", "One"), ("2", "Two")), max_length=10)
    
  146.     text = models.TextField()
    
  147.     dummy = models.IntegerField()
    
  148.     holder = models.ForeignKey(Holder5, models.CASCADE)
    
  149. 
    
  150. 
    
  151. class Inner5Tabular(models.Model):
    
  152.     name = models.CharField(max_length=10)
    
  153.     select = models.CharField(choices=(("1", "One"), ("2", "Two")), max_length=10)
    
  154.     text = models.TextField()
    
  155.     dummy = models.IntegerField()
    
  156.     holder = models.ForeignKey(Holder5, models.CASCADE)
    
  157. 
    
  158. 
    
  159. # Models for #12749
    
  160. 
    
  161. 
    
  162. class Person(models.Model):
    
  163.     firstname = models.CharField(max_length=15)
    
  164. 
    
  165. 
    
  166. class OutfitItem(models.Model):
    
  167.     name = models.CharField(max_length=15)
    
  168. 
    
  169. 
    
  170. class Fashionista(models.Model):
    
  171.     person = models.OneToOneField(Person, models.CASCADE, primary_key=True)
    
  172.     weaknesses = models.ManyToManyField(
    
  173.         OutfitItem, through="ShoppingWeakness", blank=True
    
  174.     )
    
  175. 
    
  176. 
    
  177. class ShoppingWeakness(models.Model):
    
  178.     fashionista = models.ForeignKey(Fashionista, models.CASCADE)
    
  179.     item = models.ForeignKey(OutfitItem, models.CASCADE)
    
  180. 
    
  181. 
    
  182. # Models for #13510
    
  183. 
    
  184. 
    
  185. class TitleCollection(models.Model):
    
  186.     pass
    
  187. 
    
  188. 
    
  189. class Title(models.Model):
    
  190.     collection = models.ForeignKey(
    
  191.         TitleCollection, models.SET_NULL, blank=True, null=True
    
  192.     )
    
  193.     title1 = models.CharField(max_length=100)
    
  194.     title2 = models.CharField(max_length=100)
    
  195. 
    
  196. 
    
  197. # Models for #15424
    
  198. 
    
  199. 
    
  200. class Poll(models.Model):
    
  201.     name = models.CharField(max_length=40)
    
  202. 
    
  203. 
    
  204. class Question(models.Model):
    
  205.     text = models.CharField(max_length=40)
    
  206.     poll = models.ForeignKey(Poll, models.CASCADE)
    
  207. 
    
  208.     def clean(self):
    
  209.         raise ValidationError("Always invalid model.")
    
  210. 
    
  211. 
    
  212. class Novel(models.Model):
    
  213.     name = models.CharField(max_length=40)
    
  214. 
    
  215. 
    
  216. class NovelReadonlyChapter(Novel):
    
  217.     class Meta:
    
  218.         proxy = True
    
  219. 
    
  220. 
    
  221. class Chapter(models.Model):
    
  222.     name = models.CharField(max_length=40)
    
  223.     novel = models.ForeignKey(Novel, models.CASCADE)
    
  224. 
    
  225. 
    
  226. class FootNote(models.Model):
    
  227.     """
    
  228.     Model added for ticket 19838
    
  229.     """
    
  230. 
    
  231.     chapter = models.ForeignKey(Chapter, models.PROTECT)
    
  232.     note = models.CharField(max_length=40)
    
  233. 
    
  234. 
    
  235. # Models for #16838
    
  236. 
    
  237. 
    
  238. class CapoFamiglia(models.Model):
    
  239.     name = models.CharField(max_length=100)
    
  240. 
    
  241. 
    
  242. class Consigliere(models.Model):
    
  243.     name = models.CharField(max_length=100, help_text="Help text for Consigliere")
    
  244.     capo_famiglia = models.ForeignKey(CapoFamiglia, models.CASCADE, related_name="+")
    
  245. 
    
  246. 
    
  247. class SottoCapo(models.Model):
    
  248.     name = models.CharField(max_length=100)
    
  249.     capo_famiglia = models.ForeignKey(CapoFamiglia, models.CASCADE, related_name="+")
    
  250. 
    
  251. 
    
  252. class ReadOnlyInline(models.Model):
    
  253.     name = models.CharField(max_length=100, help_text="Help text for ReadOnlyInline")
    
  254.     capo_famiglia = models.ForeignKey(CapoFamiglia, models.CASCADE)
    
  255. 
    
  256. 
    
  257. # Models for #18433
    
  258. 
    
  259. 
    
  260. class ParentModelWithCustomPk(models.Model):
    
  261.     my_own_pk = models.CharField(max_length=100, primary_key=True)
    
  262.     name = models.CharField(max_length=100)
    
  263. 
    
  264. 
    
  265. class ChildModel1(models.Model):
    
  266.     my_own_pk = models.CharField(max_length=100, primary_key=True)
    
  267.     name = models.CharField(max_length=100)
    
  268.     parent = models.ForeignKey(ParentModelWithCustomPk, models.CASCADE)
    
  269. 
    
  270.     def get_absolute_url(self):
    
  271.         return "/child_model1/"
    
  272. 
    
  273. 
    
  274. class ChildModel2(models.Model):
    
  275.     my_own_pk = models.CharField(max_length=100, primary_key=True)
    
  276.     name = models.CharField(max_length=100)
    
  277.     parent = models.ForeignKey(ParentModelWithCustomPk, models.CASCADE)
    
  278. 
    
  279.     def get_absolute_url(self):
    
  280.         return "/child_model2/"
    
  281. 
    
  282. 
    
  283. # Models for #19425
    
  284. class BinaryTree(models.Model):
    
  285.     name = models.CharField(max_length=100)
    
  286.     parent = models.ForeignKey("self", models.SET_NULL, null=True, blank=True)
    
  287. 
    
  288. 
    
  289. # Models for #19524
    
  290. 
    
  291. 
    
  292. class LifeForm(models.Model):
    
  293.     pass
    
  294. 
    
  295. 
    
  296. class ExtraTerrestrial(LifeForm):
    
  297.     name = models.CharField(max_length=100)
    
  298. 
    
  299. 
    
  300. class Sighting(models.Model):
    
  301.     et = models.ForeignKey(ExtraTerrestrial, models.CASCADE)
    
  302.     place = models.CharField(max_length=100)
    
  303. 
    
  304. 
    
  305. # Models for #18263
    
  306. class SomeParentModel(models.Model):
    
  307.     name = models.CharField(max_length=1)
    
  308. 
    
  309. 
    
  310. class SomeChildModel(models.Model):
    
  311.     name = models.CharField(max_length=1)
    
  312.     position = models.PositiveIntegerField()
    
  313.     parent = models.ForeignKey(SomeParentModel, models.CASCADE)
    
  314.     readonly_field = models.CharField(max_length=1)
    
  315. 
    
  316. 
    
  317. # Models for #30231
    
  318. class Course(models.Model):
    
  319.     name = models.CharField(max_length=128)
    
  320. 
    
  321.     def __str__(self):
    
  322.         return self.name
    
  323. 
    
  324. 
    
  325. class Class(models.Model):
    
  326.     person = models.ManyToManyField(Person, verbose_name="attendant")
    
  327.     course = models.ForeignKey(Course, on_delete=models.CASCADE)
    
  328. 
    
  329. 
    
  330. class CourseProxy(Course):
    
  331.     class Meta:
    
  332.         proxy = True
    
  333. 
    
  334. 
    
  335. class CourseProxy1(Course):
    
  336.     class Meta:
    
  337.         proxy = True
    
  338. 
    
  339. 
    
  340. class CourseProxy2(Course):
    
  341.     class Meta:
    
  342.         proxy = True
    
  343. 
    
  344. 
    
  345. # Other models
    
  346. class ShowInlineParent(models.Model):
    
  347.     show_inlines = models.BooleanField(default=False)
    
  348. 
    
  349. 
    
  350. class ShowInlineChild(models.Model):
    
  351.     parent = models.ForeignKey(ShowInlineParent, on_delete=models.CASCADE)
    
  352. 
    
  353. 
    
  354. class ProfileCollection(models.Model):
    
  355.     pass
    
  356. 
    
  357. 
    
  358. class Profile(models.Model):
    
  359.     collection = models.ForeignKey(
    
  360.         ProfileCollection, models.SET_NULL, blank=True, null=True
    
  361.     )
    
  362.     first_name = models.CharField(max_length=100)
    
  363.     last_name = models.CharField(max_length=100)
    
  364. 
    
  365. 
    
  366. class VerboseNameProfile(Profile):
    
  367.     class Meta:
    
  368.         verbose_name = "Model with verbose name only"
    
  369. 
    
  370. 
    
  371. class VerboseNamePluralProfile(Profile):
    
  372.     class Meta:
    
  373.         verbose_name_plural = "Model with verbose name plural only"
    
  374. 
    
  375. 
    
  376. class BothVerboseNameProfile(Profile):
    
  377.     class Meta:
    
  378.         verbose_name = "Model with both - name"
    
  379.         verbose_name_plural = "Model with both - plural name"