models.py 16 KB

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