from django.db import models import reversion from backend_app.models.abstract.essentialModule import ( EssentialModule, EssentialModuleSerializer, EssentialModuleViewSet, ) from backend_app.signals.squash_revisions import new_revision_saved from rest_framework import serializers from reversion.models import Version class VersionedEssentialModule(EssentialModule): """ Custom EssentialModule that will be versionned in the app """ # We store the current number of versions for better performance nb_versions = models.PositiveIntegerField(default=0) @classmethod def get_serializer(cls): """ This function is required for handling versioning easily. You have to put the correct value in each subclass """ raise Exception("Get_serializer must be redefined in subclass") def delete(self, using=None, keep_parents=False): """ Override the default delete behavior to make sure versions instances corresponding to the deleted instance are also deleted. """ # We need to delete the versions first. Otherwise for some reason it wouldn't work. Version.objects.get_for_object(self).delete() super().delete(using, keep_parents) class Meta: abstract = True class VersionedEssentialModuleSerializer(EssentialModuleSerializer): """ Serializer for versionned models """ # Add a nb_versions field nb_versions = serializers.IntegerField(read_only=True) def save(self, *args, **kwargs): """ Custom save function to use reversion. """ with reversion.create_revision(): res = super().save(*args, **kwargs) reversion.set_user(res.updated_by) new_revision_saved.send(sender=self.__class__, obj=self.instance) return res class VersionedEssentialModuleViewSet(EssentialModuleViewSet): """ Viewset for the versionned models """ serializer_class = VersionedEssentialModuleSerializer