diff --git a/src/account/auth_pipeline.py b/src/account/auth_pipeline.py index b1918c536d09e7b1de94f3c63c249ed6eff9e5f2..abd99b924b4e7a62570c3eea830e64c87660bb9c 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 0000000000000000000000000000000000000000..8c4f05b384b49fdbfcdf90f2554089267f290912 --- /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 0000000000000000000000000000000000000000..b4ab1f0dea6c2ea83c188c6e91161552ae9e822c --- /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 4ebe686bd56ce176040582981f9e7f83d8c8f400..66cbf6c9679fd8a191d4a9e57d4303ad90d5d141 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 0cf14877821160a38115d33ceba4cd0155150d93..fd5f20fa1dff87dc6b67f05513a9ef5560b94a08 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 9ceaeb88d17e0fda47dd2fe606325c6046fa51be..79ab7de30163a980004e2f16cf5e355befcf2b05 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 98f8f62ed9dd1c4d94acef20c8a85ecfb0670dba..82f040c15458facfd7e6603558465825b2dc4c4a 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 0000000000000000000000000000000000000000..59c9ba8dcb78053ee81c265b4aa827a0f0257132 --- /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 0000000000000000000000000000000000000000..fef922a0e5a9e42fe1562f1d05fccb5c7904e75a --- /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 80ba10103fa448c7231e574eeed62a657fa9ff80..0d5d5f8ce7643b56d9fe484cf22a1eabd4e39a54 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 3308ced6d3dadeaa53862927f7e921967931e1f5..cea73e36ba326264a31b589607f59055eb890fc7 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 0000000000000000000000000000000000000000..e06f6b326d17fc96b3174b5448bbe8dbde250940 --- /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 5585d8dd4e17871e57dd379bb8c3c5f7ad41ea02..0e5ec4eecf89840db4446de752faf0c8b4cbb66f 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 66ffdaed144c5585c9a146136dbe6f661d37c038..d2615a1ee9c8fb3a6f0a39df82b85991f0899d17 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 434d8c810e92c640f55b7b236b2ba0a684346bf7..514c63bd416184b25ca57672ed24a276c72a382d 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/stats/admin.py b/src/stats/admin.py index 050ebd1b03b37e58ab3bec15a2624270a5e37082..fb841605335f9cd12025ed91abe5361dc7f806f5 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 444036a4d2dfba375360039a0e3f964eaac13655..1464e8c4d274f2d082373f47fac63a1ef48b5db9 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 0000000000000000000000000000000000000000..e088f2dfb28b840e16f6f3584ec4a5c881bce1f7 --- /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 3e826f0240a8e3ea7a4fc32469ec3c12d61b2515..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..dc96481d82ae7579977886df0d422a12d26ee01a --- /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 48f1c3687c99af521557572ee5b43ab6753c5c0b..0000000000000000000000000000000000000000 --- 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 ac48b18a93a3d57d6fc4de8a0338260b25bfa776..c6d5a7810b77f984ed4d6883193af9cab6b2f13f 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 0b2c91d6e7f22facba041f20ddc75bde720bb6d5..ed09f1115ca73dbdca23b3c3610fae5921d4b36d 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 b2f4a76ab1a720f5435987f3a5eab5ad784eaf59..63cc6ce83b8e05ecaecbd7c3eba67783818276fa 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