Add settings page and configurable network map types.
Let users define sector/circle labels and geometry per map type, choose a type when creating maps, and sync types through local backup and API migrations. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from rest_framework import serializers
|
||||
from .models import Contact, Relation, NetworkMap, NetworkMapMembership
|
||||
from .models import Contact, Relation, NetworkMap, NetworkMapMembership, NetworkMapType
|
||||
from .map_type_validation import validate_map_type_payload
|
||||
|
||||
|
||||
class ContactSerializer(serializers.ModelSerializer):
|
||||
@@ -43,17 +44,52 @@ class RelationSerializer(serializers.ModelSerializer):
|
||||
return data
|
||||
|
||||
|
||||
class NetworkMapTypeSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = NetworkMapType
|
||||
fields = [
|
||||
'id', 'name', 'sectors', 'circles', 'is_default',
|
||||
'created_at', 'updated_at',
|
||||
]
|
||||
read_only_fields = ['id', 'is_default', 'created_at', 'updated_at']
|
||||
|
||||
def validate(self, data):
|
||||
sectors = data.get('sectors', getattr(self.instance, 'sectors', None))
|
||||
circles = data.get('circles', getattr(self.instance, 'circles', None))
|
||||
errors = validate_map_type_payload(sectors, circles)
|
||||
if errors:
|
||||
raise serializers.ValidationError(errors)
|
||||
return data
|
||||
|
||||
def create(self, validated_data):
|
||||
if NetworkMapType.objects.filter(is_default=True).exists():
|
||||
validated_data['is_default'] = False
|
||||
return super().create(validated_data)
|
||||
|
||||
|
||||
class NetworkMapSerializer(serializers.ModelSerializer):
|
||||
memberships_count = serializers.SerializerMethodField()
|
||||
map_type = serializers.PrimaryKeyRelatedField(
|
||||
queryset=NetworkMapType.objects.all(),
|
||||
required=False,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = NetworkMap
|
||||
fields = [
|
||||
'id', 'name', 'description',
|
||||
'id', 'name', 'description', 'map_type',
|
||||
'created_at', 'updated_at', 'memberships_count',
|
||||
]
|
||||
read_only_fields = ['id', 'created_at', 'updated_at', 'memberships_count']
|
||||
|
||||
def validate(self, data):
|
||||
if not data.get('map_type') and not getattr(self.instance, 'map_type_id', None):
|
||||
default_type = NetworkMapType.objects.filter(is_default=True).first()
|
||||
if not default_type:
|
||||
raise serializers.ValidationError({'map_type': 'Нет типа карты по умолчанию.'})
|
||||
data['map_type'] = default_type
|
||||
return data
|
||||
|
||||
def get_memberships_count(self, obj):
|
||||
return obj.memberships.count()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user