-
Notifications
You must be signed in to change notification settings - Fork 30
/
serializers.py
72 lines (59 loc) · 2.67 KB
/
serializers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from pydash import get
from rest_framework.fields import CharField, BooleanField, DateTimeField
from core.common.serializers import AbstractResourceSerializer
from core.repos.serializers import RepoListSerializer
from core.url_registry.models import URLRegistry
class URLRegistryBaseSerializer(AbstractResourceSerializer):
owner = CharField(read_only=True, source='owner.mnemonic', allow_null=True)
class Meta:
model = URLRegistry
fields = AbstractResourceSerializer.Meta.fields + (
'id', 'name', 'url', 'namespace', 'owner', 'owner_type', 'owner_url')
def to_representation(self, instance):
data = super().to_representation(instance)
data['type'] = URLRegistry.OBJECT_TYPE
return data
class URLRegistryDetailSerializer(URLRegistryBaseSerializer):
created_by = CharField(source='created_by.username', read_only=True)
updated_by = CharField(source='updated_by.username', read_only=True)
is_active = BooleanField(read_only=True)
created_at = DateTimeField(read_only=True)
updated_at = DateTimeField(read_only=True)
repo = RepoListSerializer(read_only=True, allow_null=True)
class Meta:
model = URLRegistry
fields = URLRegistryBaseSerializer.Meta.fields + (
'created_by', 'updated_by', 'created_at', 'updated_at', 'is_active', 'extras', 'repo'
)
def to_representation(self, instance):
data = super().to_representation(instance)
if get(data, 'repo.search_meta'):
data['repo'].pop('search_meta', None)
return data
def prepare_object(self, validated_data):
user = self.context['request'].user
view = self.context['view']
url_registry = URLRegistry(
name=validated_data.get('name'),
namespace=validated_data.get('namespace') or None,
url=validated_data.get('url'),
created_by=user,
updated_by=user,
extras=validated_data.get('extras', {}),
)
if view.parent_resource_type and view.parent_resource:
setattr(url_registry, view.parent_resource_type, view.parent_resource)
return url_registry
def create(self, validated_data):
url_registry = self.prepare_object(validated_data)
if not url_registry.is_uniq():
self._errors['non_fields_error'] = ['This entry already exists.']
if not self._errors:
url_registry.save()
url_registry.lookup_repo()
return url_registry
def update(self, instance, validated_data):
instance = super().update(instance, validated_data)
if instance.is_active:
instance.lookup_repo()
return instance