2014-02-02 03:23:31 +08:00
|
|
|
import datetime
|
2011-11-14 03:05:02 +08:00
|
|
|
import os
|
2008-01-18 02:03:21 +08:00
|
|
|
import tempfile
|
2015-08-07 05:43:55 +08:00
|
|
|
import uuid
|
2008-01-18 02:03:21 +08:00
|
|
|
|
2013-06-06 02:55:05 +08:00
|
|
|
from django.core import validators
|
2014-03-21 22:54:53 +08:00
|
|
|
from django.core.exceptions import ValidationError
|
2008-08-09 04:59:02 +08:00
|
|
|
from django.core.files.storage import FileSystemStorage
|
2011-10-14 02:04:12 +08:00
|
|
|
from django.db import models
|
2008-08-09 04:59:02 +08:00
|
|
|
|
2015-02-22 01:56:36 +08:00
|
|
|
temp_storage_dir = tempfile.mkdtemp()
|
2008-10-11 06:13:16 +08:00
|
|
|
temp_storage = FileSystemStorage(temp_storage_dir)
|
2006-12-15 13:46:11 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
class Person(models.Model):
|
|
|
|
name = models.CharField(max_length=100)
|
|
|
|
|
|
|
|
|
2006-12-15 13:46:11 +08:00
|
|
|
class Category(models.Model):
|
2007-08-05 13:14:46 +08:00
|
|
|
name = models.CharField(max_length=20)
|
2007-09-08 13:09:39 +08:00
|
|
|
slug = models.SlugField(max_length=20)
|
2007-08-05 13:14:46 +08:00
|
|
|
url = models.CharField("The URL", max_length=40)
|
2006-12-15 13:46:11 +08:00
|
|
|
|
2022-04-14 18:54:27 +08:00
|
|
|
class Meta:
|
|
|
|
ordering = ("pk",)
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2006-12-15 13:46:11 +08:00
|
|
|
return self.name
|
|
|
|
|
2012-08-15 05:38:35 +08:00
|
|
|
def __repr__(self):
|
|
|
|
return self.__str__()
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2020-06-25 16:28:52 +08:00
|
|
|
class WriterManager(models.Manager):
|
|
|
|
def get_queryset(self):
|
|
|
|
qs = super().get_queryset()
|
|
|
|
return qs.filter(archived=False)
|
|
|
|
|
|
|
|
|
2013-06-10 18:22:40 +08:00
|
|
|
class Writer(models.Model):
|
|
|
|
name = models.CharField(max_length=50, help_text="Use both first and last names.")
|
2020-06-25 16:28:52 +08:00
|
|
|
archived = models.BooleanField(default=False, editable=False)
|
|
|
|
|
|
|
|
objects = WriterManager()
|
2013-06-10 18:22:40 +08:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
ordering = ("name",)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2006-12-15 13:46:11 +08:00
|
|
|
class Article(models.Model):
|
2018-12-10 22:28:49 +08:00
|
|
|
ARTICLE_STATUS = (
|
|
|
|
(1, "Draft"),
|
|
|
|
(2, "Pending"),
|
|
|
|
(3, "Live"),
|
|
|
|
)
|
2007-08-05 13:14:46 +08:00
|
|
|
headline = models.CharField(max_length=50)
|
2007-09-08 13:09:39 +08:00
|
|
|
slug = models.SlugField()
|
2006-12-30 08:12:02 +08:00
|
|
|
pub_date = models.DateField()
|
2007-02-20 10:59:16 +08:00
|
|
|
created = models.DateField(editable=False)
|
2015-07-22 22:43:21 +08:00
|
|
|
writer = models.ForeignKey(Writer, models.CASCADE)
|
2007-01-11 07:34:37 +08:00
|
|
|
article = models.TextField()
|
2006-12-28 10:34:53 +08:00
|
|
|
categories = models.ManyToManyField(Category, blank=True)
|
2008-09-02 03:20:03 +08:00
|
|
|
status = models.PositiveIntegerField(choices=ARTICLE_STATUS, blank=True, null=True)
|
2006-12-15 13:46:11 +08:00
|
|
|
|
2014-03-14 16:44:56 +08:00
|
|
|
def save(self, *args, **kwargs):
|
2007-02-20 10:59:16 +08:00
|
|
|
if not self.id:
|
|
|
|
self.created = datetime.date.today()
|
2017-01-21 21:13:44 +08:00
|
|
|
return super().save(*args, **kwargs)
|
2007-02-20 10:59:16 +08:00
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2006-12-15 13:46:11 +08:00
|
|
|
return self.headline
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2008-08-23 03:27:26 +08:00
|
|
|
class ImprovedArticle(models.Model):
|
2015-07-22 22:43:21 +08:00
|
|
|
article = models.OneToOneField(Article, models.CASCADE)
|
2008-08-23 03:27:26 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2008-08-23 03:27:26 +08:00
|
|
|
class ImprovedArticleWithParentLink(models.Model):
|
2015-07-22 22:43:21 +08:00
|
|
|
article = models.OneToOneField(Article, models.CASCADE, parent_link=True)
|
2008-08-23 03:27:26 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2013-06-10 18:22:40 +08:00
|
|
|
class BetterWriter(Writer):
|
2010-01-05 11:56:19 +08:00
|
|
|
score = models.IntegerField()
|
2008-08-25 11:51:25 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
class Publication(models.Model):
|
|
|
|
title = models.CharField(max_length=30)
|
|
|
|
date_published = models.DateField()
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.title
|
|
|
|
|
|
|
|
|
2015-03-05 03:19:02 +08:00
|
|
|
def default_mode():
|
|
|
|
return "di"
|
|
|
|
|
|
|
|
|
|
|
|
def default_category():
|
|
|
|
return 3
|
|
|
|
|
|
|
|
|
|
|
|
class PublicationDefaults(models.Model):
|
|
|
|
MODE_CHOICES = (("di", "direct"), ("de", "delayed"))
|
|
|
|
CATEGORY_CHOICES = ((1, "Games"), (2, "Comics"), (3, "Novel"))
|
|
|
|
title = models.CharField(max_length=30)
|
|
|
|
date_published = models.DateField(default=datetime.date.today)
|
2016-09-07 05:41:54 +08:00
|
|
|
datetime_published = models.DateTimeField(default=datetime.datetime(2000, 1, 1))
|
2015-03-05 03:19:02 +08:00
|
|
|
mode = models.CharField(max_length=2, choices=MODE_CHOICES, default=default_mode)
|
|
|
|
category = models.IntegerField(choices=CATEGORY_CHOICES, default=default_category)
|
2016-08-12 03:18:48 +08:00
|
|
|
active = models.BooleanField(default=True)
|
2016-09-07 05:41:54 +08:00
|
|
|
file = models.FileField(default="default.txt")
|
2015-03-05 03:19:02 +08:00
|
|
|
|
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
class Author(models.Model):
|
2015-07-22 22:43:21 +08:00
|
|
|
publication = models.OneToOneField(
|
|
|
|
Publication, models.SET_NULL, null=True, blank=True
|
|
|
|
)
|
2014-03-14 22:18:08 +08:00
|
|
|
full_name = models.CharField(max_length=255)
|
|
|
|
|
|
|
|
|
|
|
|
class Author1(models.Model):
|
2016-03-18 22:24:29 +08:00
|
|
|
publication = models.OneToOneField(Publication, models.CASCADE, null=False)
|
2014-03-14 22:18:08 +08:00
|
|
|
full_name = models.CharField(max_length=255)
|
|
|
|
|
|
|
|
|
2013-06-10 18:22:40 +08:00
|
|
|
class WriterProfile(models.Model):
|
2015-07-22 22:43:21 +08:00
|
|
|
writer = models.OneToOneField(Writer, models.CASCADE, primary_key=True)
|
2008-08-31 17:49:55 +08:00
|
|
|
age = models.PositiveIntegerField()
|
2008-09-02 06:43:38 +08:00
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2008-08-31 17:49:55 +08:00
|
|
|
return "%s is %s" % (self.writer, self.age)
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
class Document(models.Model):
|
|
|
|
myfile = models.FileField(upload_to="unused", blank=True)
|
|
|
|
|
|
|
|
|
2008-01-18 02:03:21 +08:00
|
|
|
class TextFile(models.Model):
|
|
|
|
description = models.CharField(max_length=20)
|
2009-03-31 06:52:16 +08:00
|
|
|
file = models.FileField(storage=temp_storage, upload_to="tests", max_length=15)
|
2008-01-18 02:03:21 +08:00
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2008-01-18 02:03:21 +08:00
|
|
|
return self.description
|
2008-02-14 20:56:49 +08:00
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
|
|
|
|
class CustomFileField(models.FileField):
|
|
|
|
def save_form_data(self, instance, data):
|
|
|
|
been_here = getattr(self, "been_saved", False)
|
|
|
|
assert not been_here, "save_form_data called more than once"
|
|
|
|
setattr(self, "been_saved", True)
|
|
|
|
|
|
|
|
|
|
|
|
class CustomFF(models.Model):
|
|
|
|
f = CustomFileField(upload_to="unused", blank=True)
|
|
|
|
|
|
|
|
|
|
|
|
class FilePathModel(models.Model):
|
2018-02-28 23:24:19 +08:00
|
|
|
path = models.FilePathField(
|
|
|
|
path=os.path.dirname(__file__), match="models.py", blank=True
|
|
|
|
)
|
2014-03-14 22:18:08 +08:00
|
|
|
|
|
|
|
|
2009-02-17 02:34:28 +08:00
|
|
|
try:
|
2014-03-21 22:54:53 +08:00
|
|
|
from PIL import Image # NOQA: detect if Pillow is installed
|
2010-03-17 03:32:11 +08:00
|
|
|
|
2009-02-17 02:34:28 +08:00
|
|
|
test_images = True
|
2009-03-15 13:05:26 +08:00
|
|
|
|
2009-02-17 02:34:28 +08:00
|
|
|
class ImageFile(models.Model):
|
|
|
|
def custom_upload_path(self, filename):
|
|
|
|
path = self.path or "tests"
|
|
|
|
return "%s/%s" % (path, filename)
|
2009-03-15 13:05:26 +08:00
|
|
|
|
2009-02-17 02:34:28 +08:00
|
|
|
description = models.CharField(max_length=20)
|
2009-05-11 17:57:19 +08:00
|
|
|
|
|
|
|
# Deliberately put the image field *after* the width/height fields to
|
|
|
|
# trigger the bug in #10404 with width/height not getting assigned.
|
2009-02-17 02:34:28 +08:00
|
|
|
width = models.IntegerField(editable=False)
|
|
|
|
height = models.IntegerField(editable=False)
|
2009-05-11 17:57:19 +08:00
|
|
|
image = models.ImageField(
|
|
|
|
storage=temp_storage,
|
|
|
|
upload_to=custom_upload_path,
|
|
|
|
width_field="width",
|
|
|
|
height_field="height",
|
|
|
|
)
|
2009-02-17 02:34:28 +08:00
|
|
|
path = models.CharField(max_length=16, blank=True, default="")
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2009-02-17 02:34:28 +08:00
|
|
|
return self.description
|
2009-03-15 13:05:26 +08:00
|
|
|
|
2009-02-17 02:34:28 +08:00
|
|
|
class OptionalImageFile(models.Model):
|
|
|
|
def custom_upload_path(self, filename):
|
|
|
|
path = self.path or "tests"
|
|
|
|
return "%s/%s" % (path, filename)
|
2009-03-15 13:05:26 +08:00
|
|
|
|
2009-02-17 02:34:28 +08:00
|
|
|
description = models.CharField(max_length=20)
|
|
|
|
image = models.ImageField(
|
|
|
|
storage=temp_storage,
|
|
|
|
upload_to=custom_upload_path,
|
2009-03-15 13:05:26 +08:00
|
|
|
width_field="width",
|
|
|
|
height_field="height",
|
2009-02-17 02:34:28 +08:00
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
)
|
|
|
|
width = models.IntegerField(editable=False, null=True)
|
|
|
|
height = models.IntegerField(editable=False, null=True)
|
|
|
|
path = models.CharField(max_length=16, blank=True, default="")
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2009-02-17 02:34:28 +08:00
|
|
|
return self.description
|
2017-05-28 15:05:21 +08:00
|
|
|
|
|
|
|
class NoExtensionImageFile(models.Model):
|
|
|
|
def upload_to(self, filename):
|
|
|
|
return "tests/no_extension"
|
|
|
|
|
|
|
|
description = models.CharField(max_length=20)
|
|
|
|
image = models.ImageField(storage=temp_storage, upload_to=upload_to)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.description
|
|
|
|
|
2014-03-21 22:54:53 +08:00
|
|
|
except ImportError:
|
2009-02-17 02:34:28 +08:00
|
|
|
test_images = False
|
2009-03-15 13:05:26 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
class Homepage(models.Model):
|
|
|
|
url = models.URLField()
|
|
|
|
|
|
|
|
|
2008-09-02 03:08:08 +08:00
|
|
|
class Product(models.Model):
|
|
|
|
slug = models.SlugField(unique=True)
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2008-09-02 03:08:08 +08:00
|
|
|
return self.slug
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2008-09-02 03:08:08 +08:00
|
|
|
class Price(models.Model):
|
|
|
|
price = models.DecimalField(max_digits=10, decimal_places=2)
|
|
|
|
quantity = models.PositiveIntegerField()
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
unique_together = (("price", "quantity"),)
|
|
|
|
|
2018-12-28 08:34:14 +08:00
|
|
|
def __str__(self):
|
|
|
|
return "%s for %s" % (self.quantity, self.price)
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2014-03-14 22:18:08 +08:00
|
|
|
class Triple(models.Model):
|
|
|
|
left = models.IntegerField()
|
|
|
|
middle = models.IntegerField()
|
|
|
|
right = models.IntegerField()
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
unique_together = (("left", "middle"), ("middle", "right"))
|
|
|
|
|
|
|
|
|
2008-09-01 04:11:11 +08:00
|
|
|
class ArticleStatus(models.Model):
|
2018-12-10 22:28:49 +08:00
|
|
|
ARTICLE_STATUS_CHAR = (
|
|
|
|
("d", "Draft"),
|
|
|
|
("p", "Pending"),
|
|
|
|
("l", "Live"),
|
2022-02-04 03:24:19 +08:00
|
|
|
)
|
2008-09-01 04:11:11 +08:00
|
|
|
status = models.CharField(
|
|
|
|
max_length=2, choices=ARTICLE_STATUS_CHAR, blank=True, null=True
|
2018-12-10 22:28:49 +08:00
|
|
|
)
|
2008-09-01 04:11:11 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2008-09-02 06:43:38 +08:00
|
|
|
class Inventory(models.Model):
|
2011-03-04 09:27:14 +08:00
|
|
|
barcode = models.PositiveIntegerField(unique=True)
|
2015-07-22 22:43:21 +08:00
|
|
|
parent = models.ForeignKey(
|
|
|
|
"self", models.SET_NULL, to_field="barcode", blank=True, null=True
|
|
|
|
)
|
2011-03-04 09:27:14 +08:00
|
|
|
name = models.CharField(blank=False, max_length=20)
|
2008-09-02 03:08:08 +08:00
|
|
|
|
2011-03-04 09:27:14 +08:00
|
|
|
class Meta:
|
|
|
|
ordering = ("name",)
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2011-03-04 09:27:14 +08:00
|
|
|
return self.name
|
2008-10-21 22:04:24 +08:00
|
|
|
|
2012-08-15 05:38:35 +08:00
|
|
|
def __repr__(self):
|
|
|
|
return self.__str__()
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2013-06-10 18:22:40 +08:00
|
|
|
class Book(models.Model):
|
|
|
|
title = models.CharField(max_length=40)
|
2015-07-22 22:43:21 +08:00
|
|
|
author = models.ForeignKey(Writer, models.SET_NULL, blank=True, null=True)
|
2013-06-10 18:22:40 +08:00
|
|
|
special_id = models.IntegerField(blank=True, null=True, unique=True)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
unique_together = ("title", "author")
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2010-03-17 03:32:11 +08:00
|
|
|
class BookXtra(models.Model):
|
|
|
|
isbn = models.CharField(max_length=16, unique=True)
|
|
|
|
suffix1 = models.IntegerField(blank=True, default=0)
|
|
|
|
suffix2 = models.IntegerField(blank=True, default=0)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
unique_together = ("suffix1", "suffix2")
|
|
|
|
abstract = True
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2010-03-17 03:32:11 +08:00
|
|
|
class DerivedBook(Book, BookXtra):
|
|
|
|
pass
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2008-11-06 03:47:44 +08:00
|
|
|
class ExplicitPK(models.Model):
|
|
|
|
key = models.CharField(max_length=20, primary_key=True)
|
|
|
|
desc = models.CharField(max_length=20, blank=True, unique=True)
|
2013-10-22 18:21:07 +08:00
|
|
|
|
2008-11-06 03:47:44 +08:00
|
|
|
class Meta:
|
|
|
|
unique_together = ("key", "desc")
|
2009-03-15 13:05:26 +08:00
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2008-11-06 03:47:44 +08:00
|
|
|
return self.key
|
2008-10-21 22:04:24 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2009-04-30 21:47:39 +08:00
|
|
|
class Post(models.Model):
|
|
|
|
title = models.CharField(max_length=50, unique_for_date="posted", blank=True)
|
|
|
|
slug = models.CharField(max_length=50, unique_for_year="posted", blank=True)
|
|
|
|
subtitle = models.CharField(max_length=50, unique_for_month="posted", blank=True)
|
|
|
|
posted = models.DateField()
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2013-05-28 21:56:14 +08:00
|
|
|
return self.title
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2013-05-28 21:56:14 +08:00
|
|
|
class DateTimePost(models.Model):
|
|
|
|
title = models.CharField(max_length=50, unique_for_date="posted", blank=True)
|
|
|
|
slug = models.CharField(max_length=50, unique_for_year="posted", blank=True)
|
|
|
|
subtitle = models.CharField(max_length=50, unique_for_month="posted", blank=True)
|
|
|
|
posted = models.DateTimeField(editable=False)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.title
|
2009-04-30 21:47:39 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2010-03-17 03:32:11 +08:00
|
|
|
class DerivedPost(Post):
|
|
|
|
pass
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2009-12-17 23:10:38 +08:00
|
|
|
class BigInt(models.Model):
|
|
|
|
biggie = models.BigIntegerField()
|
|
|
|
|
2012-08-12 18:32:08 +08:00
|
|
|
def __str__(self):
|
2016-12-29 23:27:49 +08:00
|
|
|
return str(self.biggie)
|
2009-12-17 23:10:38 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2010-03-31 15:43:52 +08:00
|
|
|
class MarkupField(models.CharField):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
kwargs["max_length"] = 20
|
2017-01-21 21:13:44 +08:00
|
|
|
super().__init__(*args, **kwargs)
|
2010-03-31 15:43:52 +08:00
|
|
|
|
|
|
|
def formfield(self, **kwargs):
|
|
|
|
# don't allow this field to be used in form (real use-case might be
|
|
|
|
# that you know the markup will always be X, but it is among an app
|
|
|
|
# that allows the user to say it could be something else)
|
|
|
|
# regressed at r10062
|
|
|
|
return None
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2010-03-31 15:43:52 +08:00
|
|
|
class CustomFieldForExclusionModel(models.Model):
|
|
|
|
name = models.CharField(max_length=10)
|
|
|
|
markup = MarkupField()
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2011-01-09 21:26:39 +08:00
|
|
|
class FlexibleDatePost(models.Model):
|
|
|
|
title = models.CharField(max_length=50, unique_for_date="posted", blank=True)
|
|
|
|
slug = models.CharField(max_length=50, unique_for_year="posted", blank=True)
|
|
|
|
subtitle = models.CharField(max_length=50, unique_for_month="posted", blank=True)
|
2011-02-26 16:50:15 +08:00
|
|
|
posted = models.DateField(blank=True, null=True)
|
2012-12-20 02:12:08 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2012-12-20 02:12:08 +08:00
|
|
|
class Colour(models.Model):
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
|
|
|
|
def __iter__(self):
|
2017-02-24 09:06:01 +08:00
|
|
|
yield from range(5)
|
2012-12-20 02:12:08 +08:00
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2012-12-20 02:12:08 +08:00
|
|
|
class ColourfulItem(models.Model):
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
colours = models.ManyToManyField(Colour)
|
2013-05-22 05:32:39 +08:00
|
|
|
|
2013-11-03 12:36:09 +08:00
|
|
|
|
2013-06-06 02:55:05 +08:00
|
|
|
class CustomErrorMessage(models.Model):
|
2016-04-08 10:04:45 +08:00
|
|
|
name1 = models.CharField(
|
|
|
|
max_length=50,
|
2013-06-06 02:55:05 +08:00
|
|
|
validators=[validators.validate_slug],
|
2016-04-08 10:04:45 +08:00
|
|
|
error_messages={"invalid": "Model custom error message."},
|
|
|
|
)
|
|
|
|
name2 = models.CharField(
|
|
|
|
max_length=50,
|
2013-06-06 02:55:05 +08:00
|
|
|
validators=[validators.validate_slug],
|
2016-04-08 10:04:45 +08:00
|
|
|
error_messages={"invalid": "Model custom error message."},
|
|
|
|
)
|
2013-08-06 03:26:51 +08:00
|
|
|
|
|
|
|
def clean(self):
|
|
|
|
if self.name1 == "FORBIDDEN_VALUE":
|
|
|
|
raise ValidationError(
|
|
|
|
{"name1": [ValidationError("Model.clean() error messages.")]}
|
|
|
|
)
|
2014-11-19 01:58:43 +08:00
|
|
|
elif self.name1 == "FORBIDDEN_VALUE2":
|
|
|
|
raise ValidationError(
|
|
|
|
{"name1": "Model.clean() error messages (simpler syntax)."}
|
|
|
|
)
|
2014-03-14 22:18:08 +08:00
|
|
|
elif self.name1 == "GLOBAL_ERROR":
|
|
|
|
raise ValidationError("Global error message.")
|
2014-02-02 03:23:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
def today_callable_dict():
|
|
|
|
return {"last_action__gte": datetime.datetime.today()}
|
|
|
|
|
|
|
|
|
|
|
|
def today_callable_q():
|
|
|
|
return models.Q(last_action__gte=datetime.datetime.today())
|
|
|
|
|
|
|
|
|
|
|
|
class Character(models.Model):
|
|
|
|
username = models.CharField(max_length=100)
|
|
|
|
last_action = models.DateTimeField()
|
|
|
|
|
2020-02-03 00:30:34 +08:00
|
|
|
def __str__(self):
|
|
|
|
return self.username
|
|
|
|
|
2014-02-02 03:23:31 +08:00
|
|
|
|
|
|
|
class StumpJoke(models.Model):
|
2015-07-22 22:43:21 +08:00
|
|
|
most_recently_fooled = models.ForeignKey(
|
|
|
|
Character,
|
|
|
|
models.CASCADE,
|
|
|
|
limit_choices_to=today_callable_dict,
|
2020-08-17 11:39:10 +08:00
|
|
|
related_name="jokes",
|
2015-07-22 22:43:21 +08:00
|
|
|
)
|
2020-08-17 11:39:10 +08:00
|
|
|
has_fooled_today = models.ManyToManyField(
|
|
|
|
Character,
|
|
|
|
limit_choices_to=today_callable_q,
|
|
|
|
related_name="jokes_today",
|
|
|
|
)
|
|
|
|
funny = models.BooleanField(default=False)
|
2014-06-03 11:36:59 +08:00
|
|
|
|
|
|
|
|
|
|
|
# Model for #13776
|
|
|
|
class Student(models.Model):
|
2015-07-22 22:43:21 +08:00
|
|
|
character = models.ForeignKey(Character, models.CASCADE)
|
2014-06-03 11:36:59 +08:00
|
|
|
study = models.CharField(max_length=30)
|
2014-07-26 09:23:01 +08:00
|
|
|
|
|
|
|
|
|
|
|
# Model for #639
|
|
|
|
class Photo(models.Model):
|
|
|
|
title = models.CharField(max_length=30)
|
|
|
|
image = models.FileField(storage=temp_storage, upload_to="tests")
|
|
|
|
|
|
|
|
# Support code for the tests; this keeps track of how many times save()
|
|
|
|
# gets called on each instance.
|
|
|
|
def __init__(self, *args, **kwargs):
|
2017-01-21 21:13:44 +08:00
|
|
|
super().__init__(*args, **kwargs)
|
2014-07-26 09:23:01 +08:00
|
|
|
self._savecount = 0
|
|
|
|
|
|
|
|
def save(self, force_insert=False, force_update=False):
|
2017-01-21 21:13:44 +08:00
|
|
|
super().save(force_insert, force_update)
|
2014-07-26 09:23:01 +08:00
|
|
|
self._savecount += 1
|
2015-08-07 05:43:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
class UUIDPK(models.Model):
|
|
|
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
|
|
name = models.CharField(max_length=30)
|
2015-04-30 15:57:30 +08:00
|
|
|
|
|
|
|
|
|
|
|
# Models for #24706
|
|
|
|
class StrictAssignmentFieldSpecific(models.Model):
|
|
|
|
title = models.CharField(max_length=30)
|
|
|
|
_should_error = False
|
|
|
|
|
|
|
|
def __setattr__(self, key, value):
|
|
|
|
if self._should_error is True:
|
|
|
|
raise ValidationError(message={key: "Cannot set attribute"}, code="invalid")
|
2017-01-21 21:13:44 +08:00
|
|
|
super().__setattr__(key, value)
|
2015-04-30 15:57:30 +08:00
|
|
|
|
|
|
|
|
|
|
|
class StrictAssignmentAll(models.Model):
|
|
|
|
title = models.CharField(max_length=30)
|
|
|
|
_should_error = False
|
|
|
|
|
|
|
|
def __setattr__(self, key, value):
|
|
|
|
if self._should_error is True:
|
|
|
|
raise ValidationError(message="Cannot set attribute", code="invalid")
|
2017-01-21 21:13:44 +08:00
|
|
|
super().__setattr__(key, value)
|
2015-11-15 00:38:27 +08:00
|
|
|
|
|
|
|
|
|
|
|
# A model with ForeignKey(blank=False, null=True)
|
|
|
|
class Award(models.Model):
|
|
|
|
name = models.CharField(max_length=30)
|
|
|
|
character = models.ForeignKey(Character, models.SET_NULL, blank=False, null=True)
|
2016-05-18 22:30:42 +08:00
|
|
|
|
|
|
|
|
|
|
|
class NullableUniqueCharFieldModel(models.Model):
|
|
|
|
codename = models.CharField(max_length=50, blank=True, null=True, unique=True)
|
2020-09-25 18:10:45 +08:00
|
|
|
email = models.EmailField(blank=True, null=True)
|
|
|
|
slug = models.SlugField(blank=True, null=True)
|
|
|
|
url = models.URLField(blank=True, null=True)
|
2021-09-08 19:57:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
class Number(models.Model):
|
|
|
|
value = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class NumbersToDice(models.Model):
|
|
|
|
number = models.ForeignKey("Number", on_delete=models.CASCADE)
|
|
|
|
die = models.ForeignKey("Dice", on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
|
|
|
|
class Dice(models.Model):
|
|
|
|
numbers = models.ManyToManyField(
|
|
|
|
Number,
|
|
|
|
through=NumbersToDice,
|
|
|
|
limit_choices_to=models.Q(value__gte=1),
|
|
|
|
)
|