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

[code][serializers] Implement mod serializer

parent 6e0bdda1
No related branches found
No related tags found
No related merge requests found
......@@ -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