From d1e844c97bca33b73481f6f60bbf8e8729392cff Mon Sep 17 00:00:00 2001 From: d0ge3 Date: Mon, 12 Apr 2021 19:15:42 +0300 Subject: [PATCH 01/19] upd answer model --- application/tests_builder/models.py | 2 +- docker-compose.yml | 34 ++++++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/application/tests_builder/models.py b/application/tests_builder/models.py index af135b3..ac64107 100644 --- a/application/tests_builder/models.py +++ b/application/tests_builder/models.py @@ -50,7 +50,7 @@ def get_questions_by_tags(cls, tags: List, count: Optional[int] = None): class Answer(models.Model): question = models.ForeignKey(Question, related_name='answers', on_delete=models.CASCADE) - text_answer = models.CharField(max_length=255) + text_answer = models.CharField(max_length=255, blank=True) is_correct = models.BooleanField() def __str__(self): diff --git a/docker-compose.yml b/docker-compose.yml index 9838c22..accca00 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,23 +25,23 @@ services: depends_on: - db - frontend: - stdin_open: true - tty: true - container_name: frontend - build: - context: ./frontend - dockerfile: Dockerfile - volumes: - - ./frontend:/app - - node-modules:/app/node_modules - ports: - - "3006:3000" - environment: - - REACT_APP_API_HOST=localhost - - REACT_APP_API_SCHEMA=http - - REACT_APP_API_PORT=8005 - - PORT=3000 + # frontend: + # stdin_open: true + # tty: true + # container_name: frontend + # build: + # context: ./frontend + # dockerfile: Dockerfile + # volumes: + # - ./frontend:/app + # - node-modules:/app/node_modules + # ports: + # - "3006:3000" + # environment: + # - REACT_APP_API_HOST=localhost + # - REACT_APP_API_SCHEMA=http + # - REACT_APP_API_PORT=8005 + # - PORT=3000 # depends_on: # - backend From be46f6e370f434d714063bbcbd39e0ef32755089 Mon Sep 17 00:00:00 2001 From: d0ge3 Date: Thu, 15 Apr 2021 15:46:48 +0300 Subject: [PATCH 02/19] uncomment frontend --- docker-compose.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index accca00..9838c22 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,23 +25,23 @@ services: depends_on: - db - # frontend: - # stdin_open: true - # tty: true - # container_name: frontend - # build: - # context: ./frontend - # dockerfile: Dockerfile - # volumes: - # - ./frontend:/app - # - node-modules:/app/node_modules - # ports: - # - "3006:3000" - # environment: - # - REACT_APP_API_HOST=localhost - # - REACT_APP_API_SCHEMA=http - # - REACT_APP_API_PORT=8005 - # - PORT=3000 + frontend: + stdin_open: true + tty: true + container_name: frontend + build: + context: ./frontend + dockerfile: Dockerfile + volumes: + - ./frontend:/app + - node-modules:/app/node_modules + ports: + - "3006:3000" + environment: + - REACT_APP_API_HOST=localhost + - REACT_APP_API_SCHEMA=http + - REACT_APP_API_PORT=8005 + - PORT=3000 # depends_on: # - backend From 6b5d24dc41f1d2edef300920e62495ff0f73b422 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 21 Apr 2021 14:38:25 +0300 Subject: [PATCH 03/19] add field tests in Course/detail/id --- application/courses_app/serializers.py | 1 + docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/application/courses_app/serializers.py b/application/courses_app/serializers.py index ddebd72..1459f69 100644 --- a/application/courses_app/serializers.py +++ b/application/courses_app/serializers.py @@ -121,6 +121,7 @@ class SectionInCourseSerializer(serializers.ModelSerializer): task_with_tick_in_section = TaskWithTickInSectionSerializer(many = True) task_with_teacher_check_in_section = TaskWithTeacherCheckInSectionSerializer(many = True) task_with_keyword_in_section = TaskWithKeywordCheckInSectionSerializer(many = True) + fixed_tests_for_section = FixedTestSerializer(many = True) class Meta: model = Section fields = '__all__' diff --git a/docker-compose.yml b/docker-compose.yml index 9838c22..45d582d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,8 +42,8 @@ services: - REACT_APP_API_SCHEMA=http - REACT_APP_API_PORT=8005 - PORT=3000 -# depends_on: -# - backend + depends_on: + - backend volumes: node-modules: From 357cd87c53c66e19987df5d2c6c2fb52e34053de Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 26 Apr 2021 13:25:01 +0300 Subject: [PATCH 04/19] add update positions after delete question in test --- application/tests_builder/models.py | 6 ++-- application/tests_builder/serializers.py | 4 +-- application/tests_builder/views.py | 18 +++++++++-- docker-compose.yml | 38 ++++++++++++------------ 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/application/tests_builder/models.py b/application/tests_builder/models.py index ac64107..a6615c0 100644 --- a/application/tests_builder/models.py +++ b/application/tests_builder/models.py @@ -78,14 +78,14 @@ def __str__(self): class FixedTestQuestion(models.Model): test = models.ForeignKey('FixedTest', on_delete=models.CASCADE, related_name='test_to_question') - question = models.ForeignKey('Question', on_delete=models.CASCADE, related_name='question_to_test') + question = models.ForeignKey('Question', null=True, on_delete=models.CASCADE, related_name='question_to_test') position = models.PositiveSmallIntegerField() class Meta: unique_together = (('test', 'question'), ('test', 'position')) - def __str__(self): - return f'{self.question.text_question}' + # def __str__(self): + # return f'{self.question.text_question}' class FixedTest(Test): diff --git a/application/tests_builder/serializers.py b/application/tests_builder/serializers.py index a9b09dc..965812a 100644 --- a/application/tests_builder/serializers.py +++ b/application/tests_builder/serializers.py @@ -67,7 +67,7 @@ def update(self, instance, validated_data): class FixedTestQuestionSerializer(serializers.ModelSerializer): - question = QuestionSerializer() + # question = QuestionSerializer() class Meta: model = models.FixedTestQuestion @@ -77,7 +77,7 @@ class Meta: class CreateFixedTestQuestionSerializer(serializers.ModelSerializer): class Meta: model = models.FixedTestQuestion - fields = ('position', 'question') + fields = ('id', 'position', 'question') class FixedTestSerializer(serializers.ModelSerializer): diff --git a/application/tests_builder/views.py b/application/tests_builder/views.py index 79e33fe..f5de966 100644 --- a/application/tests_builder/views.py +++ b/application/tests_builder/views.py @@ -1,5 +1,7 @@ from django_filters import rest_framework as django_filters -from rest_framework import viewsets, generics, filters +from rest_framework import viewsets, generics, filters, status +from rest_framework.decorators import action +from rest_framework.response import Response from tests_builder import models from tests_builder import serializers @@ -19,7 +21,19 @@ class FixedTestQuestionSet(viewsets.ModelViewSet): filter_backends = (django_filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) # filterset_fields = ('test',) # search_fields = ('test__name', 'question__text_question') - + def destroy(self, request, *args, **kwargs): + print('override destroy') + question = self.get_object() + test = question.test + posStart = question.position + 1 + question.delete() + questionsByTest = models.FixedTestQuestion.objects.filter(test=test) + for question in questionsByTest: + if question.position >= posStart: + question.position -= 1 + question.save() + + return Response(status=status.HTTP_204_NO_CONTENT) class RandomTestSet(viewsets.ModelViewSet): queryset = models.RandomTest.objects.all() diff --git a/docker-compose.yml b/docker-compose.yml index 45d582d..7b5e8e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,25 +25,25 @@ services: depends_on: - db - frontend: - stdin_open: true - tty: true - container_name: frontend - build: - context: ./frontend - dockerfile: Dockerfile - volumes: - - ./frontend:/app - - node-modules:/app/node_modules - ports: - - "3006:3000" - environment: - - REACT_APP_API_HOST=localhost - - REACT_APP_API_SCHEMA=http - - REACT_APP_API_PORT=8005 - - PORT=3000 - depends_on: - - backend + # frontend: + # stdin_open: true + # tty: true + # container_name: frontend + # build: + # context: ./frontend + # dockerfile: Dockerfile + # volumes: + # - ./frontend:/app + # - node-modules:/app/node_modules + # ports: + # - "3006:3000" + # environment: + # - REACT_APP_API_HOST=localhost + # - REACT_APP_API_SCHEMA=http + # - REACT_APP_API_PORT=8005 + # - PORT=3000 + # depends_on: + # - backend volumes: node-modules: From 9cc94c1adfc43de32055c1184f4fe648e9a15929 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 26 Apr 2021 13:26:02 +0300 Subject: [PATCH 05/19] add update positions after delete question in test --- application/tests_builder/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/application/tests_builder/views.py b/application/tests_builder/views.py index f5de966..6081aeb 100644 --- a/application/tests_builder/views.py +++ b/application/tests_builder/views.py @@ -22,7 +22,6 @@ class FixedTestQuestionSet(viewsets.ModelViewSet): # filterset_fields = ('test',) # search_fields = ('test__name', 'question__text_question') def destroy(self, request, *args, **kwargs): - print('override destroy') question = self.get_object() test = question.test posStart = question.position + 1 From b3fe310f03c956863e358ef7b7b59ae14ffd66dc Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 26 Apr 2021 14:26:38 +0300 Subject: [PATCH 06/19] add ordering questions in test by position --- application/tests_builder/serializers.py | 5 +++++ application/tests_builder/views.py | 3 +++ 2 files changed, 8 insertions(+) diff --git a/application/tests_builder/serializers.py b/application/tests_builder/serializers.py index 965812a..765ec9e 100644 --- a/application/tests_builder/serializers.py +++ b/application/tests_builder/serializers.py @@ -89,6 +89,11 @@ class Meta: fields = '__all__' read_only_fields = ('created',) + def to_representation(self, instance): + response = super().to_representation(instance) + response["questions"] = sorted(response["questions"], key=lambda x: x["position"]) + return response + @transaction.atomic def create(self, validated_data): questions_data = validated_data.pop('test_to_question') diff --git a/application/tests_builder/views.py b/application/tests_builder/views.py index 6081aeb..83e222d 100644 --- a/application/tests_builder/views.py +++ b/application/tests_builder/views.py @@ -1,4 +1,6 @@ from django_filters import rest_framework as django_filters +from django.shortcuts import get_object_or_404 +from django.http import Http404 from rest_framework import viewsets, generics, filters, status from rest_framework.decorators import action from rest_framework.response import Response @@ -11,6 +13,7 @@ class FixedTestSet(viewsets.ModelViewSet): queryset = models.FixedTest.objects.all() serializer_class = serializers.FixedTestSerializer filter_backends = (django_filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) + # ordering_fields = ['questions__position'] # filterset_fields = ('name', 'section') # search_fields = ('name', 'section__name', 'created_by__username') From d3a2c4c2063243b9cea2a34f333baa44be102019 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 26 Apr 2021 21:17:52 +0300 Subject: [PATCH 07/19] add in admin taskkeywordstream --- application/courses_app/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/courses_app/admin.py b/application/courses_app/admin.py index 144c447..912c9a6 100644 --- a/application/courses_app/admin.py +++ b/application/courses_app/admin.py @@ -6,7 +6,7 @@ Section, ClassmatesCheckedTask, TaskOption, StudentResult, Check, TaskWithTick, \ TaskWithTickStudentResult, TaskWithTeacherCheckCheck, TaskWithTeacherCheck, \ TaskWithKeyword, TaskWithTeacherCheckOption, TaskWithKeywordOption, \ - TaskWithTeacherCheckResult, TaskWithKeywordResult, TaskWithTickInStream, StudentInCourse, CourseNews, Badge, BadgeForUser, CourseFAQ + TaskWithTeacherCheckResult, TaskWithKeywordResult, TaskWithTickInStream, StudentInCourse, CourseNews, Badge, BadgeForUser, CourseFAQ, TaskWithTeacherCheckInStream admin.site.register(StudentGroup) @@ -36,7 +36,7 @@ admin.site.register(Badge) admin.site.register(BadgeForUser) admin.site.register(CourseFAQ) - +admin.site.register(TaskWithTeacherCheckInStream) UserAdmin.fieldsets += ('Custom fields set', {'fields': ('role', 'group')}), admin.site.register(User, UserAdmin) From c37fb7703648b3a3b1ec8cdc0f08f7336e515e0a Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 28 Apr 2021 13:51:24 +0300 Subject: [PATCH 08/19] password restore --- .../online_notebook_project/settings.py | 27 ++++++++++++++----- application/requirements.txt | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/application/online_notebook_project/settings.py b/application/online_notebook_project/settings.py index 1ff65ba..d8badde 100644 --- a/application/online_notebook_project/settings.py +++ b/application/online_notebook_project/settings.py @@ -11,6 +11,11 @@ """ import os +from os.path import join, dirname +from dotenv import load_dotenv + +dotenv_path = join(dirname(__file__), '.env') +load_dotenv(dotenv_path) # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -204,15 +209,25 @@ # ] +# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +# EMAIL_HOST = 'smtp.gmail.com' +# EMAIL_USE_TLS = True +# EMAIL_PORT = 587 +# EMAIL_HOST_USER = 'learnsqlitmo@gmail.com' +# EMAIL_HOST_PASSWORD = '*' + +# for dev yande email test EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_HOST = 'smtp.gmail.com' -EMAIL_USE_TLS = True -EMAIL_PORT = 587 -EMAIL_HOST_USER = 'learnsqlitmo@gmail.com' -EMAIL_HOST_PASSWORD = '*' +EMAIL_HOST = 'smtp.yandex.ru' +EMAIL_USE_TLS = False +EMAIL_USE_SSL = True +EMAIL_PORT = 465 +EMAIL_HOST_USER = os.getenv('EMAIL_LOGIN') +EMAIL_HOST_PASSWORD = os.getenv('EMAIL_PASSWORD') +DEFAULT_FROM_EMAIL = os.getenv('EMAIL_ADDRESS') DJOSER = { - 'PASSWORD_RESET_CONFIRM_URL': 'password/reset/confirm/{uid}/{token}', + 'PASSWORD_RESET_CONFIRM_URL': 'restore-confirm/{uid}/{token}', 'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}', 'ACTIVATION_URL': '#/activate/{uid}/{token}', 'SEND_ACTIVATION_EMAIL': False, diff --git a/application/requirements.txt b/application/requirements.txt index dd98f32..18f2891 100644 --- a/application/requirements.txt +++ b/application/requirements.txt @@ -33,4 +33,4 @@ pillow==7.0.0 PyMySQL[rsa] cryptography drf-yasg - +python-dotenv From 12bb61c1348c0014174068e91bca81b50c8b5eb4 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 28 Apr 2021 15:17:40 +0300 Subject: [PATCH 09/19] some fixes --- application/courses_app/views.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/application/courses_app/views.py b/application/courses_app/views.py index c259461..9a4be0c 100644 --- a/application/courses_app/views.py +++ b/application/courses_app/views.py @@ -60,6 +60,7 @@ from stats.models import StudentFixedTest + User = get_user_model() @@ -403,6 +404,13 @@ def list(self, request, **kwargs): if TaskWithKeywordResult.objects.filter(user = self.request.user, option__task_id = task["id"], perform = True): student_tasks +=1 + for task in section["task_with_teacher_check_in_section"]: + all_tasks +=1 + # if TaskWithTeacherCheckResult.objects.filter(user = self.request.user, option__task_id = task["id"], perform = True): + # student_tasks +=1 + + for task in section["fixed_tests_for_section"]: + all_tasks +=1 try: newdata.update({"status": StudentInCourse.objects.get(course = newdata["id"], user = self.request.user).status, "all_tasks": all_tasks, "student_tasks": student_tasks}) @@ -440,7 +448,7 @@ def retrieve(self, request, *args, **kwargs): try: instance = self.get_object() except (Course.DoesNotExist, KeyError): - return Response({"error": "Requested Movie does not exist"}, status=status.HTTP_404_NOT_FOUND) + return Response({"error": "Requested Course does not exist"}, status=status.HTTP_404_NOT_FOUND) serializer = self.get_serializer(instance) print ('her') newdata = dict(serializer.data) From 4bc89b17b6921c07684bdac085181c094b5c3aab Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 3 May 2021 16:47:04 +0300 Subject: [PATCH 10/19] upd teacherChekResult on_check, some fixes --- application/courses_app/models.py | 2 +- application/courses_app/views.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/application/courses_app/models.py b/application/courses_app/models.py index e9a6bb6..bf34848 100644 --- a/application/courses_app/models.py +++ b/application/courses_app/models.py @@ -304,7 +304,7 @@ class TaskWithTeacherCheckResult(models.Model): option = models.ForeignKey(TaskWithTeacherCheckOption, on_delete=models.CASCADE, related_name = 'task_with_teacher_results') description = models.CharField(max_length=1024, blank = True, null=True) perform = models.BooleanField(default=False) - on_check = models.BooleanField(default=True) + on_check = models.BooleanField(default=False) # был true file = models.FileField(upload_to='task_with_teacher_result_files/', null=True, blank=True) diff --git a/application/courses_app/views.py b/application/courses_app/views.py index 9a4be0c..06d314a 100644 --- a/application/courses_app/views.py +++ b/application/courses_app/views.py @@ -1024,6 +1024,15 @@ class TaskWithTickStudentResultCreateView(generics.CreateAPIView): serializer_class = CreateTaskWithTickStudentResultSerializer permission_classes = [permissions.AllowAny] + # def create(self, request, *args, **kwargs): + # request.data.update({"user": request.user.id}) + # serializer = self.get_serializer(data=request.data) + # serializer.is_valid(raise_exception=True) + # self.perform_create(serializer) + # headers = self.get_success_headers(serializer.data) + + # return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + class TaskWithTickStudentResultRetrieveView(generics.RetrieveAPIView): queryset = TaskWithTickStudentResult.objects.all() From 10ff45af20d825e53a6366c47d764945373fa928 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 17 May 2021 14:04:49 +0300 Subject: [PATCH 11/19] uncomment frontend in docker-compose.yml --- docker-compose.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7b5e8e2..6e597ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,25 +25,25 @@ services: depends_on: - db - # frontend: - # stdin_open: true - # tty: true - # container_name: frontend - # build: - # context: ./frontend - # dockerfile: Dockerfile - # volumes: - # - ./frontend:/app - # - node-modules:/app/node_modules - # ports: - # - "3006:3000" - # environment: - # - REACT_APP_API_HOST=localhost - # - REACT_APP_API_SCHEMA=http - # - REACT_APP_API_PORT=8005 - # - PORT=3000 - # depends_on: - # - backend + frontend: + stdin_open: true + tty: true + container_name: frontend + build: + context: ./frontend + dockerfile: Dockerfile + volumes: + - ./frontend:/app + - node-modules:/app/node_modules + ports: + - "3006:3000" + environment: + - REACT_APP_API_HOST=localhost + - REACT_APP_API_SCHEMA=http + - REACT_APP_API_PORT=8005 + - PORT=3000 + depends_on: + - backend volumes: node-modules: From 63a3b458c27911f188a7dddda8b04a3f3d87893e Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 19 May 2021 17:43:47 +0300 Subject: [PATCH 12/19] add endpoint to get test w questions, answers for student --- application/tests_builder/serializers.py | 34 ++++++++++++++++++++++++ application/tests_builder/urls.py | 1 + application/tests_builder/views.py | 4 +++ 3 files changed, 39 insertions(+) diff --git a/application/tests_builder/serializers.py b/application/tests_builder/serializers.py index 765ec9e..24afa68 100644 --- a/application/tests_builder/serializers.py +++ b/application/tests_builder/serializers.py @@ -144,3 +144,37 @@ def create(self, validated_data): random_test.tags.add(tag_data) return random_test + + + + + +class StudentAnswerSerializer(serializers.ModelSerializer): + class Meta: + model = models.Answer + fields = ('id', 'text_answer') + +class StudentQuestionSerializer(serializers.ModelSerializer): + answers = StudentAnswerSerializer(many=True) + class Meta: + model = models.Question + fields = ('id', 'text_question', 'answers') + +class StudentTestQuestionSerializer(serializers.ModelSerializer): + question = StudentQuestionSerializer() + class Meta: + model = models.FixedTestQuestion + fields = ('id', 'position', 'question') + +class StudentTestSerializer1(serializers.ModelSerializer): + questions = StudentTestQuestionSerializer(source='test_to_question', many=True) + created_by = serializers.HiddenField(default=serializers.CurrentUserDefault()) + + class Meta: + model = models.FixedTest + fields = '__all__' + + def to_representation(self, instance): + response = super().to_representation(instance) + response["questions"] = sorted(response["questions"], key=lambda x: x["position"]) + return response diff --git a/application/tests_builder/urls.py b/application/tests_builder/urls.py index 2d5c787..4075cd8 100644 --- a/application/tests_builder/urls.py +++ b/application/tests_builder/urls.py @@ -16,5 +16,6 @@ urlpatterns = [ path('answers/', views.AnswerCreate.as_view()), path('answers//', views.AnswerDetail.as_view()), + path('student_fixed_test/detail/', views.StudentFixedTestSet.as_view({'get':'retrieve'})), url(r'', include(router.urls)), ] diff --git a/application/tests_builder/views.py b/application/tests_builder/views.py index 83e222d..858e7ad 100644 --- a/application/tests_builder/views.py +++ b/application/tests_builder/views.py @@ -17,6 +17,10 @@ class FixedTestSet(viewsets.ModelViewSet): # filterset_fields = ('name', 'section') # search_fields = ('name', 'section__name', 'created_by__username') +class StudentFixedTestSet(viewsets.ReadOnlyModelViewSet): + """Получение теста с вопросами(с текстом вопроса) и ответами (без is_correct)""" + queryset = models.FixedTest.objects.all() + serializer_class = serializers.StudentTestSerializer1 class FixedTestQuestionSet(viewsets.ModelViewSet): queryset = models.FixedTestQuestion.objects.all() From 974f32d044f22e26997f5f4d505e5e18992ced6d Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 19 May 2021 19:04:13 +0300 Subject: [PATCH 13/19] add testInfo in tasks for student --- application/stats/views.py | 2 ++ docker-compose.yml | 38 +++++++++++++++++++------------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/application/stats/views.py b/application/stats/views.py index 95012bb..de1b6ae 100644 --- a/application/stats/views.py +++ b/application/stats/views.py @@ -3,6 +3,7 @@ from rest_framework import generics, views, exceptions, viewsets, filters, mixins from rest_framework.decorators import action from rest_framework.response import Response +from rest_framework import permissions from tests_builder import models as tests_models from tests_builder import serializers as tests_serializers @@ -115,6 +116,7 @@ def get_students_stats(self, request): class StudentFixedTestSet(StudentTestSet): + permission_classes = [permissions.AllowAny] queryset = stats_models.StudentFixedTest.objects.all() serializer_class = serializers.StudentFixedTestSerializer filter_backends = (django_filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) diff --git a/docker-compose.yml b/docker-compose.yml index 6e597ea..7b5e8e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,25 +25,25 @@ services: depends_on: - db - frontend: - stdin_open: true - tty: true - container_name: frontend - build: - context: ./frontend - dockerfile: Dockerfile - volumes: - - ./frontend:/app - - node-modules:/app/node_modules - ports: - - "3006:3000" - environment: - - REACT_APP_API_HOST=localhost - - REACT_APP_API_SCHEMA=http - - REACT_APP_API_PORT=8005 - - PORT=3000 - depends_on: - - backend + # frontend: + # stdin_open: true + # tty: true + # container_name: frontend + # build: + # context: ./frontend + # dockerfile: Dockerfile + # volumes: + # - ./frontend:/app + # - node-modules:/app/node_modules + # ports: + # - "3006:3000" + # environment: + # - REACT_APP_API_HOST=localhost + # - REACT_APP_API_SCHEMA=http + # - REACT_APP_API_PORT=8005 + # - PORT=3000 + # depends_on: + # - backend volumes: node-modules: From 0fdbd8c1fe18008cad88a49b2373df9263bb48ea Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 19 May 2021 19:05:51 +0300 Subject: [PATCH 14/19] uncomment frontend in docker --- docker-compose.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7b5e8e2..6e597ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,25 +25,25 @@ services: depends_on: - db - # frontend: - # stdin_open: true - # tty: true - # container_name: frontend - # build: - # context: ./frontend - # dockerfile: Dockerfile - # volumes: - # - ./frontend:/app - # - node-modules:/app/node_modules - # ports: - # - "3006:3000" - # environment: - # - REACT_APP_API_HOST=localhost - # - REACT_APP_API_SCHEMA=http - # - REACT_APP_API_PORT=8005 - # - PORT=3000 - # depends_on: - # - backend + frontend: + stdin_open: true + tty: true + container_name: frontend + build: + context: ./frontend + dockerfile: Dockerfile + volumes: + - ./frontend:/app + - node-modules:/app/node_modules + ports: + - "3006:3000" + environment: + - REACT_APP_API_HOST=localhost + - REACT_APP_API_SCHEMA=http + - REACT_APP_API_PORT=8005 + - PORT=3000 + depends_on: + - backend volumes: node-modules: From 168af95dd2eec549711783c7edffd38ae862419e Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 26 May 2021 15:21:21 +0300 Subject: [PATCH 15/19] add allowany in complete question, change on delete in test results --- application/stats/models.py | 4 ++-- application/stats/views.py | 3 +++ application/tests_builder/views.py | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/application/stats/models.py b/application/stats/models.py index 2c1198b..fa1e2fb 100644 --- a/application/stats/models.py +++ b/application/stats/models.py @@ -57,7 +57,7 @@ def finish_test(self): class StudentFixedTest(StudentTest): - test = models.ForeignKey(FixedTest, on_delete=models.PROTECT) + test = models.ForeignKey(FixedTest, on_delete=models.CASCADE) class Meta: unique_together = ('test', 'student', 'number_of_try') @@ -85,7 +85,7 @@ class Meta: class StudentFixedTestQuestion(StudentTestQuestion): - student_test = models.ForeignKey(StudentFixedTest, on_delete=models.PROTECT) + student_test = models.ForeignKey(StudentFixedTest, on_delete=models.CASCADE) class Meta: unique_together = ('student_test', 'question') diff --git a/application/stats/views.py b/application/stats/views.py index de1b6ae..4692cfc 100644 --- a/application/stats/views.py +++ b/application/stats/views.py @@ -77,6 +77,9 @@ class StudentRandomTestQuestionSet(StudentTestQuestionSet): class StudentFixedTestQuestionSet(StudentTestQuestionSet): + # TODO: пермишн нужен на студента + # здесь студент отв на по вопросы (POST) + permission_classes = [permissions.AllowAny] queryset = stats_models.StudentFixedTestQuestion.objects.all() serializer_class = serializers.StudentFixedTestQuestionSerializer filter_backends = (django_filters.DjangoFilterBackend, filters.OrderingFilter) diff --git a/application/tests_builder/views.py b/application/tests_builder/views.py index 858e7ad..bb7ef52 100644 --- a/application/tests_builder/views.py +++ b/application/tests_builder/views.py @@ -1,6 +1,7 @@ from django_filters import rest_framework as django_filters from django.shortcuts import get_object_or_404 from django.http import Http404 +from rest_framework import permissions from rest_framework import viewsets, generics, filters, status from rest_framework.decorators import action from rest_framework.response import Response @@ -19,6 +20,8 @@ class FixedTestSet(viewsets.ModelViewSet): class StudentFixedTestSet(viewsets.ReadOnlyModelViewSet): """Получение теста с вопросами(с текстом вопроса) и ответами (без is_correct)""" + # TODO: возможно сделать другой пермишн + permission_classes = [permissions.AllowAny] queryset = models.FixedTest.objects.all() serializer_class = serializers.StudentTestSerializer1 From d0f98682121243d86f578b35f7bccfaec8ff9a7b Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 26 May 2021 22:35:05 +0300 Subject: [PATCH 16/19] add results in test in course --- application/courses_app/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/application/courses_app/views.py b/application/courses_app/views.py index 06d314a..c8c1d5d 100644 --- a/application/courses_app/views.py +++ b/application/courses_app/views.py @@ -517,8 +517,12 @@ def retrieve(self, request, *args, **kwargs): for task in section["fixed_tests_for_section"]: try: - if StudentFixedTest.objects.filter(test = task["id"], student = self.request.user, is_success = True): - task.update({"status": "1"}) + results = StudentFixedTest.objects.filter(test = task["id"], student = self.request.user, is_success = True).values('correct_answers_percent') + if results: + resultsArr = [] + for item in results: + resultsArr.append(item['correct_answers_percent']) + task.update({"status": "1", "results": resultsArr }) else: task.update({"status": "0"}) except: From e7ece400c501b4a3759ee2f20df3e969ecf18e25 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 28 May 2021 22:32:08 +0300 Subject: [PATCH 17/19] add status(isJoined) in GroupInStreamNewDetailView --- application/courses_app/views.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/application/courses_app/views.py b/application/courses_app/views.py index c8c1d5d..f8e05c9 100644 --- a/application/courses_app/views.py +++ b/application/courses_app/views.py @@ -156,6 +156,16 @@ class GroupInStreamNewDetailView(generics.RetrieveAPIView): serializer_class = StudentStreamListSerializer permission_classes = [permissions.AllowAny] + def retrieve(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + newdata = dict(serializer.data) + isJoined = StudentInCourse.objects.filter(user=self.request.user, course_id=self.kwargs['pk']) + if isJoined: + newdata.update({"status": "0"}) + else: + newdata.update({"status": "1"}) + return Response(newdata) class GroupInStreamNewDeleteUpdateView(generics.RetrieveUpdateDestroyAPIView): queryset = StudentStream.objects.all() From d8c99b6a2b003945e61c4568b001507d90fe8e1a Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 28 May 2021 23:01:37 +0300 Subject: [PATCH 18/19] fix isJoined --- application/courses_app/views.py | 5 +++-- docker-compose.yml | 38 ++++++++++++++++---------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/application/courses_app/views.py b/application/courses_app/views.py index f8e05c9..e0e3afb 100644 --- a/application/courses_app/views.py +++ b/application/courses_app/views.py @@ -160,9 +160,10 @@ def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) newdata = dict(serializer.data) - isJoined = StudentInCourse.objects.filter(user=self.request.user, course_id=self.kwargs['pk']) + course = Course.objects.filter(streams_on_a_course__id=self.kwargs['pk']) + isJoined = StudentInCourse.objects.filter(user=self.request.user, course_id=course[0].id) if isJoined: - newdata.update({"status": "0"}) + newdata.update({"status": "2"}) else: newdata.update({"status": "1"}) return Response(newdata) diff --git a/docker-compose.yml b/docker-compose.yml index 6e597ea..7b5e8e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,25 +25,25 @@ services: depends_on: - db - frontend: - stdin_open: true - tty: true - container_name: frontend - build: - context: ./frontend - dockerfile: Dockerfile - volumes: - - ./frontend:/app - - node-modules:/app/node_modules - ports: - - "3006:3000" - environment: - - REACT_APP_API_HOST=localhost - - REACT_APP_API_SCHEMA=http - - REACT_APP_API_PORT=8005 - - PORT=3000 - depends_on: - - backend + # frontend: + # stdin_open: true + # tty: true + # container_name: frontend + # build: + # context: ./frontend + # dockerfile: Dockerfile + # volumes: + # - ./frontend:/app + # - node-modules:/app/node_modules + # ports: + # - "3006:3000" + # environment: + # - REACT_APP_API_HOST=localhost + # - REACT_APP_API_SCHEMA=http + # - REACT_APP_API_PORT=8005 + # - PORT=3000 + # depends_on: + # - backend volumes: node-modules: From edac2868249062a87ace90176afa882386c67cc2 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 28 May 2021 23:02:01 +0300 Subject: [PATCH 19/19] uncomment docker --- docker-compose.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7b5e8e2..6e597ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,25 +25,25 @@ services: depends_on: - db - # frontend: - # stdin_open: true - # tty: true - # container_name: frontend - # build: - # context: ./frontend - # dockerfile: Dockerfile - # volumes: - # - ./frontend:/app - # - node-modules:/app/node_modules - # ports: - # - "3006:3000" - # environment: - # - REACT_APP_API_HOST=localhost - # - REACT_APP_API_SCHEMA=http - # - REACT_APP_API_PORT=8005 - # - PORT=3000 - # depends_on: - # - backend + frontend: + stdin_open: true + tty: true + container_name: frontend + build: + context: ./frontend + dockerfile: Dockerfile + volumes: + - ./frontend:/app + - node-modules:/app/node_modules + ports: + - "3006:3000" + environment: + - REACT_APP_API_HOST=localhost + - REACT_APP_API_SCHEMA=http + - REACT_APP_API_PORT=8005 + - PORT=3000 + depends_on: + - backend volumes: node-modules: