nexus-2/backend/api/serializers.py
2026-01-26 10:12:01 -05:00

125 lines
4.1 KiB
Python

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__'