125 lines
4.1 KiB
Python
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__' |