diff --git a/beat/web/code/serializers.py b/beat/web/code/serializers.py index 4f25aef869692005089f669cda10869e52bcde21..8519433ab1264ab2f2e99a7b7d13db3224325899 100755 --- a/beat/web/code/serializers.py +++ b/beat/web/code/serializers.py @@ -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)))