From 23bd685b120786ed8b14f4bc81f8e0af66c03a3d Mon Sep 17 00:00:00 2001 From: Hubert Jankowski Date: Sat, 11 Dec 2021 23:14:24 +0100 Subject: [PATCH 1/5] WIP --- config/urls.py | 8 ++++---- trials/migrations/0003_test_category.py | 18 ++++++++++++++++++ trials/models.py | 1 + 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 trials/migrations/0003_test_category.py diff --git a/config/urls.py b/config/urls.py index 06b2236..212ac1d 100644 --- a/config/urls.py +++ b/config/urls.py @@ -23,8 +23,8 @@ urlpatterns = [ path('login', login), path('logout', logout), path('register', register), - path('users', include("users.urls")), - path('questions', include("questions.urls")), - path('answers', include("answers.urls")), - path('tests', include("trials.urls")), + path('users/', include("users.urls")), + path('questions/', include("questions.urls")), + path('answers/', include("answers.urls")), + path('tests/', include("trials.urls")), ] diff --git a/trials/migrations/0003_test_category.py b/trials/migrations/0003_test_category.py new file mode 100644 index 0000000..b0c89df --- /dev/null +++ b/trials/migrations/0003_test_category.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-12-11 22:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('trials', '0002_test_passing_score'), + ] + + operations = [ + migrations.AddField( + model_name='test', + name='category', + field=models.CharField(default='', max_length=100), + ), + ] diff --git a/trials/models.py b/trials/models.py index 014c00c..3292fb6 100644 --- a/trials/models.py +++ b/trials/models.py @@ -3,6 +3,7 @@ from django.db import models class Test(models.Model): name = models.CharField(max_length=100) + category = models.CharField(max_length=100, default="") passing_score = models.PositiveSmallIntegerField(default=0) def get_score(self, answers): -- 2.20.1 From 7c18f0920aae72a294d2b6a7946e06c5c09c05cf Mon Sep 17 00:00:00 2001 From: Hubert Jankowski Date: Sun, 12 Dec 2021 11:35:35 +0100 Subject: [PATCH 2/5] WIP --- answers/serializers.py | 4 +- categories/__init__.py | 0 categories/admin.py | 3 ++ categories/apps.py | 6 +++ categories/migrations/__init__.py | 0 categories/models.py | 9 +++++ categories/serializers.py | 13 +++++++ categories/urls.py | 8 ++++ categories/views.py | 9 +++++ config/settings.py | 10 ++++- config/urls.py | 1 + questions/managers.py | 26 +++++++++++++ questions/models.py | 3 ++ questions/serializers.py | 12 ++++-- questions/urls.py | 2 +- test.json | 23 +++++++++++ trials/managers.py | 38 +++++++++++++++++++ .../migrations/0004_remove_test_category.py | 17 +++++++++ trials/models.py | 10 ++++- trials/serializers.py | 12 +++++- trials/urls.py | 6 +-- 21 files changed, 201 insertions(+), 11 deletions(-) create mode 100644 categories/__init__.py create mode 100644 categories/admin.py create mode 100644 categories/apps.py create mode 100644 categories/migrations/__init__.py create mode 100644 categories/models.py create mode 100644 categories/serializers.py create mode 100644 categories/urls.py create mode 100644 categories/views.py create mode 100644 questions/managers.py create mode 100644 test.json create mode 100644 trials/managers.py create mode 100644 trials/migrations/0004_remove_test_category.py diff --git a/answers/serializers.py b/answers/serializers.py index 131ac22..0f3e66e 100644 --- a/answers/serializers.py +++ b/answers/serializers.py @@ -4,11 +4,13 @@ from answers.models import Answer class AnswerSerializer(serializers.ModelSerializer): + + class Meta: model = Answer fields = ( "id", "description", "is_correct", - "question" + # "question" ) diff --git a/categories/__init__.py b/categories/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/categories/admin.py b/categories/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/categories/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/categories/apps.py b/categories/apps.py new file mode 100644 index 0000000..fc45e88 --- /dev/null +++ b/categories/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CategoriesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'categories' diff --git a/categories/migrations/__init__.py b/categories/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/categories/models.py b/categories/models.py new file mode 100644 index 0000000..db91d85 --- /dev/null +++ b/categories/models.py @@ -0,0 +1,9 @@ +from django.db import models + +# Create your models here. + + +class Category(models.Model): + name = models.CharField(max_length=200, default="") + + diff --git a/categories/serializers.py b/categories/serializers.py new file mode 100644 index 0000000..938f873 --- /dev/null +++ b/categories/serializers.py @@ -0,0 +1,13 @@ +from rest_framework import serializers + +from categories.models import Category + + +class CategorySerializer(serializers.ModelSerializer): + + class Meta: + model = Category + fields = ( + "id", + "name", + ) diff --git a/categories/urls.py b/categories/urls.py new file mode 100644 index 0000000..a61f94c --- /dev/null +++ b/categories/urls.py @@ -0,0 +1,8 @@ +from rest_framework.routers import DefaultRouter + +from categories.views import CategoryModelViewSet + +router = DefaultRouter() +router.register("items", CategoryModelViewSet) + +urlpatterns = router.urls diff --git a/categories/views.py b/categories/views.py new file mode 100644 index 0000000..007b918 --- /dev/null +++ b/categories/views.py @@ -0,0 +1,9 @@ +from rest_framework import viewsets + +from categories.models import Category +from categories.serializers import CategorySerializer + + +class CategoryModelViewSet(viewsets.ModelViewSet): + queryset = Category.objects.all() + serializer_class = CategorySerializer diff --git a/config/settings.py b/config/settings.py index a30645b..5a4e9c3 100644 --- a/config/settings.py +++ b/config/settings.py @@ -1,5 +1,6 @@ import json import os +from datetime import timedelta """ Django settings for config project. @@ -56,7 +57,8 @@ INSTALLED_APPS = [ "users", "trials", "answers", - "questions" + "questions", + "categories" ] MIDDLEWARE = [ @@ -153,6 +155,12 @@ if not DEVELOPMENT: }, }) +SIMPLE_JWT = { + "AUTH_HEADER_TYPES": ("Bearer", ), + 'ACCESS_TOKEN_LIFETIME': timedelta(days=365), + 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), +} + AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', diff --git a/config/urls.py b/config/urls.py index 212ac1d..efba82f 100644 --- a/config/urls.py +++ b/config/urls.py @@ -27,4 +27,5 @@ urlpatterns = [ path('questions/', include("questions.urls")), path('answers/', include("answers.urls")), path('tests/', include("trials.urls")), + path('categories/', include("categories.urls")), ] diff --git a/questions/managers.py b/questions/managers.py new file mode 100644 index 0000000..4384f71 --- /dev/null +++ b/questions/managers.py @@ -0,0 +1,26 @@ +from django.db.models import Manager +from django.apps import apps +from django.conf import settings +from categories.models import Category + + +class QuestionManager(Manager): + def create( + self, *, + answers=[], + test=None, + **kwargs + ): + Answer = apps.get_model("answers", "Answer") + instance = super().create( + test=test, + description=kwargs.get("description"), + ) + for answer in answers: + Answer.objects.create( + question=instance, + description=answer["description"], + is_correct=answer["is_correct"] + ) + return instance + diff --git a/questions/models.py b/questions/models.py index c839628..ed7e783 100644 --- a/questions/models.py +++ b/questions/models.py @@ -1,4 +1,5 @@ from django.db import models +from .managers import QuestionManager class Question(models.Model): @@ -17,3 +18,5 @@ class Question(models.Model): answer.get_secret_answer() for answer in self.answers.all() ] + + objects = QuestionManager() \ No newline at end of file diff --git a/questions/serializers.py b/questions/serializers.py index fa42a9a..9dba1ad 100644 --- a/questions/serializers.py +++ b/questions/serializers.py @@ -1,14 +1,17 @@ from rest_framework import serializers from questions.models import Question +from answers.serializers import AnswerSerializer class QuestionSerializer(serializers.ModelSerializer): - answers = serializers.SerializerMethodField() + # answers = serializers.SerializerMethodField() + # + # def get_answers(self, instance: Question): + # return instance.get_answers_secret() - def get_answers(self, instance: Question): - return instance.get_answers_secret() + answers = AnswerSerializer(many=True, required=False) class Meta: model = Question @@ -19,3 +22,6 @@ class QuestionSerializer(serializers.ModelSerializer): "answers", "test" ) + + def create(self, validated_data): + import pdb;pdb.set_trace() diff --git a/questions/urls.py b/questions/urls.py index 7e61cf7..6f3a3e7 100644 --- a/questions/urls.py +++ b/questions/urls.py @@ -2,7 +2,7 @@ from rest_framework.routers import DefaultRouter from questions.views import QuestionModelViewSet -router = DefaultRouter() +router = DefaultRouter(trailing_slash=False) router.register("items", QuestionModelViewSet) urlpatterns = router.urls diff --git a/test.json b/test.json new file mode 100644 index 0000000..bda22ee --- /dev/null +++ b/test.json @@ -0,0 +1,23 @@ +{ + "name": "asd", + "passing_score": 1, + "questions": [ + { + "name": "heja", + "description": "czesc", + "answers": [ + { + "description": "hejka_answer", + "is_correct": false + }, + { + "description": "hejka2_answer", + "is_correct": true + } + ] + } + ], + "category": { + "name": "Polski" + } +} \ No newline at end of file diff --git a/trials/managers.py b/trials/managers.py new file mode 100644 index 0000000..357b0fd --- /dev/null +++ b/trials/managers.py @@ -0,0 +1,38 @@ +from django.db.models import Manager +from django.apps import apps +from django.conf import settings +from categories.models import Category + + +class TestManager(Manager): + + def create( + self, *, + category=None, + questions=[], + **kwargs + ): + Question = apps.get_model("questions", "Question") + Answer = apps.get_model("answers", "Answer") + category = Category.objects.get_or_create( + name=category["name"] + ) + + instance = super().create( + name=kwargs.get("name"), + passing_score=kwargs.get("passing_score"), + category=category[0] + ) + for question in questions: + question_instance = Question.objects.create( + name=question["name"], + descripton=question["description"] + ) + for answer in question["answers"]: + Answer.objects.create( + description=answer["description"], + is_correct=answer["is_correct"], + question=question_instance + ) + + return instance diff --git a/trials/migrations/0004_remove_test_category.py b/trials/migrations/0004_remove_test_category.py new file mode 100644 index 0000000..e663dc1 --- /dev/null +++ b/trials/migrations/0004_remove_test_category.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.9 on 2021-12-11 22:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('trials', '0003_test_category'), + ] + + operations = [ + migrations.RemoveField( + model_name='test', + name='category', + ), + ] diff --git a/trials/models.py b/trials/models.py index 3292fb6..eea91b9 100644 --- a/trials/models.py +++ b/trials/models.py @@ -1,10 +1,18 @@ from django.db import models +from .managers import TestManager class Test(models.Model): name = models.CharField(max_length=100) - category = models.CharField(max_length=100, default="") passing_score = models.PositiveSmallIntegerField(default=0) + category = models.ForeignKey( + "categories.Category", + on_delete=models.SET_NULL, + null=True, + related_name="tests" + ) + + objects = TestManager() def get_score(self, answers): """ diff --git a/trials/serializers.py b/trials/serializers.py index 52fce74..b5496eb 100644 --- a/trials/serializers.py +++ b/trials/serializers.py @@ -2,11 +2,13 @@ from rest_framework import serializers from questions.serializers import QuestionSerializer from trials.models import Test +from categories.serializers import CategorySerializer class TestSerializer(serializers.ModelSerializer): questions = QuestionSerializer(many=True, required=False) + category = CategorySerializer(required=False) class Meta: model = Test @@ -14,5 +16,13 @@ class TestSerializer(serializers.ModelSerializer): "id", "name", "passing_score", - "questions" + "questions", + "category", ) + + def create(self, validated_data): + instance = Test.objects.create( + **validated_data + ) + return instance + diff --git a/trials/urls.py b/trials/urls.py index 3ebf009..b2139f5 100644 --- a/trials/urls.py +++ b/trials/urls.py @@ -5,12 +5,12 @@ from trials.views import TestModelViewSet from trials.views import TestTemplateView from trials.views import TestValidateAPIView -router = DefaultRouter() +router = DefaultRouter(trailing_slash=False) router.register("items", TestModelViewSet) urlpatterns = [ - path('/show/', TestTemplateView.as_view()), - path('/mark/', TestValidateAPIView.as_view()) + path('/show', TestTemplateView.as_view()), + path('/mark', TestValidateAPIView.as_view()) ] urlpatterns += router.urls -- 2.20.1 From 9fd11ead35185c61096865362ecf3d61ee662d5d Mon Sep 17 00:00:00 2001 From: Hubert Jankowski Date: Sun, 12 Dec 2021 11:36:04 +0100 Subject: [PATCH 3/5] WIP --- categories/migrations/0001_initial.py | 21 +++++++++++++++++++++ trials/migrations/0005_test_category.py | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 categories/migrations/0001_initial.py create mode 100644 trials/migrations/0005_test_category.py diff --git a/categories/migrations/0001_initial.py b/categories/migrations/0001_initial.py new file mode 100644 index 0000000..b3e05f1 --- /dev/null +++ b/categories/migrations/0001_initial.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.9 on 2021-12-11 22:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ], + ), + ] diff --git a/trials/migrations/0005_test_category.py b/trials/migrations/0005_test_category.py new file mode 100644 index 0000000..bd33b5d --- /dev/null +++ b/trials/migrations/0005_test_category.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.9 on 2021-12-11 22:36 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('categories', '0001_initial'), + ('trials', '0004_remove_test_category'), + ] + + operations = [ + migrations.AddField( + model_name='test', + name='category', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tests', to='categories.category'), + ), + ] -- 2.20.1 From 065710d84f7342d08f87ee7323bc3629ddda2026 Mon Sep 17 00:00:00 2001 From: Hubert Jankowski Date: Sun, 12 Dec 2021 23:34:54 +0100 Subject: [PATCH 4/5] Creating test --- questions/managers.py | 3 ++- questions/models.py | 2 +- trials/managers.py | 6 +++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/questions/managers.py b/questions/managers.py index 4384f71..ee23398 100644 --- a/questions/managers.py +++ b/questions/managers.py @@ -9,12 +9,13 @@ class QuestionManager(Manager): self, *, answers=[], test=None, + description=None, **kwargs ): Answer = apps.get_model("answers", "Answer") instance = super().create( test=test, - description=kwargs.get("description"), + description=description, ) for answer in answers: Answer.objects.create( diff --git a/questions/models.py b/questions/models.py index ed7e783..7e7ac72 100644 --- a/questions/models.py +++ b/questions/models.py @@ -10,7 +10,7 @@ class Question(models.Model): related_name="questions" ) name = models.CharField(max_length=200, default="") - description = models.TextField() + description = models.CharField(max_length=200) points = models.PositiveSmallIntegerField(default=1) def get_answers_secret(self): diff --git a/trials/managers.py b/trials/managers.py index 357b0fd..72c1fc9 100644 --- a/trials/managers.py +++ b/trials/managers.py @@ -23,12 +23,16 @@ class TestManager(Manager): passing_score=kwargs.get("passing_score"), category=category[0] ) + # import pdb;pdb.set_trace() for question in questions: question_instance = Question.objects.create( name=question["name"], - descripton=question["description"] + description=question["description"], + test=instance ) for answer in question["answers"]: + import pdb; + pdb.set_trace() Answer.objects.create( description=answer["description"], is_correct=answer["is_correct"], -- 2.20.1 From 660b9fb612f2f3e306218a2fe7c73d41d055e708 Mon Sep 17 00:00:00 2001 From: Hubert Jankowski Date: Sun, 12 Dec 2021 23:35:08 +0100 Subject: [PATCH 5/5] tests --- .../0003_alter_question_description.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 questions/migrations/0003_alter_question_description.py diff --git a/questions/migrations/0003_alter_question_description.py b/questions/migrations/0003_alter_question_description.py new file mode 100644 index 0000000..2874713 --- /dev/null +++ b/questions/migrations/0003_alter_question_description.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-12-12 22:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('questions', '0002_question_points'), + ] + + operations = [ + migrations.AlterField( + model_name='question', + name='description', + field=models.CharField(max_length=200), + ), + ] -- 2.20.1