models.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import datetime
  4. import tempfile
  5. import os
  6. from django.contrib.auth.models import User
  7. from django.contrib.contenttypes import generic
  8. from django.contrib.contenttypes.models import ContentType
  9. from django.core.files.storage import FileSystemStorage
  10. from django.db import models
  11. from django.utils.encoding import python_2_unicode_compatible
  12. class Section(models.Model):
  13. """
  14. A simple section that links to articles, to test linking to related items
  15. in admin views.
  16. """
  17. name = models.CharField(max_length=100)
  18. @python_2_unicode_compatible
  19. class Article(models.Model):
  20. """
  21. A simple article to test admin views. Test backwards compatibility.
  22. """
  23. title = models.CharField(max_length=100)
  24. content = models.TextField()
  25. date = models.DateTimeField()
  26. section = models.ForeignKey(Section, null=True, blank=True)
  27. def __str__(self):
  28. return self.title
  29. def model_year(self):
  30. return self.date.year
  31. model_year.admin_order_field = 'date'
  32. model_year.short_description = ''
  33. @python_2_unicode_compatible
  34. class Book(models.Model):
  35. """
  36. A simple book that has chapters.
  37. """
  38. name = models.CharField(max_length=100, verbose_name='¿Name?')
  39. def __str__(self):
  40. return self.name
  41. @python_2_unicode_compatible
  42. class Promo(models.Model):
  43. name = models.CharField(max_length=100, verbose_name='¿Name?')
  44. book = models.ForeignKey(Book)
  45. def __str__(self):
  46. return self.name
  47. @python_2_unicode_compatible
  48. class Chapter(models.Model):
  49. title = models.CharField(max_length=100, verbose_name='¿Title?')
  50. content = models.TextField()
  51. book = models.ForeignKey(Book)
  52. def __str__(self):
  53. return self.title
  54. class Meta:
  55. # Use a utf-8 bytestring to ensure it works (see #11710)
  56. verbose_name = '¿Chapter?'
  57. @python_2_unicode_compatible
  58. class ChapterXtra1(models.Model):
  59. chap = models.OneToOneField(Chapter, verbose_name='¿Chap?')
  60. xtra = models.CharField(max_length=100, verbose_name='¿Xtra?')
  61. def __str__(self):
  62. return '¿Xtra1: %s' % self.xtra
  63. @python_2_unicode_compatible
  64. class ChapterXtra2(models.Model):
  65. chap = models.OneToOneField(Chapter, verbose_name='¿Chap?')
  66. xtra = models.CharField(max_length=100, verbose_name='¿Xtra?')
  67. def __str__(self):
  68. return '¿Xtra2: %s' % self.xtra
  69. class RowLevelChangePermissionModel(models.Model):
  70. name = models.CharField(max_length=100, blank=True)
  71. class CustomArticle(models.Model):
  72. content = models.TextField()
  73. date = models.DateTimeField()
  74. @python_2_unicode_compatible
  75. class ModelWithStringPrimaryKey(models.Model):
  76. string_pk = models.CharField(max_length=255, primary_key=True)
  77. def __str__(self):
  78. return self.string_pk
  79. def get_absolute_url(self):
  80. return '/dummy/%s/' % self.string_pk
  81. @python_2_unicode_compatible
  82. class Color(models.Model):
  83. value = models.CharField(max_length=10)
  84. warm = models.BooleanField(default=False)
  85. def __str__(self):
  86. return self.value
  87. # we replicate Color to register with another ModelAdmin
  88. class Color2(Color):
  89. class Meta:
  90. proxy = True
  91. @python_2_unicode_compatible
  92. class Thing(models.Model):
  93. title = models.CharField(max_length=20)
  94. color = models.ForeignKey(Color, limit_choices_to={'warm': True})
  95. pub_date = models.DateField(blank=True, null=True)
  96. def __str__(self):
  97. return self.title
  98. @python_2_unicode_compatible
  99. class Actor(models.Model):
  100. name = models.CharField(max_length=50)
  101. age = models.IntegerField()
  102. title = models.CharField(max_length=50, null=True, blank=True)
  103. def __str__(self):
  104. return self.name
  105. @python_2_unicode_compatible
  106. class Inquisition(models.Model):
  107. expected = models.BooleanField(default=False)
  108. leader = models.ForeignKey(Actor)
  109. country = models.CharField(max_length=20)
  110. def __str__(self):
  111. return "by %s from %s" % (self.leader, self.country)
  112. @python_2_unicode_compatible
  113. class Sketch(models.Model):
  114. title = models.CharField(max_length=100)
  115. inquisition = models.ForeignKey(Inquisition, limit_choices_to={'leader__name': 'Palin',
  116. 'leader__age': 27,
  117. 'expected': False,
  118. })
  119. defendant0 = models.ForeignKey(Actor, limit_choices_to={'title__isnull': False}, related_name='as_defendant0')
  120. defendant1 = models.ForeignKey(Actor, limit_choices_to={'title__isnull': True}, related_name='as_defendant1')
  121. def __str__(self):
  122. return self.title
  123. class Fabric(models.Model):
  124. NG_CHOICES = (
  125. ('Textured', (
  126. ('x', 'Horizontal'),
  127. ('y', 'Vertical'),
  128. )
  129. ),
  130. ('plain', 'Smooth'),
  131. )
  132. surface = models.CharField(max_length=20, choices=NG_CHOICES)
  133. @python_2_unicode_compatible
  134. class Person(models.Model):
  135. GENDER_CHOICES = (
  136. (1, "Male"),
  137. (2, "Female"),
  138. )
  139. name = models.CharField(max_length=100)
  140. gender = models.IntegerField(choices=GENDER_CHOICES)
  141. age = models.IntegerField(default=21)
  142. alive = models.BooleanField(default=True)
  143. def __str__(self):
  144. return self.name
  145. @python_2_unicode_compatible
  146. class Persona(models.Model):
  147. """
  148. A simple persona associated with accounts, to test inlining of related
  149. accounts which inherit from a common accounts class.
  150. """
  151. name = models.CharField(blank=False, max_length=80)
  152. def __str__(self):
  153. return self.name
  154. @python_2_unicode_compatible
  155. class Account(models.Model):
  156. """
  157. A simple, generic account encapsulating the information shared by all
  158. types of accounts.
  159. """
  160. username = models.CharField(blank=False, max_length=80)
  161. persona = models.ForeignKey(Persona, related_name="accounts")
  162. servicename = 'generic service'
  163. def __str__(self):
  164. return "%s: %s" % (self.servicename, self.username)
  165. class FooAccount(Account):
  166. """A service-specific account of type Foo."""
  167. servicename = 'foo'
  168. class BarAccount(Account):
  169. """A service-specific account of type Bar."""
  170. servicename = 'bar'
  171. @python_2_unicode_compatible
  172. class Subscriber(models.Model):
  173. name = models.CharField(blank=False, max_length=80)
  174. email = models.EmailField(blank=False, max_length=175)
  175. def __str__(self):
  176. return "%s (%s)" % (self.name, self.email)
  177. class ExternalSubscriber(Subscriber):
  178. pass
  179. class OldSubscriber(Subscriber):
  180. pass
  181. class Media(models.Model):
  182. name = models.CharField(max_length=60)
  183. class Podcast(Media):
  184. release_date = models.DateField()
  185. class Meta:
  186. ordering = ('release_date',) # overridden in PodcastAdmin
  187. class Vodcast(Media):
  188. media = models.OneToOneField(Media, primary_key=True, parent_link=True)
  189. released = models.BooleanField(default=False)
  190. class Parent(models.Model):
  191. name = models.CharField(max_length=128)
  192. class Child(models.Model):
  193. parent = models.ForeignKey(Parent, editable=False)
  194. name = models.CharField(max_length=30, blank=True)
  195. @python_2_unicode_compatible
  196. class EmptyModel(models.Model):
  197. def __str__(self):
  198. return "Primary key = %s" % self.id
  199. temp_storage = FileSystemStorage(tempfile.mkdtemp(dir=os.environ['DJANGO_TEST_TEMP_DIR']))
  200. UPLOAD_TO = os.path.join(temp_storage.location, 'test_upload')
  201. class Gallery(models.Model):
  202. name = models.CharField(max_length=100)
  203. class Picture(models.Model):
  204. name = models.CharField(max_length=100)
  205. image = models.FileField(storage=temp_storage, upload_to='test_upload')
  206. gallery = models.ForeignKey(Gallery, related_name="pictures")
  207. class Language(models.Model):
  208. iso = models.CharField(max_length=5, primary_key=True)
  209. name = models.CharField(max_length=50)
  210. english_name = models.CharField(max_length=50)
  211. shortlist = models.BooleanField(default=False)
  212. class Meta:
  213. ordering = ('iso',)
  214. # a base class for Recommender and Recommendation
  215. class Title(models.Model):
  216. pass
  217. class TitleTranslation(models.Model):
  218. title = models.ForeignKey(Title)
  219. text = models.CharField(max_length=100)
  220. class Recommender(Title):
  221. pass
  222. class Recommendation(Title):
  223. recommender = models.ForeignKey(Recommender)
  224. class Collector(models.Model):
  225. name = models.CharField(max_length=100)
  226. class Widget(models.Model):
  227. owner = models.ForeignKey(Collector)
  228. name = models.CharField(max_length=100)
  229. class DooHickey(models.Model):
  230. code = models.CharField(max_length=10, primary_key=True)
  231. owner = models.ForeignKey(Collector)
  232. name = models.CharField(max_length=100)
  233. class Grommet(models.Model):
  234. code = models.AutoField(primary_key=True)
  235. owner = models.ForeignKey(Collector)
  236. name = models.CharField(max_length=100)
  237. class Whatsit(models.Model):
  238. index = models.IntegerField(primary_key=True)
  239. owner = models.ForeignKey(Collector)
  240. name = models.CharField(max_length=100)
  241. class Doodad(models.Model):
  242. name = models.CharField(max_length=100)
  243. class FancyDoodad(Doodad):
  244. owner = models.ForeignKey(Collector)
  245. expensive = models.BooleanField(default=True)
  246. @python_2_unicode_compatible
  247. class Category(models.Model):
  248. collector = models.ForeignKey(Collector)
  249. order = models.PositiveIntegerField()
  250. class Meta:
  251. ordering = ('order',)
  252. def __str__(self):
  253. return '%s:o%s' % (self.id, self.order)
  254. class Link(models.Model):
  255. posted = models.DateField(
  256. default=lambda: datetime.date.today() - datetime.timedelta(days=7)
  257. )
  258. url = models.URLField()
  259. post = models.ForeignKey("Post")
  260. class PrePopulatedPost(models.Model):
  261. title = models.CharField(max_length=100)
  262. published = models.BooleanField(default=False)
  263. slug = models.SlugField()
  264. class PrePopulatedSubPost(models.Model):
  265. post = models.ForeignKey(PrePopulatedPost)
  266. subtitle = models.CharField(max_length=100)
  267. subslug = models.SlugField()
  268. class Post(models.Model):
  269. title = models.CharField(max_length=100, help_text="Some help text for the title (with unicode ŠĐĆŽćžšđ)")
  270. content = models.TextField(help_text="Some help text for the content (with unicode ŠĐĆŽćžšđ)")
  271. posted = models.DateField(
  272. default=datetime.date.today,
  273. help_text="Some help text for the date (with unicode ŠĐĆŽćžšđ)"
  274. )
  275. public = models.NullBooleanField()
  276. def awesomeness_level(self):
  277. return "Very awesome."
  278. @python_2_unicode_compatible
  279. class Gadget(models.Model):
  280. name = models.CharField(max_length=100)
  281. def __str__(self):
  282. return self.name
  283. @python_2_unicode_compatible
  284. class Villain(models.Model):
  285. name = models.CharField(max_length=100)
  286. def __str__(self):
  287. return self.name
  288. class SuperVillain(Villain):
  289. pass
  290. @python_2_unicode_compatible
  291. class FunkyTag(models.Model):
  292. "Because we all know there's only one real use case for GFKs."
  293. name = models.CharField(max_length=25)
  294. content_type = models.ForeignKey(ContentType)
  295. object_id = models.PositiveIntegerField()
  296. content_object = generic.GenericForeignKey('content_type', 'object_id')
  297. def __str__(self):
  298. return self.name
  299. @python_2_unicode_compatible
  300. class Plot(models.Model):
  301. name = models.CharField(max_length=100)
  302. team_leader = models.ForeignKey(Villain, related_name='lead_plots')
  303. contact = models.ForeignKey(Villain, related_name='contact_plots')
  304. tags = generic.GenericRelation(FunkyTag)
  305. def __str__(self):
  306. return self.name
  307. @python_2_unicode_compatible
  308. class PlotDetails(models.Model):
  309. details = models.CharField(max_length=100)
  310. plot = models.OneToOneField(Plot)
  311. def __str__(self):
  312. return self.details
  313. @python_2_unicode_compatible
  314. class SecretHideout(models.Model):
  315. """ Secret! Not registered with the admin! """
  316. location = models.CharField(max_length=100)
  317. villain = models.ForeignKey(Villain)
  318. def __str__(self):
  319. return self.location
  320. @python_2_unicode_compatible
  321. class SuperSecretHideout(models.Model):
  322. """ Secret! Not registered with the admin! """
  323. location = models.CharField(max_length=100)
  324. supervillain = models.ForeignKey(SuperVillain)
  325. def __str__(self):
  326. return self.location
  327. @python_2_unicode_compatible
  328. class CyclicOne(models.Model):
  329. name = models.CharField(max_length=25)
  330. two = models.ForeignKey('CyclicTwo')
  331. def __str__(self):
  332. return self.name
  333. @python_2_unicode_compatible
  334. class CyclicTwo(models.Model):
  335. name = models.CharField(max_length=25)
  336. one = models.ForeignKey(CyclicOne)
  337. def __str__(self):
  338. return self.name
  339. class Topping(models.Model):
  340. name = models.CharField(max_length=20)
  341. class Pizza(models.Model):
  342. name = models.CharField(max_length=20)
  343. toppings = models.ManyToManyField('Topping', related_name='pizzas')
  344. class Album(models.Model):
  345. owner = models.ForeignKey(User)
  346. title = models.CharField(max_length=30)
  347. class Employee(Person):
  348. code = models.CharField(max_length=20)
  349. class WorkHour(models.Model):
  350. datum = models.DateField()
  351. employee = models.ForeignKey(Employee)
  352. class Question(models.Model):
  353. question = models.CharField(max_length=20)
  354. @python_2_unicode_compatible
  355. class Answer(models.Model):
  356. question = models.ForeignKey(Question, on_delete=models.PROTECT)
  357. answer = models.CharField(max_length=20)
  358. def __str__(self):
  359. return self.answer
  360. class Reservation(models.Model):
  361. start_date = models.DateTimeField()
  362. price = models.IntegerField()
  363. DRIVER_CHOICES = (
  364. ('bill', 'Bill G'),
  365. ('steve', 'Steve J'),
  366. )
  367. RESTAURANT_CHOICES = (
  368. ('indian', 'A Taste of India'),
  369. ('thai', 'Thai Pography'),
  370. ('pizza', 'Pizza Mama'),
  371. )
  372. class FoodDelivery(models.Model):
  373. reference = models.CharField(max_length=100)
  374. driver = models.CharField(max_length=100, choices=DRIVER_CHOICES, blank=True)
  375. restaurant = models.CharField(max_length=100, choices=RESTAURANT_CHOICES, blank=True)
  376. class Meta:
  377. unique_together = (("driver", "restaurant"),)
  378. @python_2_unicode_compatible
  379. class CoverLetter(models.Model):
  380. author = models.CharField(max_length=30)
  381. date_written = models.DateField(null=True, blank=True)
  382. def __str__(self):
  383. return self.author
  384. class Paper(models.Model):
  385. title = models.CharField(max_length=30)
  386. author = models.CharField(max_length=30, blank=True, null=True)
  387. class ShortMessage(models.Model):
  388. content = models.CharField(max_length=140)
  389. timestamp = models.DateTimeField(null=True, blank=True)
  390. @python_2_unicode_compatible
  391. class Telegram(models.Model):
  392. title = models.CharField(max_length=30)
  393. date_sent = models.DateField(null=True, blank=True)
  394. def __str__(self):
  395. return self.title
  396. class Story(models.Model):
  397. title = models.CharField(max_length=100)
  398. content = models.TextField()
  399. class OtherStory(models.Model):
  400. title = models.CharField(max_length=100)
  401. content = models.TextField()
  402. class ComplexSortedPerson(models.Model):
  403. name = models.CharField(max_length=100)
  404. age = models.PositiveIntegerField()
  405. is_employee = models.NullBooleanField()
  406. class PluggableSearchPerson(models.Model):
  407. name = models.CharField(max_length=100)
  408. age = models.PositiveIntegerField()
  409. class PrePopulatedPostLargeSlug(models.Model):
  410. """
  411. Regression test for #15938: a large max_length for the slugfield must not
  412. be localized in prepopulated_fields_js.html or it might end up breaking
  413. the javascript (ie, using THOUSAND_SEPARATOR ends up with maxLength=1,000)
  414. """
  415. title = models.CharField(max_length=100)
  416. published = models.BooleanField(default=False)
  417. slug = models.SlugField(max_length=1000)
  418. class AdminOrderedField(models.Model):
  419. order = models.IntegerField()
  420. stuff = models.CharField(max_length=200)
  421. class AdminOrderedModelMethod(models.Model):
  422. order = models.IntegerField()
  423. stuff = models.CharField(max_length=200)
  424. def some_order(self):
  425. return self.order
  426. some_order.admin_order_field = 'order'
  427. class AdminOrderedAdminMethod(models.Model):
  428. order = models.IntegerField()
  429. stuff = models.CharField(max_length=200)
  430. class AdminOrderedCallable(models.Model):
  431. order = models.IntegerField()
  432. stuff = models.CharField(max_length=200)
  433. @python_2_unicode_compatible
  434. class Report(models.Model):
  435. title = models.CharField(max_length=100)
  436. def __str__(self):
  437. return self.title
  438. class MainPrepopulated(models.Model):
  439. name = models.CharField(max_length=100)
  440. pubdate = models.DateField()
  441. status = models.CharField(
  442. max_length=20,
  443. choices=(('option one', 'Option One'),
  444. ('option two', 'Option Two')))
  445. slug1 = models.SlugField(blank=True)
  446. slug2 = models.SlugField(blank=True)
  447. class RelatedPrepopulated(models.Model):
  448. parent = models.ForeignKey(MainPrepopulated)
  449. name = models.CharField(max_length=75)
  450. pubdate = models.DateField()
  451. status = models.CharField(
  452. max_length=20,
  453. choices=(('option one', 'Option One'),
  454. ('option two', 'Option Two')))
  455. slug1 = models.SlugField(max_length=50)
  456. slug2 = models.SlugField(max_length=60)
  457. class UnorderedObject(models.Model):
  458. """
  459. Model without any defined `Meta.ordering`.
  460. Refs #16819.
  461. """
  462. name = models.CharField(max_length=255)
  463. bool = models.BooleanField(default=True)
  464. class UndeletableObject(models.Model):
  465. """
  466. Model whose show_delete in admin change_view has been disabled
  467. Refs #10057.
  468. """
  469. name = models.CharField(max_length=255)
  470. class UnchangeableObject(models.Model):
  471. """
  472. Model whose change_view is disabled in admin
  473. Refs #20640.
  474. """
  475. class UserMessenger(models.Model):
  476. """
  477. Dummy class for testing message_user functions on ModelAdmin
  478. """
  479. class Simple(models.Model):
  480. """
  481. Simple model with nothing on it for use in testing
  482. """
  483. class Choice(models.Model):
  484. choice = models.IntegerField(blank=True, null=True,
  485. choices=((1, 'Yes'), (0, 'No'), (None, 'No opinion')))
  486. class _Manager(models.Manager):
  487. def get_queryset(self):
  488. return super(_Manager, self).get_queryset().filter(pk__gt=1)
  489. class FilteredManager(models.Model):
  490. def __str__(self):
  491. return "PK=%d" % self.pk
  492. pk_gt_1 = _Manager()
  493. objects = models.Manager()
  494. class EmptyModelVisible(models.Model):
  495. """ See ticket #11277. """
  496. class EmptyModelHidden(models.Model):
  497. """ See ticket #11277. """
  498. class EmptyModelMixin(models.Model):
  499. """ See ticket #11277. """