server/python/django2/renkanmanager/serializers.py
author ymh <ymh.work@gmail.com>
Fri, 15 Sep 2017 14:11:36 +0200
changeset 658 cac26275af31
parent 626 112912309726
child 665 69d13e7dd286
permissions -rw-r--r--
define version V0.13.02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
611
f0f07e2b841f serverside: translation + timestamp handling + logging
durandn
parents: 610
diff changeset
     1
import json, logging, uuid, datetime, time
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
     2
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
     3
from django.db import transaction
593
2ff785d7026c corrected tests and serializer so they can support custom user model, added a readme (to be expanded) with configuration information for the field renkan api will use to render user information
durandn
parents: 592
diff changeset
     4
from django.contrib.auth import get_user_model
2ff785d7026c corrected tests and serializer so they can support custom user model, added a readme (to be expanded) with configuration information for the field renkan api will use to render user information
durandn
parents: 592
diff changeset
     5
from django.conf import settings
618
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
     6
from django.utils import six
611
f0f07e2b841f serverside: translation + timestamp handling + logging
durandn
parents: 610
diff changeset
     7
from django.core.exceptions import ValidationError
615
f3875fbe206a redo foreign key for renkanmanager, optimize property access, correct unit tests
ymh <ymh.work@gmail.com>
parents: 613
diff changeset
     8
from renkanmanager import settings as renkan_settings
588
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
     9
from renkanmanager.models import Renkan, Workspace, Revision
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    10
from rest_framework import serializers
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    11
611
f0f07e2b841f serverside: translation + timestamp handling + logging
durandn
parents: 610
diff changeset
    12
logger = logging.getLogger(__name__)
615
f3875fbe206a redo foreign key for renkanmanager, optimize property access, correct unit tests
ymh <ymh.work@gmail.com>
parents: 613
diff changeset
    13
RENKAN_USER_DISPLAY_FIELD = renkan_settings.RENKAN_USER_DISPLAY_FIELD
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    14
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    15
class RenkanSerializer(serializers.Serializer):
589
0ae11aa255a3 Moved python2/django into a django2 folder for consistency + clarified serializers fields name
durandn
parents: 588
diff changeset
    16
    id = serializers.ReadOnlyField(source="renkan_guid")
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    17
    current_revision_id = serializers.SlugRelatedField(source="current_revision", slug_field="revision_guid", read_only=True)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    18
    workspace_id = serializers.SlugRelatedField(source="workspace", slug_field="workspace_guid", queryset=Workspace.objects, required=False)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    19
    source_revision_id = serializers.SlugRelatedField(source="source_revision", slug_field="revision_guid", queryset=Revision.objects, required=False)
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    20
    revision_count = serializers.ReadOnlyField()
594
b45eb8244cd9 Added default to the RENKAN_USER_DISPLAY_FIELD setting. Will default to the USERFIELD_NAME for the user model
durandn
parents: 593
diff changeset
    21
    created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    22
    last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator")
620
22b5739772d8 allow blank title in serializer
ymh <ymh.work@gmail.com>
parents: 619
diff changeset
    23
    title = serializers.CharField(required=False, allow_blank=True)
588
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
    24
    content = serializers.JSONField(required=False)
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    25
    creation_date = serializers.ReadOnlyField()
618
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    26
    modification_date = serializers.SerializerMethodField()
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    27
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    28
    def __init__(self, instance=None, data=serializers.empty, **kwargs):
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    29
618
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    30
        self.validation_timestamp = kwargs.pop('validation_timestamp', None)
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    31
        super(RenkanSerializer, self).__init__(instance, data, **kwargs)
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    32
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    33
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    34
    def get_current_revision_last_updator(self, renkan):
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    35
        last_updator = renkan.current_revision.last_updated_by
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    36
        if last_updator:
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    37
            return getattr(last_updator, RENKAN_USER_DISPLAY_FIELD)
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    38
        else:
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    39
            return ''
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    40
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    41
618
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    42
    def get_modification_date(self, renkan):
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    43
        return renkan.current_revision.modification_date
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    44
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    45
    @transaction.atomic
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    46
    def create(self, validated_data):
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    47
        """
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    48
            Method to create a new Renkan (and its first revision)
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    49
        """
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    50
        creator = validated_data.get('creator')
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    51
        workspace_obj = validated_data.get('workspace', None)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    52
        source_revision_obj = validated_data.get('source_revision', None)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    53
        try:
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    54
            return Renkan.objects.create_renkan(
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    55
                creator=creator,
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    56
                title=validated_data.get('title', ''),
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    57
                content=validated_data.get('content', ''),
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    58
                workspace=workspace_obj,
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    59
                source_revision=source_revision_obj
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    60
            )
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    61
        except ValidationError as ve:
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    62
            raise serializers.ValidationError(ve.args[0])
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    63
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    64
    @transaction.atomic
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    65
    def update(self, renkan, validated_data):
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    66
        """
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    67
            Method to update a Renkan object. Creates a new revision if needed
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    68
        """
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    69
        updator = validated_data.get('updator')
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    70
        create_new_revision = validated_data.get("create_new_revision", False)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    71
        title = validated_data.get('title', renkan.current_revision.title)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    72
        content = validated_data.get('content', '')
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    73
        if not content:
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    74
            content = renkan.current_revision.content
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    75
        if title != json.loads(content).get("title", ""):
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    76
            content_dict = json.loads(content)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    77
            content_dict["title"] = title
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    78
            content = json.dumps(content_dict)
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    79
        try:
