Skip to content
Snippets Groups Projects

Refactor update creation api

Merged Samuel GAIST requested to merge refactor_update_creation_api into master
All threads resolved!
1 file
+ 54
29
Compare changes
  • Side-by-side
  • Inline
+ 54
29
@@ -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)))
Loading