server/python/django2/renkanmanager/serializers.py
changeset 613 e00a24b711a0
parent 611 f0f07e2b841f
child 615 f3875fbe206a
equal deleted inserted replaced
612:aa4987fede52 613:e00a24b711a0
    23     content = serializers.JSONField(required=False)
    23     content = serializers.JSONField(required=False)
    24     creation_date = serializers.ReadOnlyField()
    24     creation_date = serializers.ReadOnlyField()
    25     modification_date = serializers.SerializerMethodField("get_current_revision_modification_date")
    25     modification_date = serializers.SerializerMethodField("get_current_revision_modification_date")
    26     create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating
    26     create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating
    27     validation_timestamp = serializers.CharField(write_only=True, required=False) # only used for updating is a content json is not provided
    27     validation_timestamp = serializers.CharField(write_only=True, required=False) # only used for updating is a content json is not provided
    28     
    28 
    29     # ADD ERROR HANDLING
    29     # ADD ERROR HANDLING
    30     def get_current_revision_last_updator(self, renkan):
    30     def get_current_revision_last_updator(self, renkan):
    31         return getattr(renkan.current_revision.last_updated_by, RENKAN_USER_DISPLAY_FIELD)
    31         last_updator = renkan.current_revision.last_updated_by
    32     
    32         if last_updator:
    33     
    33             return getattr(last_updator, RENKAN_USER_DISPLAY_FIELD)
       
    34         else:
       
    35             return ''
       
    36 
       
    37 
    34     def get_current_revision_modification_date(self, renkan):
    38     def get_current_revision_modification_date(self, renkan):
    35         return renkan.current_revision.modification_date
    39         return renkan.current_revision.modification_date
    36     
    40 
    37     @transaction.atomic
    41     @transaction.atomic
    38     def create(self, validated_data):
    42     def create(self, validated_data):
    39         """
    43         """
    40             Method to create a new Renkan (and its first revision)
    44             Method to create a new Renkan (and its first revision)
    41         """
    45         """
    50                 workspace=workspace_obj,
    54                 workspace=workspace_obj,
    51                 source_revision=source_revision_obj
    55                 source_revision=source_revision_obj
    52             )
    56             )
    53         except ValidationError as ve:
    57         except ValidationError as ve:
    54             raise serializers.ValidationError(ve.args[0])
    58             raise serializers.ValidationError(ve.args[0])
    55     
    59 
    56     @transaction.atomic
    60     @transaction.atomic
    57     def update(self, renkan, validated_data):
    61     def update(self, renkan, validated_data):
    58         """
    62         """
    59             Method to update a Renkan object. Creates a new revision if needed
    63             Method to update a Renkan object. Creates a new revision if needed
    60         """
    64         """
    78         try:
    82         try:
    79             renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision)
    83             renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision)
    80         except ValidationError as ve:
    84         except ValidationError as ve:
    81             raise serializers.ValidationError(str(ve.args[0]))
    85             raise serializers.ValidationError(str(ve.args[0]))
    82         return renkan
    86         return renkan
    83     
    87 
    84     def validate_workspace_id(self, value):
    88     def validate_workspace_id(self, value):
    85         if self.instance is not None:
    89         if self.instance is not None:
    86             raise serializers.ValidationError("You cannot update workspace_guid")
    90             raise serializers.ValidationError("You cannot update workspace_guid")
    87         return value
    91         return value
    88     
    92 
    89     def validate_source_revision_id(self, value):
    93     def validate_source_revision_id(self, value):
    90         if self.instance is not None:
    94         if self.instance is not None:
    91             raise serializers.ValidationError("You cannot update source_revision_guid")
    95             raise serializers.ValidationError("You cannot update source_revision_guid")
    92         return value
    96         return value
    93     
    97 
    94     def validate_content(self, value):  
    98     def validate_content(self, value):
    95         try:
    99         try:
    96             loaded_json = json.loads(value)
   100             loaded_json = json.loads(value)
    97         except ValueError:
   101         except ValueError:
    98             raise serializers.ValidationError("Content format is not a JSON-serializable")
   102             raise serializers.ValidationError("Content format is not a JSON-serializable")
    99         if (not "nodes" in loaded_json):
   103         if (not "nodes" in loaded_json):
   101         if (not "edges" in loaded_json):
   105         if (not "edges" in loaded_json):
   102             raise serializers.ValidationError("Content requires a 'edges' entry")
   106             raise serializers.ValidationError("Content requires a 'edges' entry")
   103         if (not "views" in loaded_json):
   107         if (not "views" in loaded_json):
   104             raise serializers.ValidationError("Content requires a 'views' entry")
   108             raise serializers.ValidationError("Content requires a 'views' entry")
   105         return value
   109         return value
   106     
   110 
   107     def validate_validation_timestamp(self, value):
   111     def validate_validation_timestamp(self, value):
   108         logger.debug("%r", value)
   112         logger.debug("%r < %r", dateparse.parse_datetime(value), self.get_current_revision_modification_date(self.instance))
       
   113 
   109         if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance):
   114         if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance):
   110             raise serializers.ValidationError("Invalid timestamp was provided")
   115             raise serializers.ValidationError("Invalid timestamp was provided")
   111         return value
   116         return value
   112 
   117 
   113 class RevisionSerializer(serializers.Serializer):
   118 class RevisionSerializer(serializers.Serializer):
   119     renkan_created_by = serializers.SerializerMethodField("get_related_renkan_creator")
   124     renkan_created_by = serializers.SerializerMethodField("get_related_renkan_creator")
   120     renkan_creation_date = serializers.SerializerMethodField("get_related_renkan_creation_date")
   125     renkan_creation_date = serializers.SerializerMethodField("get_related_renkan_creation_date")
   121     revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
   126     revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
   122     revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
   127     revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
   123     revision_modification_date = serializers.ReadOnlyField(source="modification_date")
   128     revision_modification_date = serializers.ReadOnlyField(source="modification_date")
   124     
   129 
   125     def get_related_workspace_guid(self, revision):
   130     def get_related_workspace_guid(self, revision):
   126         if revision.parent_renkan.workspace:
   131         if revision.parent_renkan.workspace:
   127             return revision.parent_renkan.workspace.workspace_guid
   132             return revision.parent_renkan.workspace.workspace_guid
   128         else:
   133         else:
   129             return ''
   134             return ''
   130     
   135 
   131     def get_related_renkan_creator(self, revision):
   136     def get_related_renkan_creator(self, revision):
   132         return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD)
   137         return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD)
   133     
   138 
   134     def get_related_renkan_creation_date(self, revision):
   139     def get_related_renkan_creation_date(self, revision):
   135         return revision.parent_renkan.creation_date
   140         return revision.parent_renkan.creation_date
   136     
   141 
   137 
   142 
   138 class WorkspaceSerializer(serializers.Serializer):
   143 class WorkspaceSerializer(serializers.Serializer):
   139     id = serializers.ReadOnlyField(source="workspace_guid")
   144     id = serializers.ReadOnlyField(source="workspace_guid")
   140     workspace_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
   145     workspace_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
   141     creation_date = serializers.ReadOnlyField()
   146     creation_date = serializers.ReadOnlyField()
   142     renkan_count = serializers.ReadOnlyField()
   147     renkan_count = serializers.ReadOnlyField()
   143     title = serializers.CharField()
   148     title = serializers.CharField()
   144     
   149 
   145     def create(self, validated_data):
   150     def create(self, validated_data):
   146         creator = validated_data.get('creator')
   151         creator = validated_data.get('creator')
   147         title = validated_data.get('title', '')
   152         title = validated_data.get('title', '')
   148         workspace = Workspace.objects.create(creator=creator, title=title)
   153         workspace = Workspace.objects.create(creator=creator, title=title)
   149         workspace.save()
   154         workspace.save()
   150         return workspace
   155         return workspace
   151     
   156 
   152     def update(self, workspace, validated_data):
   157     def update(self, workspace, validated_data):
   153         workspace.title = validated_data.get('title', '')
   158         workspace.title = validated_data.get('title', '')
   154         workspace.save()
   159         workspace.save()
   155         return workspace
   160         return workspace