618
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
    80
            renkan.save_renkan(updator=updator, timestamp=self.validation_timestamp, title=title, content=content, create_new_revision=create_new_revision)
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
    81
        except ValidationError as ve:
611
f0f07e2b841f serverside: translation + timestamp handling + logging
durandn
parents: 610
diff changeset
    82
            raise serializers.ValidationError(str(ve.args[0]))
615
f3875fbe206a redo foreign key for renkanmanager, optimize property access, correct unit tests
ymh <ymh.work@gmail.com>
parents: 613
diff changeset
    83
        # FORCE Renkan reload.
f3875fbe206a redo foreign key for renkanmanager, optimize property access, correct unit tests
ymh <ymh.work@gmail.com>
parents: 613
diff changeset
    84
        # TODO: How to avoid the reload ???
619
d427a6db1902 small optimization on renkan loading: prefecht current revision
ymh <ymh.work@gmail.com>
parents: 618
diff changeset
    85
        return Renkan.objects.select_related('current_revision').get(id=renkan.id)
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    86
589
0ae11aa255a3 Moved python2/django into a django2 folder for consistency + clarified serializers fields name
durandn
parents: 588
diff changeset
    87
    def validate_workspace_id(self, value):
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    88
        if self.instance is not None:
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    89
            raise serializers.ValidationError("You cannot update workspace_guid")
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    90
        return value
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    91
589
0ae11aa255a3 Moved python2/django into a django2 folder for consistency + clarified serializers fields name
durandn
parents: 588
diff changeset
    92
    def validate_source_revision_id(self, value):
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    93
        if self.instance is not None:
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    94
            raise serializers.ValidationError("You cannot update source_revision_guid")
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
    95
        return value
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    96
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
    97
    def validate_content(self, value):
588
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
    98
        try:
611
f0f07e2b841f serverside: translation + timestamp handling + logging
durandn
parents: 610
diff changeset
    99
            loaded_json = json.loads(value)
588
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   100
        except ValueError:
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   101
            raise serializers.ValidationError("Content format is not a JSON-serializable")
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   102
        if (not "nodes" in loaded_json):
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   103
            raise serializers.ValidationError("Content requires a 'nodes' entry")
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   104
        if (not "edges" in loaded_json):
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   105
            raise serializers.ValidationError("Content requires a 'edges' entry")
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   106
        if (not "views" in loaded_json):
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   107
            raise serializers.ValidationError("Content requires a 'views' entry")
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   108
        return value
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   109
618
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   110
    def validate(self, data):
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   111
        if self.instance:
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   112
            validation_timestamp = self.validation_timestamp or data.get('content', {}).get('updated')
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   113
            if not validation_timestamp:
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   114
                raise serializers.ValidationError("No validation timestamp and no content json to extract it from")
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   115
            validation_timestamp = dateparse.parse_datetime(validation_timestamp) if isinstance(validation_timestamp, six.string_types) else validation_timestamp
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   116
            if validation_timestamp != self.instance.current_revision.modification_date:
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   117
                raise serializers.ValidationError("Invalid timestamp was provided")
