from django.db import transaction from rest_framework import serializers from core.apps.wherehouse.models.wherehouse import WhereHouse from core.apps.accounts.models import User from core.apps.accounts.serializers.user import UserListSerializer from core.apps.projects.models.project import Project class WhereHouseListSerializer(serializers.ModelSerializer): users = UserListSerializer(many=True) class Meta: model = WhereHouse fields = [ 'id', 'name', 'address', 'users' ] class WhereHouseDetailSerializer(serializers.ModelSerializer): class Meta: model = WhereHouse fields = [ 'id', 'name', 'address', ] class WhereHouseCreateSerializer(serializers.Serializer): name = serializers.CharField() address = serializers.CharField() user_ids = serializers.ListField(child=serializers.UUIDField(required=False), required=False) project_ids = serializers.ListField(child=serializers.UUIDField(required=False), required=False) def create(self, validated_data): with transaction.atomic(): user_ids = validated_data.pop('user_ids', []) project_ids = validated_data.pop('project_ids', []) wherehouse = WhereHouse.objects.create( name=validated_data.get('name'), address=validated_data.get('address'), ) if user_ids: users = User.objects.filter(id__in=user_ids) wherehouse.users.set(users) if project_ids: projects = Project.objects.filter(id__in=project_ids) for project in projects: project.wherehouse.add(wherehouse) project.save() return wherehouse class WhereHouseUpdateSerializer(serializers.ModelSerializer): class Meta: model = WhereHouse fields = [ 'name', 'address', 'users' ] def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.address = validated_data.get('address', instance.address) users = validated_data.pop('users', None) if users is not None: instance.users.clear() instance.users.set(users) instance.save() return instance