2009-07-02 18:03:02 +00:00
|
|
|
from django.db import models
|
2010-04-15 02:53:55 +00:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2009-07-02 18:03:02 +00:00
|
|
|
|
2013-02-19 00:21:14 +00:00
|
|
|
from model_utils.models import TimeStampedModel, StatusModel, TimeFramedModel
|
|
|
|
|
from model_utils.tracker import ModelTracker
|
2013-01-27 22:16:58 +00:00
|
|
|
from model_utils.managers import QueryManager, InheritanceManager, PassThroughManager
|
2010-04-16 03:47:28 +00:00
|
|
|
from model_utils.fields import SplitField, MonitorField
|
2010-04-15 18:00:44 +00:00
|
|
|
from model_utils import Choices
|
2009-07-02 18:03:02 +00:00
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class InheritanceManagerTestRelated(models.Model):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-11-23 17:48:23 +00:00
|
|
|
class InheritanceManagerTestParent(models.Model):
|
2011-04-16 21:19:55 +00:00
|
|
|
# FileField is just a handy descriptor-using field. Refs #6.
|
|
|
|
|
non_related_field_using_descriptor = models.FileField(upload_to="test")
|
|
|
|
|
related = models.ForeignKey(
|
|
|
|
|
InheritanceManagerTestRelated, related_name="imtests", null=True)
|
2011-03-29 16:47:25 +00:00
|
|
|
normal_field = models.TextField()
|
2010-11-23 17:48:23 +00:00
|
|
|
objects = InheritanceManager()
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-11-23 17:48:23 +00:00
|
|
|
class InheritanceManagerTestChild1(InheritanceManagerTestParent):
|
2011-04-16 21:19:55 +00:00
|
|
|
non_related_field_using_descriptor_2 = models.FileField(upload_to="test")
|
2011-03-29 16:47:25 +00:00
|
|
|
normal_field_2 = models.TextField()
|
2010-11-23 17:48:23 +00:00
|
|
|
pass
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
2013-02-02 05:38:14 +00:00
|
|
|
class InheritanceManagerTestGrandChild1(InheritanceManagerTestChild1):
|
|
|
|
|
text_field = models.TextField()
|
2013-01-31 14:27:16 +00:00
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
2010-11-23 17:48:23 +00:00
|
|
|
class InheritanceManagerTestChild2(InheritanceManagerTestParent):
|
2011-04-16 21:19:55 +00:00
|
|
|
non_related_field_using_descriptor_2 = models.FileField(upload_to="test")
|
2011-03-29 16:47:25 +00:00
|
|
|
normal_field_2 = models.TextField()
|
2010-11-23 17:48:23 +00:00
|
|
|
pass
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2009-07-02 20:14:29 +00:00
|
|
|
class TimeStamp(TimeStampedModel):
|
|
|
|
|
pass
|
2009-07-30 21:11:36 +00:00
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-04-15 02:53:55 +00:00
|
|
|
class TimeFrame(TimeFramedModel):
|
|
|
|
|
pass
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-04-26 20:30:01 +00:00
|
|
|
class TimeFrameManagerAdded(TimeFramedModel):
|
|
|
|
|
pass
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-04-16 03:47:28 +00:00
|
|
|
class Monitored(models.Model):
|
|
|
|
|
name = models.CharField(max_length=25)
|
2011-04-16 21:19:55 +00:00
|
|
|
name_changed = MonitorField(monitor="name")
|
|
|
|
|
|
|
|
|
|
|
2010-04-16 03:47:28 +00:00
|
|
|
|
2010-04-15 18:00:44 +00:00
|
|
|
class Status(StatusModel):
|
|
|
|
|
STATUS = Choices(
|
2011-04-16 21:19:55 +00:00
|
|
|
("active", _("active")),
|
|
|
|
|
("deleted", _("deleted")),
|
|
|
|
|
("on_hold", _("on hold")),
|
2010-04-15 02:53:55 +00:00
|
|
|
)
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-04-16 03:59:05 +00:00
|
|
|
class StatusPlainTuple(StatusModel):
|
2010-04-15 22:12:08 +00:00
|
|
|
STATUS = (
|
2011-04-16 21:19:55 +00:00
|
|
|
("active", _("active")),
|
|
|
|
|
("deleted", _("deleted")),
|
|
|
|
|
("on_hold", _("on hold")),
|
2010-04-15 22:12:08 +00:00
|
|
|
)
|
2010-04-15 18:00:44 +00:00
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-04-26 20:30:01 +00:00
|
|
|
class StatusManagerAdded(StatusModel):
|
|
|
|
|
STATUS = (
|
2011-04-16 21:19:55 +00:00
|
|
|
("active", _("active")),
|
|
|
|
|
("deleted", _("deleted")),
|
|
|
|
|
("on_hold", _("on hold")),
|
2010-04-26 20:30:01 +00:00
|
|
|
)
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2009-07-30 21:11:36 +00:00
|
|
|
class Post(models.Model):
|
|
|
|
|
published = models.BooleanField()
|
|
|
|
|
confirmed = models.BooleanField()
|
|
|
|
|
order = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
objects = models.Manager()
|
|
|
|
|
public = QueryManager(published=True)
|
|
|
|
|
public_confirmed = QueryManager(models.Q(published=True) &
|
|
|
|
|
models.Q(confirmed=True))
|
2011-04-16 21:19:55 +00:00
|
|
|
public_reversed = QueryManager(published=True).order_by("-order")
|
2009-07-30 21:11:36 +00:00
|
|
|
|
|
|
|
|
class Meta:
|
2011-04-16 21:19:55 +00:00
|
|
|
ordering = ("order",)
|
|
|
|
|
|
|
|
|
|
|
2010-01-15 22:26:59 +00:00
|
|
|
|
|
|
|
|
class Article(models.Model):
|
|
|
|
|
title = models.CharField(max_length=50)
|
|
|
|
|
body = SplitField()
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2011-04-29 01:59:52 +00:00
|
|
|
class SplitFieldAbstractParent(models.Model):
|
|
|
|
|
content = SplitField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-01-31 15:54:36 +00:00
|
|
|
class NoRendered(models.Model):
|
|
|
|
|
"""
|
|
|
|
|
Test that the no_excerpt_field keyword arg works. This arg should
|
|
|
|
|
never be used except by the South model-freezing.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
body = SplitField(no_excerpt_field=True)
|
2010-07-31 02:09:46 +00:00
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-07-31 02:09:46 +00:00
|
|
|
class AuthorMixin(object):
|
|
|
|
|
def by_author(self, name):
|
|
|
|
|
return self.filter(author=name)
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-07-31 02:09:46 +00:00
|
|
|
class PublishedMixin(object):
|
|
|
|
|
def published(self):
|
|
|
|
|
return self.filter(published=True)
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-07-31 02:09:46 +00:00
|
|
|
def unpublished(self):
|
|
|
|
|
return self.filter(published=False)
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-08-16 21:58:16 +00:00
|
|
|
class ByAuthorQuerySet(models.query.QuerySet, AuthorMixin):
|
|
|
|
|
pass
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2010-08-16 21:58:16 +00:00
|
|
|
class FeaturedManager(models.Manager):
|
|
|
|
|
def get_query_set(self):
|
2010-09-24 14:30:58 +00:00
|
|
|
kwargs = {}
|
2011-04-16 21:19:55 +00:00
|
|
|
if hasattr(self, "_db"):
|
|
|
|
|
kwargs["using"] = self._db
|
2010-09-24 14:30:58 +00:00
|
|
|
return ByAuthorQuerySet(self.model, **kwargs).filter(feature=True)
|
2010-08-16 21:58:16 +00:00
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
class DudeQuerySet(models.query.QuerySet):
|
|
|
|
|
def abiding(self):
|
|
|
|
|
return self.filter(abides=True)
|
2011-03-29 17:10:50 +00:00
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
def rug_positive(self):
|
|
|
|
|
return self.filter(has_rug=True)
|
2011-03-29 17:10:50 +00:00
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
def rug_negative(self):
|
|
|
|
|
return self.filter(has_rug=False)
|
2011-03-29 17:10:50 +00:00
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
def by_name(self, name):
|
|
|
|
|
return self.filter(name__iexact=name)
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
class AbidingManager(PassThroughManager):
|
|
|
|
|
def get_query_set(self):
|
2011-03-30 01:57:49 +00:00
|
|
|
return DudeQuerySet(self.model).abiding()
|
2011-03-29 17:10:50 +00:00
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
def get_stats(self):
|
|
|
|
|
return {
|
2011-04-16 21:19:55 +00:00
|
|
|
"abiding_count": self.count(),
|
|
|
|
|
"rug_count": self.rug_positive().count(),
|
2011-03-09 19:44:10 +00:00
|
|
|
}
|
|
|
|
|
|
2011-04-16 21:19:55 +00:00
|
|
|
|
|
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
class Dude(models.Model):
|
|
|
|
|
abides = models.BooleanField(default=True)
|
|
|
|
|
name = models.CharField(max_length=20)
|
|
|
|
|
has_rug = models.BooleanField()
|
2011-03-29 17:10:50 +00:00
|
|
|
|
2011-03-09 19:44:10 +00:00
|
|
|
objects = PassThroughManager(DudeQuerySet)
|
|
|
|
|
abiders = AbidingManager()
|
2011-12-04 13:57:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Car(models.Model):
|
|
|
|
|
name = models.CharField(max_length=20)
|
|
|
|
|
owner = models.ForeignKey(Dude, related_name='cars_owned')
|
|
|
|
|
|
|
|
|
|
objects = PassThroughManager(DudeQuerySet)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpotQuerySet(models.query.QuerySet):
|
|
|
|
|
def closed(self):
|
|
|
|
|
return self.filter(closed=True)
|
|
|
|
|
|
|
|
|
|
def secured(self):
|
|
|
|
|
return self.filter(secure=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Spot(models.Model):
|
|
|
|
|
name = models.CharField(max_length=20)
|
|
|
|
|
secure = models.BooleanField(default=True)
|
|
|
|
|
closed = models.BooleanField(default=False)
|
|
|
|
|
owner = models.ForeignKey(Dude, related_name='spots_owned')
|
|
|
|
|
|
|
|
|
|
objects = PassThroughManager.for_queryset_class(SpotQuerySet)()
|
2013-02-16 22:52:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Tracked(models.Model):
|
|
|
|
|
name = models.CharField(max_length=20)
|
|
|
|
|
number = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
tracker = ModelTracker()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TrackedNotDefault(models.Model):
|
|
|
|
|
name = models.CharField(max_length=20)
|
|
|
|
|
number = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
name_tracker = ModelTracker(fields=['name'])
|