3051b847c124 validation_timestamp and create_new_revision are not part of the data. move them to query parameters
ymh <ymh.work@gmail.com>
parents: 615
diff changeset
   118
        return data
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   119
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   120
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   121
class RevisionSerializer(serializers.Serializer):
589
0ae11aa255a3 Moved python2/django into a django2 folder for consistency + clarified serializers fields name
durandn
parents: 588
diff changeset
   122
    id = serializers.ReadOnlyField(source="revision_guid")
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   123
    parent_renkan_id = serializers.SlugRelatedField(source="parent_renkan", slug_field='renkan_guid', read_only=True)
589
0ae11aa255a3 Moved python2/django into a django2 folder for consistency + clarified serializers fields name
durandn
parents: 588
diff changeset
   124
    workspace_id = serializers.SerializerMethodField("get_related_workspace_guid")
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   125
    title = serializers.ReadOnlyField()
588
95536fa18d0d Minor adjustements to properly interact with Renkan client
durandn
parents: 587
diff changeset
   126
    content = serializers.JSONField(read_only=True)
593
2ff785d7026c corrected tests and serializer so they can support custom user model, added a readme (to be expanded) with configuration information for the field renkan api will use to render user information
durandn
parents: 592
diff changeset
   127
    renkan_created_by = serializers.SerializerMethodField("get_related_renkan_creator")
2ff785d7026c corrected tests and serializer so they can support custom user model, added a readme (to be expanded) with configuration information for the field renkan api will use to render user information
durandn
parents: 592
diff changeset
   128
    renkan_creation_date = serializers.SerializerMethodField("get_related_renkan_creation_date")
594
b45eb8244cd9 Added default to the RENKAN_USER_DISPLAY_FIELD setting. Will default to the USERFIELD_NAME for the user model
durandn
parents: 593
diff changeset
   129
    revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   130
    revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   131
    revision_modification_date = serializers.ReadOnlyField(source="modification_date")
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   132
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   133
    def get_related_workspace_guid(self, revision):
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   134
        if revision.parent_renkan.workspace:
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   135
            return revision.parent_renkan.workspace.workspace_guid
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   136
        else:
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   137
            return ''
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   138
593
2ff785d7026c corrected tests and serializer so they can support custom user model, added a readme (to be expanded) with configuration information for the field renkan api will use to render user information
durandn
parents: 592
diff changeset
   139
    def get_related_renkan_creator(self, revision):
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   140
        return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD)
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   141
593
2ff785d7026c corrected tests and serializer so they can support custom user model, added a readme (to be expanded) with configuration information for the field renkan api will use to render user information
durandn
parents: 592
diff changeset
   142
    def get_related_renkan_creation_date(self, revision):
610
b9edc1c1538a reworked views and serializers to pass and take into account the "validation timestamp" to the model + refactored models to have a content validation method + adapted tests
durandn
parents: 608
diff changeset
   143
        return revision.parent_renkan.creation_date
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   144
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   145
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   146
class WorkspaceSerializer(serializers.Serializer):
589
0ae11aa255a3 Moved python2/django into a django2 folder for consistency + clarified serializers fields name
durandn
parents: 588
diff changeset
   147
    id = serializers.ReadOnlyField(source="workspace_guid")
594
b45eb8244cd9 Added default to the RENKAN_USER_DISPLAY_FIELD setting. Will default to the USERFIELD_NAME for the user model
durandn
parents: 593
diff changeset
   148
    workspace_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   149
    creation_date = serializers.ReadOnlyField()
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   150
    renkan_count = serializers.ReadOnlyField()
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   151
    title = serializers.CharField()
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   152
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   153
    def create(self, validated_data):
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   154
        creator = validated_data.get('creator')
608
8fd40139827c permission implementation has to be client-side and not in the generic api package + deleted duplicate migration
durandn
parents: 594
diff changeset
   155
        title = validated_data.get('title', '')
8fd40139827c permission implementation has to be client-side and not in the generic api package + deleted duplicate migration
durandn
parents: 594
diff changeset
   156
        workspace = Workspace.objects.create(creator=creator, title=title)
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   157
        workspace.save()
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   158
        return workspace
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   159
587
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   160
    def update(self, workspace, validated_data):
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   161
        workspace.title = validated_data.get('title', '')
fb0041aa74d3 transfer work on renkanmanager into a renkan/server/python2 folder: reworked models, implemented simple API basic permissions, wrote tests
durandn
parents:
diff changeset
   162
        workspace.save()
613
e00a24b711a0 make renkanmanager test run locally
ymh <ymh.work@gmail.com>
parents: 611
diff changeset
   163
        return workspace