# Third Party imports from rest_framework import serializers # Module imports from .base import BaseSerializer from .user import UserLiteSerializer from .project import ProjectSerializer from .issue import IssueFlatSerializer from plane.db.models import User, Module, ModuleMember, ModuleIssue class ModuleWriteSerializer(BaseSerializer): members_list = serializers.ListField( child=serializers.PrimaryKeyRelatedField(queryset=User.objects.all()), write_only=True, required=False, ) class Meta: model = Module fields = "__all__" read_only_fields = [ "workspace", "project", "created_by", "updated_by", "created_at", "updated_at", ] def create(self, validated_data): members = validated_data.pop("members_list", None) project = self.context["project"] module = Module.objects.create(**validated_data, project=project) if members is not None: ModuleMember.objects.bulk_create( [ ModuleMember( module=module, member=member, project=project, workspace=project.workspace, created_by=module.created_by, updated_by=module.updated_by, ) for member in members ], batch_size=10, ) return module def update(self, instance, validated_data): members = validated_data.pop("members_list", None) project = self.context["project"] module = Module.objects.create(**validated_data, project=project) if members is not None: ModuleMember.objects.bulk_create( [ ModuleMember( module=module, member=member, project=project, workspace=project.workspace, created_by=module.created_by, updated_by=module.updated_by, ) for member in members ], batch_size=10, ) return super().update(instance, validated_data) class ModuleFlatSerializer(BaseSerializer): class Meta: model = Module fields = "__all__" read_only_fields = [ "workspace", "project", "created_by", "updated_by", "created_at", "updated_at", ] class ModuleIssueSerializer(BaseSerializer): module_detail = ModuleFlatSerializer(read_only=True, source="module") issue_detail = IssueFlatSerializer(read_only=True, source="issue") class Meta: model = ModuleIssue fields = "__all__" read_only_fields = [ "workspace", "project", "created_by", "updated_by", "created_at", "updated_at", "module", ] class ModuleSerializer(BaseSerializer): project_detail = ProjectSerializer(read_only=True, source="project") lead_detail = UserLiteSerializer(read_only=True, source="lead") members_detail = UserLiteSerializer(read_only=True, many=True, source="members") module_issues = ModuleIssueSerializer(read_only=True, many=True) class Meta: model = Module fields = "__all__" read_only_fields = [ "workspace", "project", "created_by", "updated_by", "created_at", "updated_at", ]