diff --git a/apps/course/migrations/0031_auto_20180213_0906.py b/apps/course/migrations/0031_auto_20180213_0906.py new file mode 100644 index 00000000..e0880533 --- /dev/null +++ b/apps/course/migrations/0031_auto_20180213_0906.py @@ -0,0 +1,23 @@ +# Generated by Django 2.0.2 on 2018-02-13 09:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0030_auto_20180212_0537'), + ] + + operations = [ + migrations.AddField( + model_name='course', + name='deactivated_at', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + migrations.AddField( + model_name='lesson', + name='deactivated_at', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + ] diff --git a/apps/course/models.py b/apps/course/models.py index 0eb620cb..b0a2045d 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -7,6 +7,8 @@ from django.contrib.auth import get_user_model from django.urls import reverse_lazy from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey +from project.mixins import BaseModel, DeactivatedMixin + from .manager import CategoryQuerySet from apps.content.models import ImageObject, Gallery @@ -25,7 +27,7 @@ def default_slug(): return str(uuid4()) -class Course(models.Model): +class Course(BaseModel, DeactivatedMixin): PENDING = 0 PUBLISHED = 1 ARCHIVED = 2 @@ -141,7 +143,7 @@ class Category(models.Model): ordering = ['title'] -class Lesson(models.Model): +class Lesson(BaseModel, DeactivatedMixin): title = models.CharField('Название урока', max_length=100) short_description = models.TextField('Краткое описание урока') course = models.ForeignKey( diff --git a/project/mixins.py b/project/mixins.py new file mode 100644 index 00000000..6c6681f3 --- /dev/null +++ b/project/mixins.py @@ -0,0 +1,38 @@ +from django.db import models +from django.utils import timezone + + +class BaseModel(models.Model): + + class Meta: + abstract = True + + +class DeactivatedQueryset(models.Manager): + + def allow_delete(self): + super().delete() + + def delete(self): + count = self.count() + self.filter(deactivated_at__isnull=True).update( + deactivated_at=timezone.now() + ) + return (count, None) + + +class DeactivatedMixin(models.Model): + deactivated_at = models.DateTimeField(null=True, blank=True, default=None) + + objects = DeactivatedQueryset() + + class Meta: + abstract = True + + def allow_delete(self, using=None, keep_parents=False): + super().delete(using=using, keep_parents=keep_parents) + + def delete(self, using=None, keep_parents=False): + if not self.deactivated_at: + self.deactivated_at = timezone.now() + self.save()