From 9cdffdafe581fc85c2c1ad01a5690b7018204d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodor=20M=C3=A1t=C3=A9?= <bodor.mate@kszk.bme.hu> Date: Sun, 13 Jan 2019 17:06:16 +0100 Subject: [PATCH] Nem commitoltam rendszeresen mert csicska vok --- src/account/auth_pipeline.py | 2 +- .../migrations/0003_auto_20190106_1846.py | 26 +++++++++++++++++ .../migrations/0004_auto_20190107_2218.py | 20 +++++++++++++ src/account/models.py | 10 +++++-- src/account/serializers.py | 17 +++++------ src/account/views.py | 3 ++ src/common/middleware.py | 5 ++-- .../migrations/0002_auto_20190113_1239.py | 18 ++++++++++++ .../migrations/0003_document_solution.py | 20 +++++++++++++ src/document/models.py | 4 ++- src/document/serializers.py | 2 +- .../migrations/0003_auto_20190113_1239.py | 28 +++++++++++++++++++ src/homework/models.py | 17 ++--------- src/homework/serializers.py | 2 +- src/news/serializers.py | 6 +++- src/role/urls.py | 0 src/stats/admin.py | 4 +-- src/stats/migrations/0001_initial.py | 12 ++++---- .../migrations/0002_auto_20190107_2220.py | 24 ++++++++++++++++ .../migrations/0003_auto_20190105_2227.py | 24 ---------------- .../migrations/0003_auto_20190107_2224.py | 24 ++++++++++++++++ .../migrations/0004_auto_20190105_2227.py | 24 ---------------- ...105_2221.py => 0004_auto_20190113_1239.py} | 10 +++---- src/stats/models.py | 8 +++--- src/stats/serializers.py | 5 ++++ 25 files changed, 218 insertions(+), 97 deletions(-) create mode 100644 src/account/migrations/0003_auto_20190106_1846.py create mode 100644 src/account/migrations/0004_auto_20190107_2218.py create mode 100644 src/document/migrations/0002_auto_20190113_1239.py create mode 100644 src/document/migrations/0003_document_solution.py create mode 100644 src/homework/migrations/0003_auto_20190113_1239.py delete mode 100644 src/role/urls.py create mode 100644 src/stats/migrations/0002_auto_20190107_2220.py delete mode 100644 src/stats/migrations/0003_auto_20190105_2227.py create mode 100644 src/stats/migrations/0003_auto_20190107_2224.py delete mode 100644 src/stats/migrations/0004_auto_20190105_2227.py rename src/stats/migrations/{0002_auto_20190105_2221.py => 0004_auto_20190113_1239.py} (62%) diff --git a/src/account/auth_pipeline.py b/src/account/auth_pipeline.py index b1918c5..abd99b9 100644 --- a/src/account/auth_pipeline.py +++ b/src/account/auth_pipeline.py @@ -8,4 +8,4 @@ def create_profile(backend, user, response, *args, **kwargs): try: user.profile except exceptions.ObjectDoesNotExist: - models.Profile.objects.create(user=user) + models.Profile.objects.create(user=user, ) diff --git a/src/account/migrations/0003_auto_20190106_1846.py b/src/account/migrations/0003_auto_20190106_1846.py new file mode 100644 index 0000000..8c4f05b --- /dev/null +++ b/src/account/migrations/0003_auto_20190106_1846.py @@ -0,0 +1,26 @@ +# Generated by Django 2.0.1 on 2019-01-06 17:46 + +import common.middleware +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_profile_role'), + ] + + operations = [ + migrations.AlterField( + model_name='profile', + name='role', + field=models.CharField(choices=[('Staff', 'Staff'), ('Applicant', 'Applicant'), ('Student', 'Student')], default='Applicant', max_length=10), + ), + migrations.AlterField( + model_name='profile', + name='user', + field=models.OneToOneField(default=common.middleware.CurrentUserMiddleware.get_current_user, on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/src/account/migrations/0004_auto_20190107_2218.py b/src/account/migrations/0004_auto_20190107_2218.py new file mode 100644 index 0000000..b4ab1f0 --- /dev/null +++ b/src/account/migrations/0004_auto_20190107_2218.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.1 on 2019-01-07 21:18 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0003_auto_20190106_1846'), + ] + + operations = [ + migrations.AlterField( + model_name='profile', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/src/account/models.py b/src/account/models.py index 4ebe686..66cbf6c 100644 --- a/src/account/models.py +++ b/src/account/models.py @@ -1,7 +1,7 @@ from django.db import models from django.contrib.auth.models import User from solo.models import SingletonModel - +from common.middleware import CurrentUserMiddleware class GroupChoice(models.Model): TEAMS = ( @@ -26,7 +26,11 @@ class Profile(models.Model): ) 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) + user = models.OneToOneField( + User, + related_name='profile', + on_delete=models.CASCADE, + ) # TODO: Change the default to json render side motivation_about = models.TextField(blank=True, default='') motivation_profession = models.TextField(blank=True, default='') @@ -34,7 +38,7 @@ class Profile(models.Model): nick = models.CharField(max_length=15, blank=True, default='') signed = models.BooleanField(default=False, null=False) groups = models.ManyToManyField(GroupChoice, related_name='profiles') - role = models.CharField(max_length=10, choices=ROLES, default='Applicant', unique=True) + role = models.CharField(max_length=10, choices=ROLES, default='Applicant',) @property def full_name(self): diff --git a/src/account/serializers.py b/src/account/serializers.py index 0cf1487..fd5f20f 100644 --- a/src/account/serializers.py +++ b/src/account/serializers.py @@ -1,5 +1,6 @@ from rest_framework import serializers from account import models +from common.middleware import CurrentUserMiddleware class ChoiceSerializer(serializers.ModelSerializer): @@ -9,19 +10,17 @@ class ChoiceSerializer(serializers.ModelSerializer): class ProfileSerializer(serializers.ModelSerializer): - groups = serializers.SlugRelatedField(many=True, slug_field="choice", queryset=models.GroupChoice.objects.all()) + groups = serializers.SlugRelatedField(many=True, slug_field='choice', queryset=models.GroupChoice.objects.all()) updated_at = serializers.DateTimeField(read_only=True) signed = serializers.BooleanField() full_name = serializers.SerializerMethodField() class Meta: model = models.Profile - read_only_fields = ('role', ) fields = ( 'id', 'join_date', 'updated_at', - 'user', 'nick', 'signed', 'groups', @@ -34,12 +33,14 @@ class ProfileSerializer(serializers.ModelSerializer): def validate(self, data): deadline = models.Deadline.get_solo().deadline - if deadline is None: - return data - - if data['signed'] is True and data['updated_at'] > deadline: + if data['signed'] is False: + raise serializers.ValidationError("You cannot join without signed") + if deadline is not None and data['updated_at'] > deadline: raise serializers.ValidationError("You cannot join after the deadline") - + modifier_role = CurrentUserMiddleware.get_current_user_profile().role + role = data['role'] + if role is not None and modifier_role != 'Staff': + raise serializers.ValidationError("You don't have permission to change role") return data def get_full_name(self, obj): diff --git a/src/account/views.py b/src/account/views.py index 9ceaeb8..79ab7de 100644 --- a/src/account/views.py +++ b/src/account/views.py @@ -14,6 +14,9 @@ class ProfileViewSet(viewsets.ModelViewSet): def get_queryset(self): user = self.request.user if user.has_perm(permissions.IsAdminUser): + role = self.request.query_params.get("role", None) + if role is not None: + return models.Profile.objects.filter(role=role) return models.Profile.objects.all() return models.Profile.objects.filter(pk=user.profile.id) diff --git a/src/common/middleware.py b/src/common/middleware.py index 98f8f62..82f040c 100644 --- a/src/common/middleware.py +++ b/src/common/middleware.py @@ -12,7 +12,8 @@ class CurrentUserMiddleware(object): _profile.value = request.user return self.get_response(request) - - #@property def get_current_user_profile(): return _profile.value.profile + + def get_current_user(): + return _profile.value diff --git a/src/document/migrations/0002_auto_20190113_1239.py b/src/document/migrations/0002_auto_20190113_1239.py new file mode 100644 index 0000000..59c9ba8 --- /dev/null +++ b/src/document/migrations/0002_auto_20190113_1239.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.1 on 2019-01-13 11:39 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('document', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='document', + old_name='files', + new_name='file', + ), + ] diff --git a/src/document/migrations/0003_document_solution.py b/src/document/migrations/0003_document_solution.py new file mode 100644 index 0000000..fef922a --- /dev/null +++ b/src/document/migrations/0003_document_solution.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.1 on 2019-01-13 11:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('homework', '0003_auto_20190113_1239'), + ('document', '0002_auto_20190113_1239'), + ] + + operations = [ + migrations.AddField( + model_name='document', + name='solution', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='files', to='homework.Solution'), + ), + ] diff --git a/src/document/models.py b/src/document/models.py index 80ba101..0d5d5f8 100644 --- a/src/document/models.py +++ b/src/document/models.py @@ -2,6 +2,7 @@ from django.db import models from django.core import validators from account.models import Profile +from homework.models import Solution from common.validators import FileSizeValidator @@ -10,7 +11,7 @@ class Document(models.Model): uploaded_at = models.DateTimeField(auto_now_add=True, editable=False) name = models.CharField(max_length=150) description = models.TextField() - files = models.FileField( + file = models.FileField( validators=[ validators.FileExtensionValidator([ 'png', @@ -21,6 +22,7 @@ class Document(models.Model): FileSizeValidator(size_limit=52428800), # 52428800 - 50MiB ], ) + solution = models.ForeignKey(Solution, related_name='files', on_delete=models.DO_NOTHING, blank=True, null=True,) def __str__(self): return self.name diff --git a/src/document/serializers.py b/src/document/serializers.py index 3308ced..cea73e3 100644 --- a/src/document/serializers.py +++ b/src/document/serializers.py @@ -10,7 +10,7 @@ class DocumentSerializer(serializers.ModelSerializer): class Meta: model = models.Document - fields = ('uploaded_by', 'uploaded_at', 'name', 'description', 'file') + fields = ('uploaded_by', 'uploaded_at', 'name', 'description', 'file', 'uploaded_by_name', 'solution', ) def get_uploaded_by_name(self, obj): return obj.uploaded_by.full_name diff --git a/src/homework/migrations/0003_auto_20190113_1239.py b/src/homework/migrations/0003_auto_20190113_1239.py new file mode 100644 index 0000000..e06f6b3 --- /dev/null +++ b/src/homework/migrations/0003_auto_20190113_1239.py @@ -0,0 +1,28 @@ +# Generated by Django 2.0.1 on 2019-01-13 11:39 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('homework', '0002_auto_20190105_1922'), + ] + + operations = [ + migrations.RemoveField( + model_name='solution', + name='files', + ), + migrations.AlterField( + model_name='solution', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='solution', to='account.Profile'), + ), + migrations.AlterField( + model_name='solution', + name='task', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='solution', to='homework.Task'), + ), + ] diff --git a/src/homework/models.py b/src/homework/models.py index 5585d8d..0e5ec4e 100755 --- a/src/homework/models.py +++ b/src/homework/models.py @@ -5,6 +5,7 @@ from common.validators import FileSizeValidator from account.models import Profile + class Task(models.Model): created_by = models.ForeignKey(Profile, on_delete=models.DO_NOTHING) created_at = models.DateTimeField(auto_now_add=True, editable=False) @@ -12,31 +13,19 @@ class Task(models.Model): title = models.CharField(max_length=150) text = models.TextField() deadline = models.DateTimeField() - # dokumentum kezeles def __str__(self): return self.title class Solution(models.Model): - task = models.ForeignKey(Task, related_name='task_solution', on_delete=models.CASCADE) - created_by = models.ForeignKey(Profile, related_name='student_solution', on_delete=models.DO_NOTHING) + task = models.ForeignKey(Task, related_name='solution', on_delete=models.CASCADE) + created_by = models.ForeignKey(Profile, related_name='solution', on_delete=models.DO_NOTHING) created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True, editable=False) note = models.TextField() accepted = models.BooleanField() corrected = models.BooleanField() - files = models.FileField( - validators=[ - validators.FileExtensionValidator([ - 'png', - 'jpeg', - 'jpg', - 'zip', - ]), - FileSizeValidator(size_limit=52428800), # 52428800 - 50MiB - ], - ) def __str__(self): return "[{}] {}".format(self.created_at, self.created_by.full_name) diff --git a/src/homework/serializers.py b/src/homework/serializers.py index 66ffdae..d2615a1 100755 --- a/src/homework/serializers.py +++ b/src/homework/serializers.py @@ -26,7 +26,7 @@ class SolutionSerializer(serializers.ModelSerializer): class Meta: model = models.Solution - read_only_fields = ('created_by', 'created_at', 'updated_at', 'ready') + read_only_fields = ('created_by', 'created_at', 'updated_at', 'ready', 'files') fields = ( 'task', 'created_at', diff --git a/src/news/serializers.py b/src/news/serializers.py index 434d8c8..514c63b 100644 --- a/src/news/serializers.py +++ b/src/news/serializers.py @@ -6,6 +6,7 @@ from common.serializers import CurrentUserProfileDefault class ArticleSerializer(serializers.ModelSerializer): updated_by = serializers.HiddenField(default=CurrentUserProfileDefault()) last_update_by = serializers.SerializerMethodField() + author = serializers.SerializerMethodField() class Meta: model = Article @@ -13,4 +14,7 @@ class ArticleSerializer(serializers.ModelSerializer): fields = '__all__' def get_last_update_by(self, obj): - return obj.updated_by.id + return obj.updated_by.full_name + + def get_author(self, obj): + return obj.author.full_name diff --git a/src/role/urls.py b/src/role/urls.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/stats/admin.py b/src/stats/admin.py index 050ebd1..fb84160 100644 --- a/src/stats/admin.py +++ b/src/stats/admin.py @@ -15,7 +15,7 @@ class EventAdmin(ExportMixin, admin.ModelAdmin): @admin.register(models.Note) class NoteAdmin(ExportMixin, admin.ModelAdmin): - list_display = ('user', 'note', 'event', 'created_by', 'created_at', 'updated_at') - list_filter = ('user', 'created_by', 'event') + list_display = ('profile', 'note', 'event', 'created_by', 'created_at', 'updated_at') + list_filter = ('profile', 'created_by', 'event') search_fields = ('event__name', 'note') resource_class = resources.NoteResource diff --git a/src/stats/migrations/0001_initial.py b/src/stats/migrations/0001_initial.py index 444036a..1464e8c 100644 --- a/src/stats/migrations/0001_initial.py +++ b/src/stats/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.1 on 2018-12-24 16:02 +# Generated by Django 2.0.1 on 2019-01-07 21:18 from django.db import migrations, models import django.db.models.deletion @@ -9,7 +9,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('account', '0001_initial'), + ('account', '0004_auto_20190107_2218'), ] operations = [ @@ -21,7 +21,7 @@ class Migration(migrations.Migration): ('date', models.DateTimeField()), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_event', to='account.Profile')), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='created_event', to='account.Profile')), ('visitors', models.ManyToManyField(related_name='visitor', to='account.Profile')), ], ), @@ -32,9 +32,9 @@ class Migration(migrations.Migration): ('note', models.TextField()), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_notes', to='account.Profile')), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes_event', to='stats.Event')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes_user', to='account.Profile')), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='created_notes', to='account.Profile')), + ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='stats.Event')), + ('profile', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='account.Profile')), ], ), ] diff --git a/src/stats/migrations/0002_auto_20190107_2220.py b/src/stats/migrations/0002_auto_20190107_2220.py new file mode 100644 index 0000000..e088f2d --- /dev/null +++ b/src/stats/migrations/0002_auto_20190107_2220.py @@ -0,0 +1,24 @@ +# Generated by Django 2.0.1 on 2019-01-07 21:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stats', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='note', + name='event', + field=models.ForeignKey(blank=True, default='', on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='stats.Event'), + ), + migrations.AlterField( + model_name='note', + name='profile', + field=models.ForeignKey(blank=True, default='', on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='account.Profile'), + ), + ] diff --git a/src/stats/migrations/0003_auto_20190105_2227.py b/src/stats/migrations/0003_auto_20190105_2227.py deleted file mode 100644 index 3e826f0..0000000 --- a/src/stats/migrations/0003_auto_20190105_2227.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.0.1 on 2019-01-05 21:27 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('stats', '0002_auto_20190105_2221'), - ] - - operations = [ - migrations.AlterField( - model_name='note', - name='event', - field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='notes_event', to='stats.Event'), - ), - migrations.AlterField( - model_name='note', - name='user', - field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='notes_user', to='account.Profile'), - ), - ] diff --git a/src/stats/migrations/0003_auto_20190107_2224.py b/src/stats/migrations/0003_auto_20190107_2224.py new file mode 100644 index 0000000..dc96481 --- /dev/null +++ b/src/stats/migrations/0003_auto_20190107_2224.py @@ -0,0 +1,24 @@ +# Generated by Django 2.0.1 on 2019-01-07 21:24 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stats', '0002_auto_20190107_2220'), + ] + + operations = [ + migrations.AlterField( + model_name='note', + name='event', + field=models.ForeignKey(blank=True, default='', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='stats.Event'), + ), + migrations.AlterField( + model_name='note', + name='profile', + field=models.ForeignKey(blank=True, default='', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='account.Profile'), + ), + ] diff --git a/src/stats/migrations/0004_auto_20190105_2227.py b/src/stats/migrations/0004_auto_20190105_2227.py deleted file mode 100644 index 48f1c36..0000000 --- a/src/stats/migrations/0004_auto_20190105_2227.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.0.1 on 2019-01-05 21:27 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('stats', '0003_auto_20190105_2227'), - ] - - operations = [ - migrations.AlterField( - model_name='note', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes_event', to='stats.Event'), - ), - migrations.AlterField( - model_name='note', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes_user', to='account.Profile'), - ), - ] diff --git a/src/stats/migrations/0002_auto_20190105_2221.py b/src/stats/migrations/0004_auto_20190113_1239.py similarity index 62% rename from src/stats/migrations/0002_auto_20190105_2221.py rename to src/stats/migrations/0004_auto_20190113_1239.py index ac48b18..c6d5a78 100644 --- a/src/stats/migrations/0002_auto_20190105_2221.py +++ b/src/stats/migrations/0004_auto_20190113_1239.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.1 on 2019-01-05 21:21 +# Generated by Django 2.0.1 on 2019-01-13 11:39 from django.db import migrations, models import django.db.models.deletion @@ -7,18 +7,18 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('stats', '0001_initial'), + ('stats', '0003_auto_20190107_2224'), ] operations = [ migrations.AlterField( model_name='note', name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes_event', to='stats.Event'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='stats.Event'), ), migrations.AlterField( model_name='note', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes_user', to='account.Profile'), + name='profile', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='account.Profile'), ), ] diff --git a/src/stats/models.py b/src/stats/models.py index 0b2c91d..ed09f11 100644 --- a/src/stats/models.py +++ b/src/stats/models.py @@ -8,7 +8,7 @@ class Event(models.Model): name = models.CharField(max_length=255) date = models.DateTimeField(null=False) visitors = models.ManyToManyField(Profile, related_name='visitor') - created_by = models.ForeignKey(Profile, related_name='created_event', on_delete=models.CASCADE) + created_by = models.ForeignKey(Profile, related_name='created_event', on_delete=models.DO_NOTHING) created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True, editable=False) @@ -17,10 +17,10 @@ class Event(models.Model): class Note(models.Model): - event = models.ForeignKey(Event, related_name='notes_event', on_delete=models.CASCADE, blank=True, null=True, ) - user = models.ForeignKey(Profile, related_name='notes_user', on_delete=models.CASCADE, blank=True, null=True, ) + event = models.ForeignKey(Event, related_name='notes', on_delete=models.CASCADE, blank=True, null=True,) + profile = models.ForeignKey(Profile, related_name='notes', on_delete=models.CASCADE, blank=True, null=True,) note = models.TextField() - created_by = models.ForeignKey(Profile, related_name='created_notes', on_delete=models.CASCADE) + created_by = models.ForeignKey(Profile, related_name='created_notes', on_delete=models.DO_NOTHING) created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True, editable=False) diff --git a/src/stats/serializers.py b/src/stats/serializers.py index b2f4a76..63cc6ce 100644 --- a/src/stats/serializers.py +++ b/src/stats/serializers.py @@ -31,3 +31,8 @@ class NoteSerializer(serializers.ModelSerializer): def get_created_by_name(self, obj): return obj.created_by.full_name + + def validate(self, data): + if data['profile'] is None and data['event'] is None: + raise serializers.ValidationError('You have to add profile or event') + return data -- GitLab