From 94a9d63c90b025d4aaeb07475287add64dab1fef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Barnab=C3=A1s=20Cz=C3=A9m=C3=A1n?= <trabarni@gmail.com>
Date: Sat, 3 Feb 2018 20:19:20 +0100
Subject: [PATCH] Fix deadline validate

---
 .../migrations/0013_auto_20180203_2007.py     | 18 +++++++++++++++
 .../migrations/0014_auto_20180203_2010.py     | 18 +++++++++++++++
 .../migrations/0015_auto_20180203_2014.py     | 23 +++++++++++++++++++
 src/account/models.py                         |  5 ++--
 src/account/serializers.py                    | 13 ++++++++---
 5 files changed, 72 insertions(+), 5 deletions(-)
 create mode 100644 src/account/migrations/0013_auto_20180203_2007.py
 create mode 100644 src/account/migrations/0014_auto_20180203_2010.py
 create mode 100644 src/account/migrations/0015_auto_20180203_2014.py

diff --git a/src/account/migrations/0013_auto_20180203_2007.py b/src/account/migrations/0013_auto_20180203_2007.py
new file mode 100644
index 0000000..8ac041e
--- /dev/null
+++ b/src/account/migrations/0013_auto_20180203_2007.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.0.1 on 2018-02-03 19:07
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('account', '0012_auto_20180125_1957'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='profile',
+            name='join_date',
+            field=models.DateTimeField(auto_now=True),
+        ),
+    ]
diff --git a/src/account/migrations/0014_auto_20180203_2010.py b/src/account/migrations/0014_auto_20180203_2010.py
new file mode 100644
index 0000000..0ad3c05
--- /dev/null
+++ b/src/account/migrations/0014_auto_20180203_2010.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.0.1 on 2018-02-03 19:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('account', '0013_auto_20180203_2007'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='deadline',
+            name='deadline',
+            field=models.DateTimeField(null=True),
+        ),
+    ]
diff --git a/src/account/migrations/0015_auto_20180203_2014.py b/src/account/migrations/0015_auto_20180203_2014.py
new file mode 100644
index 0000000..e823387
--- /dev/null
+++ b/src/account/migrations/0015_auto_20180203_2014.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.0.1 on 2018-02-03 19:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('account', '0014_auto_20180203_2010'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='profile',
+            name='updated_at',
+            field=models.DateTimeField(auto_now=True),
+        ),
+        migrations.AlterField(
+            model_name='profile',
+            name='join_date',
+            field=models.DateTimeField(auto_now_add=True),
+        ),
+    ]
diff --git a/src/account/models.py b/src/account/models.py
index 08fe3b7..8e86ff9 100644
--- a/src/account/models.py
+++ b/src/account/models.py
@@ -19,7 +19,8 @@ class GroupChoice(models.Model):
 
 
 class Profile(models.Model):
-    join_date = models.DateField(auto_now=True)
+    join_date = models.DateTimeField(auto_now_add=True, editable=False)
+    updated_at = models.DateTimeField(auto_now=True, editable=False)
     user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
     motivation = models.TextField(null=True)
     nick = models.CharField(max_length=15, blank=True, null=True)
@@ -32,4 +33,4 @@ class Profile(models.Model):
 
 
 class Deadline(SingletonModel):
-    deadline = models.DateField(null=True)
+    deadline = models.DateTimeField(null=True)
diff --git a/src/account/serializers.py b/src/account/serializers.py
index e04ea58..bee56c0 100644
--- a/src/account/serializers.py
+++ b/src/account/serializers.py
@@ -10,12 +10,19 @@ class ChoiceSerializer(serializers.ModelSerializer):
 
 class ProfileSerializer(serializers.ModelSerializer):
     groups = serializers.SlugRelatedField(many=True, slug_field="choice", queryset=models.GroupChoice.objects.all())
+    updated_at = serializers.DateTimeField(read_only=True)
+    signed = serializers.BooleanField()
 
     class Meta:
         model = models.Profile
-        fields = ('id', 'join_date', 'user', 'nick', 'motivation', 'signed', 'groups')
+        fields = ('id', 'join_date', 'updated_at', 'user', 'nick', 'motivation', 'signed', 'groups')
 
     def validate(self, data):
-        if data['join_date'] > models.Deadline.get_solo().deadline:
-            raise serializers.ValidationError("join_date more than deadline")
+        deadline = models.Deadline.get_solo().deadline
+        if deadline is None:
+            return data
+
+        if data['signed'] is True and data['updated_at'] > deadline:
+            raise serializers.ValidationError("You cannot join after the deadline")
+
         return data
-- 
GitLab