from rest_framework import serializers from django.contrib.auth.models import User from .models import ( Profile, Customer, Account, Revenue, Labor, Schedule, Service, Project, Invoice, Report, Punchlist ) class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username', 'email'] class ProfileSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) class Meta: model = Profile fields = '__all__' class RevenueSerializer(serializers.ModelSerializer): class Meta: model = Revenue fields = '__all__' class LaborSerializer(serializers.ModelSerializer): class Meta: model = Labor fields = '__all__' class ScheduleSerializer(serializers.ModelSerializer): class Meta: model = Schedule fields = '__all__' class ServiceSerializer(serializers.ModelSerializer): team_members_detail = ProfileSerializer(source='team_members', many=True, read_only=True) class Meta: model = Service fields = '__all__' def to_representation(self, instance): # This method customizes the output format data = super().to_representation(instance) # Replace team_members with profile information if 'team_members_detail' in data: data['team_members'] = data.pop('team_members_detail') return data def validate_team_members(self, value): request = self.context.get('request') if request and request.user and hasattr(request.user, 'profile'): if request.user.profile.role in ['admin']: return value # Default validation if not value: raise serializers.ValidationError("At least one team member is required.") return value class ProjectSerializer(serializers.ModelSerializer): team_members_detail = ProfileSerializer(source='team_members', many=True, read_only=True) class Meta: model = Project fields = '__all__' def to_representation(self, instance): # This method customizes the output format data = super().to_representation(instance) # Replace team_members with profile information if 'team_members_detail' in data: data['team_members'] = data.pop('team_members_detail') return data def validate_team_members(self, value): request = self.context.get('request') if request and request.user and hasattr(request.user, 'profile'): if request.user.profile.role in ['admin', 'team_leader']: return value # Default validation if not value: raise serializers.ValidationError("At least one team member is required.") return value class AccountSerializer(serializers.ModelSerializer): revenues = RevenueSerializer(many=True, read_only=True) labors = LaborSerializer(many=True, read_only=True) schedules = ScheduleSerializer(many=True, read_only=True) services = ServiceSerializer(many=True, read_only=True) projects = ProjectSerializer(many=True, read_only=True) class Meta: model = Account fields = '__all__' class CustomerSerializer(serializers.ModelSerializer): accounts = AccountSerializer(many=True, read_only=True) projects = ProjectSerializer(many=True, read_only=True) class Meta: model = Customer fields = '__all__' class InvoiceSerializer(serializers.ModelSerializer): customer = CustomerSerializer(read_only=True) accounts = AccountSerializer(many=True, read_only=True) projects = ProjectSerializer(many=True, read_only=True) class Meta: model = Invoice fields = '__all__' class ReportSerializer(serializers.ModelSerializer): team_member = ProfileSerializer(read_only=True) services = ServiceSerializer(many=True, read_only=True) projects = ProjectSerializer(many=True, read_only=True) class Meta: model = Report fields = '__all__' class PunchlistSerializer(serializers.ModelSerializer): class Meta: model = Punchlist fields = '__all__'