From 7fef87071934ab41a0e100145d04c0addc078dd8 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Wed, 18 Apr 2018 17:33:04 +0000 Subject: [PATCH] Require shifts to be approved first --- .../api/migrations/0002_shift_approved.py | 20 +++++++++++ caremyway/api/models.py | 1 + caremyway/api/serializers.py | 33 ++++++++++++++++--- caremyway/api/views.py | 2 +- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 caremyway/api/migrations/0002_shift_approved.py diff --git a/caremyway/api/migrations/0002_shift_approved.py b/caremyway/api/migrations/0002_shift_approved.py new file mode 100644 index 0000000..2cd374a --- /dev/null +++ b/caremyway/api/migrations/0002_shift_approved.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.1 on 2018-04-02 22:46 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='shift', + name='approved', + field=models.NullBooleanField(), + ), + ] diff --git a/caremyway/api/models.py b/caremyway/api/models.py index 42a33d7..35d6291 100644 --- a/caremyway/api/models.py +++ b/caremyway/api/models.py @@ -65,4 +65,5 @@ class Shift(models.Model): actual_end = models.DateTimeField(null=True) description = models.CharField(max_length=100, null=True) chart = models.TextField(max_length=1000, null=True) + approved = models.NullBooleanField(blank=True) deleted = models.BooleanField(default=False) diff --git a/caremyway/api/serializers.py b/caremyway/api/serializers.py index ffb0cc4..1c956dd 100644 --- a/caremyway/api/serializers.py +++ b/caremyway/api/serializers.py @@ -196,8 +196,8 @@ class CShiftSerializer(ShiftSerializer): class Meta: model = Shift - fields = ('uuid', 'chart', 'get_price_uuid', 'price', 'set_price', 'set_date', 'set_start', 'set_end', 'actual_start', 'actual_end', 'amount', 'description', 'deleted') - read_only_fields = ('chart', 'price', 'set_price', 'set_date', 'actual_start', 'actual_end', 'deleted') + fields = ('uuid', 'chart', 'get_price_uuid', 'price', 'set_price', 'set_date', 'set_start', 'set_end', 'actual_start', 'actual_end', 'amount', 'description', 'approved', 'deleted') + read_only_fields = ('chart', 'price', 'set_price', 'set_date', 'actual_start', 'actual_end', 'approved', 'deleted') def create(self, validated_data): user = self.context['request'].user @@ -234,21 +234,46 @@ class CShiftSerializer(ShiftSerializer): validated_data['price'] = price return serializers.ModelSerializer.create(self, validated_data) + def update(self, instance, validated_data): + + if instance.actual_start: + raise serializers.ValidationError("Can't update after check in.") + + # Reset approval on update + instance.approved = None + + return super().update(instance, validated_data) + class PShiftSerializer(ShiftSerializer): - action = serializers.ChoiceField(write_only=True, choices=['checkin', 'checkout']) + action = serializers.ChoiceField(write_only=True, allow_blank=True, choices=['checkin', 'checkout']) class Meta: model = Shift - fields = ('uuid', 'action', 'chart', 'price', 'set_price', 'set_date', 'set_start', 'set_end', 'actual_start', 'actual_end', 'amount', 'description', 'deleted') + fields = ('uuid', 'action', 'chart', 'price', 'set_price', 'set_date', 'set_start', 'set_end', 'actual_start', 'actual_end', 'amount', 'description', 'approved', 'deleted') read_only_fields = ('uuid', 'price', 'set_price', 'set_date', 'set_start', 'set_end', 'actual_start', 'actual_end', 'description', 'deleted') def update(self, instance, validated_data): + approved = validated_data['approved'] action = validated_data['action'] chart = validated_data['chart'] + if approved == True: + if instance.deleted: + raise serializers.ValidationError("Shift was deleted.") + + instance.approved = True + + elif approved == False: + if instance.actual_start: + raise serializers.ValidationError("Can't disapprove after check in.") + + instance.approved = False + if action == 'checkin': if instance.deleted: raise serializers.ValidationError("Shift was deleted.") + if not instance.approved: + raise serializers.ValidationError("Shift hasn't been approved.") if instance.actual_start: raise serializers.ValidationError("Already checked in.") if chart: diff --git a/caremyway/api/views.py b/caremyway/api/views.py index ee1691d..c19e66f 100644 --- a/caremyway/api/views.py +++ b/caremyway/api/views.py @@ -116,7 +116,7 @@ class CShiftViewSet(viewsets.ModelViewSet): instance = self.get_object() if instance.actual_start: - return Response("Shift already started.", status=status.HTTP_400_BAD_REQUEST) + return Response("Can't delete after check in.", status=status.HTTP_400_BAD_REQUEST) instance.deleted = True instance.save()