models.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. from django.utils.translation import gettext_lazy as _
  4. from mongoengine.document import Document
  5. from mongoengine.fields import DateTimeField, IntField, StringField
  6. from mongoengine.queryset import QuerySetManager
  7. from django_extensions.mongodb.fields import AutoSlugField, CreationDateTimeField, ModificationDateTimeField
  8. class TimeStampedModel(Document):
  9. """
  10. TimeStampedModel
  11. An abstract base class model that provides self-managed "created" and
  12. "modified" fields.
  13. """
  14. created = CreationDateTimeField()
  15. modified = ModificationDateTimeField()
  16. class Meta:
  17. abstract = True
  18. class TitleSlugDescriptionModel(Document):
  19. """
  20. TitleSlugDescriptionModel
  21. An abstract base class model that provides title and description fields
  22. and a self-managed "slug" field that populates from the title.
  23. """
  24. title = StringField(max_length=255)
  25. slug = AutoSlugField(populate_from='title')
  26. description = StringField(blank=True, null=True)
  27. class Meta:
  28. abstract = True
  29. class ActivatorModelManager(QuerySetManager):
  30. """
  31. ActivatorModelManager
  32. Manager to return instances of ActivatorModel: SomeModel.objects.active() / .inactive()
  33. """
  34. def active(self):
  35. """
  36. Return active instances of ActivatorModel:
  37. SomeModel.objects.active()
  38. """
  39. return super().get_queryset().filter(status=1)
  40. def inactive(self):
  41. """
  42. Return inactive instances of ActivatorModel:
  43. SomeModel.objects.inactive()
  44. """
  45. return super().get_queryset().filter(status=0)
  46. class ActivatorModel(Document):
  47. """
  48. ActivatorModel
  49. An abstract base class model that provides activate and deactivate fields.
  50. """
  51. STATUS_CHOICES = (
  52. (0, _('Inactive')),
  53. (1, _('Active')),
  54. )
  55. status = IntField(choices=STATUS_CHOICES, default=1)
  56. activate_date = DateTimeField(blank=True, null=True, help_text=_('keep empty for an immediate activation'))
  57. deactivate_date = DateTimeField(blank=True, null=True, help_text=_('keep empty for indefinite activation'))
  58. objects = ActivatorModelManager()
  59. class Meta:
  60. abstract = True
  61. def save(self, *args, **kwargs):
  62. if not self.activate_date:
  63. self.activate_date = datetime.datetime.now()
  64. super().save(*args, **kwargs)