Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

import reversion 

from django.db import models 

from rest_framework import serializers 

from reversion.models import Version 

 

from backend_app.models.abstract.essentialModule import ( 

EssentialModule, 

EssentialModuleSerializer, 

EssentialModuleViewSet, 

) 

from backend_app.signals.squash_revisions import new_revision_saved 

 

 

class VersionedEssentialModule(EssentialModule): 

""" 

Custom EssentialModule that will be versioned in the app 

""" 

 

# We store the current number of versions for better performance 

nb_versions = models.PositiveIntegerField(default=0) 

 

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 versioned 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 

 

def get_obj_info(self, obj) -> dict: 

""" 

Serializer for the `obj_info` *dynamic* field. Redefined. 

""" 

obj_info = super().get_obj_info(obj) 

obj_info["versioned"] = True 

return obj_info 

 

class Meta: 

model = VersionedEssentialModule 

fields = EssentialModuleSerializer.Meta.fields + ("nb_versions",) 

 

 

class VersionedEssentialModuleViewSet(EssentialModuleViewSet): 

""" 

Viewset for the versioned models 

""" 

 

serializer_class = VersionedEssentialModuleSerializer