1from __future__ import absolute_import
2
3from django.db import models
4from django.utils.translation import ugettext_lazy as _
5
6CHOICES = ((1, "this"), (2, _("that")))
7
8
9class Person(models.Model):
10    name = models.CharField(max_length=30)
11
12
13class Pet(models.Model):
14    name = models.CharField(max_length=30)
15    age = models.PositiveIntegerField()
16
17
18class FilmDetails(models.Model):
19    location = models.CharField(max_length=30)
20    film = models.OneToOneField(
21        "Film", on_delete=models.CASCADE, related_name="details"
22    )
23
24
25class Film(models.Model):
26    genre = models.CharField(
27        max_length=2,
28        help_text="Genre",
29        choices=[("do", "Documentary"), ("ot", "Other")],
30        default="ot",
31    )
32    reporters = models.ManyToManyField("Reporter", related_name="films")
33
34
35class DoeReporterManager(models.Manager):
36    def get_queryset(self):
37        return super(DoeReporterManager, self).get_queryset().filter(last_name="Doe")
38
39
40class Reporter(models.Model):
41    first_name = models.CharField(max_length=30)
42    last_name = models.CharField(max_length=30)
43    email = models.EmailField()
44    pets = models.ManyToManyField("self")
45    a_choice = models.CharField(max_length=30, choices=CHOICES, blank=True)
46    objects = models.Manager()
47    doe_objects = DoeReporterManager()
48
49    reporter_type = models.IntegerField(
50        "Reporter Type",
51        null=True,
52        blank=True,
53        choices=[(1, u"Regular"), (2, u"CNN Reporter")],
54    )
55
56    def __str__(self):  # __unicode__ on Python 2
57        return "%s %s" % (self.first_name, self.last_name)
58
59    def __init__(self, *args, **kwargs):
60        """
61        Override the init method so that during runtime, Django
62        can know that this object can be a CNNReporter by casting
63        it to the proxy model. Otherwise, as far as Django knows,
64        when a CNNReporter is pulled from the database, it is still
65        of type Reporter. This was added to test proxy model support.
66        """
67        super(Reporter, self).__init__(*args, **kwargs)
68        if self.reporter_type == 2:  # quick and dirty way without enums
69            self.__class__ = CNNReporter
70
71    def some_method(self):
72        return 123
73
74
75class CNNReporterManager(models.Manager):
76    def get_queryset(self):
77        return super(CNNReporterManager, self).get_queryset().filter(reporter_type=2)
78
79
80class CNNReporter(Reporter):
81    """
82    This class is a proxy model for Reporter, used for testing
83    proxy model support
84    """
85
86    class Meta:
87        proxy = True
88
89    objects = CNNReporterManager()
90
91
92class Article(models.Model):
93    headline = models.CharField(max_length=100)
94    pub_date = models.DateField()
95    pub_date_time = models.DateTimeField()
96    reporter = models.ForeignKey(
97        Reporter, on_delete=models.CASCADE, related_name="articles"
98    )
99    editor = models.ForeignKey(
100        Reporter, on_delete=models.CASCADE, related_name="edited_articles_+"
101    )
102    lang = models.CharField(
103        max_length=2,
104        help_text="Language",
105        choices=[("es", "Spanish"), ("en", "English")],
106        default="es",
107    )
108    importance = models.IntegerField(
109        "Importance",
110        null=True,
111        blank=True,
112        choices=[(1, u"Very important"), (2, u"Not as important")],
113    )
114
115    def __str__(self):  # __unicode__ on Python 2
116        return self.headline
117
118    class Meta:
119        ordering = ("headline",)
120