From 83af9396517e111377169d5bd2ab0d70868a6b23 Mon Sep 17 00:00:00 2001 From: arastasci Date: Fri, 22 Nov 2024 14:57:02 +0300 Subject: [PATCH] fix serializer - signal discrepancy --- backend/app/migrations/0001_initial.py | 316 ++++-------------- ...move_post_tags_delete_question_and_more.py | 42 --- backend/app/models.py | 18 +- backend/app/serializers.py | 10 +- backend/app/signals.py | 2 +- 5 files changed, 69 insertions(+), 319 deletions(-) delete mode 100644 backend/app/migrations/0002_remove_quiz_tags_remove_post_tags_delete_question_and_more.py diff --git a/backend/app/migrations/0001_initial.py b/backend/app/migrations/0001_initial.py index fb2860bb..01c414c4 100644 --- a/backend/app/migrations/0001_initial.py +++ b/backend/app/migrations/0001_initial.py @@ -1,9 +1,10 @@ -# Generated by Django 5.1.3 on 2024-11-21 20:11 +# Generated by Django 4.2.16 on 2024-11-22 11:51 -import django.db.models.deletion -import django.utils.timezone from django.conf import settings +import django.contrib.postgres.fields from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone class Migration(migrations.Migration): @@ -16,293 +17,90 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name="Quiz", + name='Word', fields=[ - ("id", models.AutoField(primary_key=True, serialize=False)), - ("title", models.CharField(max_length=100)), - ("description", models.TextField()), - ("author", models.CharField(max_length=100)), - ("created_at", models.DateTimeField(default=django.utils.timezone.now)), - ("times_taken", models.IntegerField(default=0)), - ("total_score", models.FloatField(default=0)), - ("time_limit", models.IntegerField(default=0)), - ("like_count", models.IntegerField(default=0)), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('word', models.CharField(max_length=255, unique=True)), + ('language', models.CharField(default='eng', max_length=3)), + ('level', models.CharField(blank=True, max_length=20, null=True)), + ('part_of_speech', models.CharField(blank=True, max_length=20, null=True)), + ('meaning', models.CharField(default='Meaning not available', max_length=1000)), + ('sentence', models.CharField(default='Sentence not available', max_length=1000)), ], ), migrations.CreateModel( - name="Tags", + name='Translation', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=30, unique=True)), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('translation', models.CharField(max_length=255)), + ('word', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='app.word')), ], ), migrations.CreateModel( - name="Word", + name='Relationship', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("word", models.CharField(max_length=255, unique=True)), - ("language", models.CharField(default="eng", max_length=3)), - ("level", models.CharField(blank=True, max_length=20, null=True)), - ( - "part_of_speech", - models.CharField(blank=True, max_length=20, null=True), - ), - ( - "meaning", - models.CharField(default="Meaning not available", max_length=1000), - ), - ( - "sentence", - models.CharField(default="Sentence not available", max_length=1000), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('relation_type', models.CharField(max_length=50)), + ('related_word', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='related_to', to='app.word')), + ('word', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relationships', to='app.word')), ], ), migrations.CreateModel( - name="ActivityStream", + name='Profile', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("verb", models.CharField(max_length=50)), - ("object_type", models.CharField(max_length=50)), - ("object_id", models.IntegerField()), - ("timestamp", models.DateTimeField(default=django.utils.timezone.now)), - ( - "actor", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="activities", - to=settings.AUTH_USER_MODEL, - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=100, null=True)), + ('level', models.CharField(choices=[('A1', 'A1'), ('A2', 'A2'), ('B1', 'B1'), ('B2', 'B2'), ('C1', 'C1'), ('C2', 'C2'), ('NA', 'NA')], default='A1', max_length=2)), + ('following', models.ManyToManyField(blank=True, related_name='followers', to='app.profile')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( - name="Post", + name='Post', fields=[ - ("id", models.AutoField(primary_key=True, serialize=False)), - ("title", models.CharField(max_length=100)), - ("description", models.TextField()), - ("created_at", models.DateTimeField(default=django.utils.timezone.now)), - ("author", models.CharField(max_length=100)), - ("like_count", models.IntegerField(default=0)), - ( - "liked_by", - models.ManyToManyField( - blank=True, - related_name="liked_posts", - to=settings.AUTH_USER_MODEL, - ), - ), - ("tags", models.ManyToManyField(related_name="posts", to="app.tags")), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('tags', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=50), blank=True, default=list, help_text='List of tags associated with the post.', size=None)), + ('title', models.CharField(max_length=100)), + ('description', models.TextField()), + ('created_at', models.DateTimeField(default=django.utils.timezone.now)), + ('author', models.CharField(max_length=100)), + ('like_count', models.IntegerField(default=0)), + ('liked_by', models.ManyToManyField(blank=True, related_name='liked_posts', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( - name="Comment", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("body", models.TextField()), - ("created_at", models.DateTimeField(auto_now_add=True)), - ( - "author", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="comments", - to=settings.AUTH_USER_MODEL, - ), - ), - ( - "parent", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="replies", - to="app.comment", - ), - ), - ( - "post", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="comments", - to="app.post", - ), - ), - ], - ), - migrations.CreateModel( - name="Profile", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(blank=True, max_length=100, null=True)), - ("level", models.IntegerField(blank=True, default=1, null=True)), - ( - "following", - models.ManyToManyField( - blank=True, related_name="followers", to="app.profile" - ), - ), - ( - "user", - models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="profile", - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - migrations.CreateModel( - name="Question", - fields=[ - ("id", models.AutoField(primary_key=True, serialize=False)), - ("question_text", models.TextField()), - ("choice1", models.CharField(max_length=100)), - ("choice2", models.CharField(max_length=100)), - ("choice3", models.CharField(max_length=100)), - ("choice4", models.CharField(max_length=100)), - ("correct_choice", models.IntegerField()), - ( - "quiz", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="questions", - to="app.quiz", - ), - ), - ], - ), - migrations.AddField( - model_name="quiz", - name="tags", - field=models.ManyToManyField(related_name="quizzes", to="app.tags"), - ), - migrations.CreateModel( - name="Translation", + name='Comment', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("translation", models.CharField(max_length=255)), - ( - "word", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="translations", - to="app.word", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('body', models.TextField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to=settings.AUTH_USER_MODEL)), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='replies', to='app.comment')), + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='app.post')), ], ), migrations.CreateModel( - name="Relationship", + name='ActivityStream', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("relation_type", models.CharField(max_length=50)), - ( - "related_word", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="related_to", - to="app.word", - ), - ), - ( - "word", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="relationships", - to="app.word", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('verb', models.CharField(max_length=50)), + ('object_type', models.CharField(max_length=50)), + ('object_id', models.IntegerField()), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( - name="Bookmark", + name='Bookmark', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("created_at", models.DateTimeField(auto_now_add=True)), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="bookmarks", - to=settings.AUTH_USER_MODEL, - ), - ), - ( - "post", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="bookmarked_by", - to="app.post", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bookmarked_by', to='app.post')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bookmarks', to=settings.AUTH_USER_MODEL)), ], options={ - "ordering": ["-created_at"], - "unique_together": {("user", "post")}, + 'ordering': ['-created_at'], + 'unique_together': {('user', 'post')}, }, ), ] diff --git a/backend/app/migrations/0002_remove_quiz_tags_remove_post_tags_delete_question_and_more.py b/backend/app/migrations/0002_remove_quiz_tags_remove_post_tags_delete_question_and_more.py deleted file mode 100644 index 9e659b33..00000000 --- a/backend/app/migrations/0002_remove_quiz_tags_remove_post_tags_delete_question_and_more.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 5.1.3 on 2024-11-21 20:46 - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("app", "0001_initial"), - ] - - operations = [ - migrations.RemoveField( - model_name="quiz", - name="tags", - ), - migrations.RemoveField( - model_name="post", - name="tags", - ), - migrations.DeleteModel( - name="Question", - ), - migrations.DeleteModel( - name="Quiz", - ), - migrations.DeleteModel( - name="Tags", - ), - migrations.AddField( - model_name="post", - name="tags", - field=django.contrib.postgres.fields.ArrayField( - base_field=models.CharField(max_length=50), - blank=True, - default=list, - help_text="List of tags associated with the post.", - size=None, - ), - ), - ] diff --git a/backend/app/models.py b/backend/app/models.py index f470d6f7..39cb5e4f 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -1,5 +1,4 @@ from django.db import models -from django.contrib.auth.models import AbstractUser from django.utils import timezone from django.contrib.auth.models import User from django.utils.timezone import now @@ -12,18 +11,15 @@ ('B2', 'B2'), ('C1', 'C1'), ('C2', 'C2'), + ('NA', 'NA') ] -class CustomUser(User): - level = models.CharField(max_length=2, choices=LEVEL_CHOICES, default='A1') - - def __str__(self): - return self.username class Profile(models.Model): - user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name="profile") + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") name = models.CharField(max_length=100,null=True, blank=True) following = models.ManyToManyField("self", symmetrical=False, related_name="followers", blank=True) + level = models.CharField(max_length=2, choices=LEVEL_CHOICES, default='A1') def __str__(self): return self.name @@ -42,7 +38,7 @@ class Post(models.Model): created_at = models.DateTimeField(default=timezone.now) author = models.CharField(max_length=100) like_count = models.IntegerField(default=0) - liked_by = models.ManyToManyField(CustomUser, related_name='liked_posts', blank=True) + liked_by = models.ManyToManyField(User, related_name='liked_posts', blank=True) def __str__(self): return self.title @@ -76,7 +72,7 @@ def __str__(self): return f"{self.translation} (Translation of {self.word})" class ActivityStream(models.Model): - actor = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='activities') + actor = models.ForeignKey(User, on_delete=models.CASCADE, related_name='activities') verb = models.CharField(max_length=50) # liked, created, followed object_type = models.CharField(max_length=50) # Quiz, Post object_id = models.IntegerField() #Quiz ID Post ID @@ -88,7 +84,7 @@ def __str__(self): class Comment(models.Model): post = models.ForeignKey('Post', on_delete=models.CASCADE, related_name='comments') # Assuming a Post model exists - author = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='comments') + author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments') body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name='replies', null=True, blank=True) @@ -97,7 +93,7 @@ def __str__(self): return f'Comment by {self.author.username} on {self.post}' class Bookmark(models.Model): - user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='bookmarks') + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bookmarks') post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='bookmarked_by') created_at = models.DateTimeField(auto_now_add=True) diff --git a/backend/app/serializers.py b/backend/app/serializers.py index e395143b..908898cc 100644 --- a/backend/app/serializers.py +++ b/backend/app/serializers.py @@ -1,5 +1,6 @@ from rest_framework import serializers -from .models import Profile, Post, Comment, CustomUser +from django.contrib.auth.models import User +from .models import Profile, Post, Comment @@ -35,21 +36,18 @@ def get_following_count(self, obj): class UserSerializer(serializers.ModelSerializer): class Meta: - model = CustomUser + model = User fields = ('username', 'password', 'email') extra_kwargs = {'password': {'write_only': True}} def create(self, validated_data): # Create the user - user = CustomUser.objects.create_user( + user = User.objects.create_user( username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] ) - - Profile.objects.create(user=user, name=user.username) - return user def update(self, instance, validated_data): diff --git a/backend/app/signals.py b/backend/app/signals.py index 1496691c..510d88dc 100644 --- a/backend/app/signals.py +++ b/backend/app/signals.py @@ -7,5 +7,5 @@ @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created and not hasattr(instance, 'profile'): - Profile.objects.create(user=instance) + Profile.objects.create(user=instance, level='NA')