models.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. from django.db import models
  3. from django.utils.timezone import now
  4. from django.utils.translation import gettext_lazy as _
  5. from django_extensions.db.fields import AutoSlugField, CreationDateTimeField, ModificationDateTimeField
  6. class TimeStampedModel(models.Model):
  7. """
  8. TimeStampedModel
  9. An abstract base class model that provides self-managed "created" and
  10. "modified" fields.
  11. """
  12. created = CreationDateTimeField(_('created'))
  13. modified = ModificationDateTimeField(_('modified'))
  14. def save(self, **kwargs):
  15. self.update_modified = kwargs.pop('update_modified', getattr(self, 'update_modified', True))
  16. super().save(**kwargs)
  17. class Meta:
  18. get_latest_by = 'modified'
  19. abstract = True
  20. class TitleDescriptionModel(models.Model):
  21. """
  22. TitleDescriptionModel
  23. An abstract base class model that provides title and description fields.
  24. """
  25. title = models.CharField(_('title'), max_length=255)
  26. description = models.TextField(_('description'), blank=True, null=True)
  27. class Meta:
  28. abstract = True
  29. class TitleSlugDescriptionModel(TitleDescriptionModel):
  30. """
  31. TitleSlugDescriptionModel
  32. An abstract base class model that provides title and description fields
  33. and a self-managed "slug" field that populates from the title.
  34. .. note ::
  35. If you want to use custom "slugify" function, you could
  36. define ``slugify_function`` which then will be used
  37. in :py:class:`AutoSlugField` to slugify ``populate_from`` field.
  38. See :py:class:`AutoSlugField` for more details.
  39. """
  40. slug = AutoSlugField(_('slug'), populate_from='title')
  41. class Meta:
  42. abstract = True
  43. class ActivatorQuerySet(models.query.QuerySet):
  44. """
  45. ActivatorQuerySet
  46. Query set that returns statused results
  47. """
  48. def active(self):
  49. """ Return active query set """
  50. return self.filter(status=ActivatorModel.ACTIVE_STATUS)
  51. def inactive(self):
  52. """ Return inactive query set """
  53. return self.filter(status=ActivatorModel.INACTIVE_STATUS)
  54. class ActivatorModelManager(models.Manager):
  55. """
  56. ActivatorModelManager
  57. Manager to return instances of ActivatorModel: SomeModel.objects.active() / .inactive()
  58. """
  59. def get_queryset(self):
  60. """ Use ActivatorQuerySet for all results """
  61. return ActivatorQuerySet(model=self.model, using=self._db)
  62. def active(self):
  63. """
  64. Return active instances of ActivatorModel:
  65. SomeModel.objects.active(), proxy to ActivatorQuerySet.active
  66. """
  67. return self.get_queryset().active()
  68. def inactive(self):
  69. """
  70. Return inactive instances of ActivatorModel:
  71. SomeModel.objects.inactive(), proxy to ActivatorQuerySet.inactive
  72. """
  73. return self.get_queryset().inactive()
  74. class ActivatorModel(models.Model):
  75. """
  76. ActivatorModel
  77. An abstract base class model that provides activate and deactivate fields.
  78. """
  79. INACTIVE_STATUS = 0
  80. ACTIVE_STATUS = 1
  81. STATUS_CHOICES = (
  82. (INACTIVE_STATUS, _('Inactive')),
  83. (ACTIVE_STATUS, _('Active')),
  84. )
  85. status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=ACTIVE_STATUS)
  86. activate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for an immediate activation'))
  87. deactivate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for indefinite activation'))
  88. objects = ActivatorModelManager()
  89. class Meta:
  90. ordering = ('status', '-activate_date',)
  91. abstract = True
  92. def save(self, *args, **kwargs):
  93. if not self.activate_date:
  94. self.activate_date = now()
  95. super().save(*args, **kwargs)