Skip to content
Snippets Groups Projects
Commit 64a557dc authored by Samuel GAIST's avatar Samuel GAIST
Browse files

[code][serializers] Implement mod serializer

parent 2caff54e
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !327. Comments created here will be created in the context of that merge request.
......@@ -25,42 +25,61 @@
# #
###############################################################################
import difflib
from rest_framework import serializers
from ..common.serializers import ContributionCreationSerializer
from ..common.serializers import ContributionModSerializer
from ..common.serializers import SharingSerializer
from ..common.serializers import ContributionSerializer
from ..common.serializers import DiffSerializer
from .models import Code
import simplejson as json
import difflib
#----------------------------------------------------------
# ----------------------------------------------------------
class CodeCreationSerializer(ContributionCreationSerializer):
code = serializers.CharField(required=False, allow_blank=True, trim_whitespace=False)
code = serializers.CharField(
required=False, allow_blank=True, trim_whitespace=False
)
class Meta(ContributionCreationSerializer.Meta):
fields = ContributionCreationSerializer.Meta.fields + ['code', 'language']
fields = ContributionCreationSerializer.Meta.fields + ["code", "language"]
class CodeModSerializer(ContributionModSerializer):
code = serializers.CharField(
required=False, allow_blank=True, trim_whitespace=False
)
class Meta(ContributionModSerializer.Meta):
fields = ContributionModSerializer.Meta.fields + ["code", "language"]
def save(self, **kwargs):
code = self.validated_data.pop("code", None)
if code is not None:
self.validated_data["source_code"] = code
return super().save(**kwargs)
#----------------------------------------------------------
# ----------------------------------------------------------
class CodeSharingSerializer(SharingSerializer):
status = serializers.CharField()
def validate_status(self, value):
if value not in ['public', 'usable']:
raise serializers.ValidationError('Invalid status value')
if value not in ["public", "usable"]:
raise serializers.ValidationError("Invalid status value")
return value
#----------------------------------------------------------
# ----------------------------------------------------------
class CodeSerializer(ContributionSerializer):
......@@ -71,19 +90,23 @@ class CodeSerializer(ContributionSerializer):
class Meta(ContributionSerializer.Meta):
model = Code
default_fields = ContributionSerializer.Meta.default_fields + ['opensource', 'language', 'valid']
extra_fields = ContributionSerializer.Meta.extra_fields + ['code']
exclude = ContributionSerializer.Meta.exclude + ['source_code_file']
default_fields = ContributionSerializer.Meta.default_fields + [
"opensource",
"language",
"valid",
]
extra_fields = ContributionSerializer.Meta.extra_fields + ["code"]
exclude = ContributionSerializer.Meta.exclude + ["source_code_file"]
def __init__(self, *args, **kwargs):
# Don't pass the 'opensource' arg up to the superclass
self.opensource = kwargs.pop('opensource', False)
self.opensource = kwargs.pop("opensource", False)
# Instantiate the superclass normally
super(ContributionSerializer, self).__init__(*args, **kwargs)
def get_opensource(self, obj):
user = self.context.get('user')
user = self.context.get("user")
(has_access, open_source, accessibility) = obj.accessibility_for(user)
return open_source
......@@ -92,46 +115,48 @@ class CodeSerializer(ContributionSerializer):
def get_accessibility(self, obj):
if obj.sharing == Code.PUBLIC:
return 'public'
return "public"
elif obj.sharing == Code.SHARED or obj.sharing == Code.USABLE:
return 'confidential'
return "confidential"
else:
return 'private'
return "private"
def get_sharing(self, obj):
user = self.context.get('user')
user = self.context.get("user")
sharing = super(CodeSerializer, self).get_sharing(obj)
if user == obj.author:
if obj.usable_by.count() > 0:
sharing['usable_by'] = map(lambda x: x.username,
obj.usable_by.iterator())
sharing["usable_by"] = map(
lambda x: x.username, obj.usable_by.iterator()
)
if obj.usable_by_team.count() > 0:
sharing['usable_by_team'] = map(lambda x: x.name,
obj.usable_by_team.iterator())
sharing["usable_by_team"] = map(
lambda x: x.name, obj.usable_by_team.iterator()
)
return sharing
def get_code(self, obj):
user = self.context.get('user')
user = self.context.get("user")
if obj.author != user:
(has_access, open_source, accessibility) = obj.accessibility_for(user)
if not(has_access) or not(open_source):
if not (has_access) or not (open_source):
return None
return obj.source_code
#----------------------------------------------------------
# ----------------------------------------------------------
class CodeDiffSerializer(DiffSerializer):
source_code_diff = serializers.SerializerMethodField()
def get_source_code_diff(self, obj):
source1 = obj['object1'].source_code
source2 = obj['object2'].source_code
source1 = obj["object1"].source_code
source2 = obj["object2"].source_code
diff = difflib.ndiff(source1.splitlines(), source2.splitlines())
return '\n'.join(filter(lambda x: x[0] != '?', list(diff)))
return "\n".join(filter(lambda x: x[0] != "?", list(diff)))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment