70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
from django.contrib.auth import get_user_model
|
|
from rest_framework import serializers
|
|
|
|
from users.serializers import UserSerializer
|
|
from .models import TimeEntry
|
|
from .services import save_period, validate_period
|
|
|
|
|
|
class TimeEntrySerializer(serializers.ModelSerializer):
|
|
user = UserSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
model = TimeEntry
|
|
fields = [
|
|
'id', 'user', 'group_id', 'start_date', 'start_time', 'end_date',
|
|
'end_time', 'created_at', 'updated_at', 'duration', 'day_of_week',
|
|
'is_complete', 'is_incomplete',
|
|
]
|
|
read_only_fields = fields
|
|
|
|
|
|
class TimeEntryCreateSerializer(serializers.Serializer):
|
|
user_id = serializers.PrimaryKeyRelatedField(
|
|
source='user', queryset=get_user_model().objects.all(), required=False,
|
|
write_only=True,
|
|
)
|
|
start_date = serializers.DateField()
|
|
start_time = serializers.TimeField()
|
|
end_date = serializers.DateField(required=False)
|
|
end_time = serializers.TimeField(required=False, allow_null=True)
|
|
|
|
def validate(self, attrs):
|
|
validate_period(attrs)
|
|
return attrs
|
|
|
|
def create(self, validated_data):
|
|
user = validated_data.pop('user', self.context['request'].user)
|
|
return save_period(user, validated_data)
|
|
|
|
|
|
class TimeEntryUpdateSerializer(serializers.Serializer):
|
|
start_date = serializers.DateField()
|
|
start_time = serializers.TimeField()
|
|
end_date = serializers.DateField()
|
|
end_time = serializers.TimeField(allow_null=True)
|
|
|
|
def validate(self, attrs):
|
|
entries = self.context.get('entries', [self.instance])
|
|
first, last = entries[0], entries[-1]
|
|
values = dict(
|
|
start_date=first.start_date, start_time=first.start_time,
|
|
end_date=last.end_date, end_time=last.end_time,
|
|
)
|
|
values.update(attrs)
|
|
validate_period(values)
|
|
return values
|
|
|
|
def update(self, instance, validated_data):
|
|
return save_period(
|
|
instance.user, validated_data,
|
|
self.context.get('entries', [instance]),
|
|
)
|
|
|
|
|
|
class WeeklySummarySerializer(serializers.Serializer):
|
|
user = serializers.CharField()
|
|
username = serializers.CharField()
|
|
total_hours = serializers.FloatField()
|
|
entries = serializers.ListField(child=serializers.DictField())
|