From b927bd5bc0824ac329b58486666e36be044c3406 Mon Sep 17 00:00:00 2001 From: Josh Washburne Date: Thu, 29 Mar 2018 12:13:38 -0400 Subject: [PATCH] Move common behaviors and querysets to Core. --- savepointradio/core/behaviors.py | 59 ++++++++++++++++++++++++++++++++ savepointradio/core/querysets.py | 32 +++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 savepointradio/core/querysets.py diff --git a/savepointradio/core/behaviors.py b/savepointradio/core/behaviors.py index 71486b9..72051d8 100644 --- a/savepointradio/core/behaviors.py +++ b/savepointradio/core/behaviors.py @@ -3,6 +3,65 @@ from django.utils import timezone from django.utils.translation import ugettext_lazy as _ +class Disableable(models.Model): + """ + Mixin for models that can be disabled with a specified reason. + """ + disabled = models.BooleanField(_('disabled state'), default=False) + disabled_date = models.DateTimeField(_('disabled on'), + default=None, + blank=True, + null=True) + disabled_reason = models.TextField(_('reason for disabling'), blank=True) + + class Meta: + abstract = True + + def disable(self, reason=''): + self.disabled = True + self.disabled_date = timezone.now() + self.disabled_reason = reason + self.save() + + def enable(self): + self.disabled = False + self.disabled_date = None + self.disabled_reason = '' + self.save() + + def _is_enabled(self): + return not self.disabled + _is_enabled.boolean = True + is_enabled = property(_is_enabled) + + +class Publishable(models.Model): + """ + Mixin for models that can be published to restrict accessibility before an + appointed date/time. + """ + published_date = models.DateTimeField(_('published for listening'), + default=None, + blank=True, + null=True) + + class Meta: + abstract = True + + def publish(self, date=None): + if date is None: + date = timezone.now() + self.published_date = date + self.save() + + def _is_published(self): + if self.published_date is not None: + return self.published_date < timezone.now() + return False + _is_published.boolean = True + is_published = property(_is_published) + + class Timestampable(models.Model): """ Mixin for keeping track of when an object was created and last modified. diff --git a/savepointradio/core/querysets.py b/savepointradio/core/querysets.py new file mode 100644 index 0000000..c5cd57f --- /dev/null +++ b/savepointradio/core/querysets.py @@ -0,0 +1,32 @@ +from django.db import models +from django.utils import timezone + + +class EnabledQuerySet(models.QuerySet): + """ + Queryset to select all objects that are enabled or not. + """ + def enabled(self): + return self.filter(disabled=False) + + def disabled(self): + return self.filter(disabled=True) + + +class PublishedQuerySet(models.QuerySet): + """ + Queryset to select all objects that have been published or not. + """ + def published(self): + results = self.filter( + models.Q(published_date__isnull=False) & + models.Q(published_date__lte=timezone.now()) + ) + return results + + def unpublished(self): + results = self.filter( + models.Q(published_date__isnull=True) | + models.Q(published_date__gte=timezone.now()) + ) + return results