From be592d215732161f5c9891db8e5677c286538c3b Mon Sep 17 00:00:00 2001 From: ddungiii Date: Thu, 8 Feb 2024 17:29:29 +0900 Subject: [PATCH 1/6] feat: add name to timetable and api --- apps/timetable/migrations/0007_add_name.py | 27 ++++++++++++++++++++++ apps/timetable/models.py | 2 ++ apps/timetable/views.py | 23 ++++++++++++++++++ otlplus/urls.py | 3 +++ 4 files changed, 55 insertions(+) create mode 100644 apps/timetable/migrations/0007_add_name.py diff --git a/apps/timetable/migrations/0007_add_name.py b/apps/timetable/migrations/0007_add_name.py new file mode 100644 index 000000000..93eabc3dd --- /dev/null +++ b/apps/timetable/migrations/0007_add_name.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.28 on 2024-02-08 07:34 + +from django.db import migrations, models + +from apps.timetable.models import Timetable + + +class Migration(migrations.Migration): + + dependencies = [ + ('timetable', '0006_auto_20220123_1745'), + ] + + def generate_default_name(apps, schema_editor): + for timetable in Timetable.objects.all(): + timetable.name = f'table {timetable.arrange_order + 1}' + timetable.save() + + operations = [ + migrations.AddField( + model_name='timetable', + name='name', + field=models.CharField(max_length=20), + preserve_default=False, + ), + migrations.RunPython(generate_default_name) + ] diff --git a/apps/timetable/models.py b/apps/timetable/models.py index 110edb7d0..f947a487c 100644 --- a/apps/timetable/models.py +++ b/apps/timetable/models.py @@ -11,6 +11,7 @@ class Timetable(models.Model): year = models.IntegerField(null=True, db_index=True) # 몇넌도의 타임테이블인지 semester = models.SmallIntegerField(null=True, db_index=True) # 어떤학기의 타임테이블인지 arrange_order = models.SmallIntegerField(db_index=True) + name = models.CharField(max_length=20) def to_json(self, nested=False): result = { @@ -18,6 +19,7 @@ def to_json(self, nested=False): "lectures": [lecture.to_json(nested=False) for lecture in self.lectures.filter(deleted=False)], "arrange_order": self.arrange_order, + "name": self.name } return result diff --git a/apps/timetable/views.py b/apps/timetable/views.py index d57f5d5a7..2f78c9c06 100644 --- a/apps/timetable/views.py +++ b/apps/timetable/views.py @@ -199,6 +199,29 @@ def post(self, request, user_id, timetable_id): return JsonResponse(timetable.to_json()) +@method_decorator(login_required_ajax, name="dispatch") +class UserInstanceTimetableInstanceChangeNameView(View): + def post(self, request, user_id, timetable_id): + BODY_STRUCTURE = [ + ("name", ParseType.STR, True, []), + ] + + userprofile = request.user.userprofile + if userprofile.id != int(user_id): + return HttpResponse(status=401) + + try: + timetable = userprofile.timetables.get(id=timetable_id) + except Timetable.DoesNotExist: + return HttpResponseNotFound() + + name, = parse_body(request.body, BODY_STRUCTURE) + + Timetable.objects.filter(id=timetable_id).update(name=name) + return JsonResponse(timetable.to_json()) + + + @method_decorator(login_required_ajax, name="dispatch") class UserInstanceWishlistView(View): def get(self, request, user_id): diff --git a/otlplus/urls.py b/otlplus/urls.py index 58da6ae24..38a0d36c7 100644 --- a/otlplus/urls.py +++ b/otlplus/urls.py @@ -70,6 +70,9 @@ timetable_views.UserInstanceTimetableInstanceRemoveLectureView.as_view()), url(r"^api/users/(?P\d+)/timetables/(?P\d+)/reorder", timetable_views.UserInstanceTimetableInstanceReorderView.as_view()), + url(r"^api/users/(?P\d+)/timetables/(?P\d+)/change-name", + timetable_views.UserInstanceTimetableInstanceChangeNameView.as_view()), + url(r"^api/users/(?P\d+)/planners$", planner_views.UserInstancePlannerListView.as_view()), From c2c4111d8827afd815182d974bd56cefc725c749 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Thu, 8 Feb 2024 17:37:48 +0900 Subject: [PATCH 2/6] feat: change endpoint of changing name --- apps/timetable/views.py | 2 +- otlplus/urls.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/timetable/views.py b/apps/timetable/views.py index 2f78c9c06..9a5b62717 100644 --- a/apps/timetable/views.py +++ b/apps/timetable/views.py @@ -201,7 +201,7 @@ def post(self, request, user_id, timetable_id): @method_decorator(login_required_ajax, name="dispatch") class UserInstanceTimetableInstanceChangeNameView(View): - def post(self, request, user_id, timetable_id): + def patch(self, request, user_id, timetable_id): BODY_STRUCTURE = [ ("name", ParseType.STR, True, []), ] diff --git a/otlplus/urls.py b/otlplus/urls.py index 38a0d36c7..02fb6296a 100644 --- a/otlplus/urls.py +++ b/otlplus/urls.py @@ -70,7 +70,7 @@ timetable_views.UserInstanceTimetableInstanceRemoveLectureView.as_view()), url(r"^api/users/(?P\d+)/timetables/(?P\d+)/reorder", timetable_views.UserInstanceTimetableInstanceReorderView.as_view()), - url(r"^api/users/(?P\d+)/timetables/(?P\d+)/change-name", + url(r"^api/users/(?P\d+)/timetables/(?P\d+)/name", timetable_views.UserInstanceTimetableInstanceChangeNameView.as_view()), From 500f5874e9b06a0569f1224d07cbe8fd478de5bb Mon Sep 17 00:00:00 2001 From: ddungiii Date: Thu, 8 Feb 2024 17:44:00 +0900 Subject: [PATCH 3/6] feat: add pinning timetable --- .../migrations/0008_add_is_pinned.py | 18 +++++++++++++++++ apps/timetable/models.py | 1 + apps/timetable/views.py | 20 +++++++++++++++++++ otlplus/urls.py | 2 ++ 4 files changed, 41 insertions(+) create mode 100644 apps/timetable/migrations/0008_add_is_pinned.py diff --git a/apps/timetable/migrations/0008_add_is_pinned.py b/apps/timetable/migrations/0008_add_is_pinned.py new file mode 100644 index 000000000..f3ef5732b --- /dev/null +++ b/apps/timetable/migrations/0008_add_is_pinned.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2024-02-08 08:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('timetable', '0007_add_name'), + ] + + operations = [ + migrations.AddField( + model_name='timetable', + name='is_pinned', + field=models.BooleanField(default=False), + ), + ] diff --git a/apps/timetable/models.py b/apps/timetable/models.py index f947a487c..e11901780 100644 --- a/apps/timetable/models.py +++ b/apps/timetable/models.py @@ -12,6 +12,7 @@ class Timetable(models.Model): semester = models.SmallIntegerField(null=True, db_index=True) # 어떤학기의 타임테이블인지 arrange_order = models.SmallIntegerField(db_index=True) name = models.CharField(max_length=20) + is_pinned = models.BooleanField(default=False) def to_json(self, nested=False): result = { diff --git a/apps/timetable/views.py b/apps/timetable/views.py index 9a5b62717..dd5acf715 100644 --- a/apps/timetable/views.py +++ b/apps/timetable/views.py @@ -1,6 +1,7 @@ import json from django.db.models import F +from django.db import transaction from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound, JsonResponse from django.utils.decorators import method_decorator from django.views import View @@ -220,6 +221,25 @@ def patch(self, request, user_id, timetable_id): Timetable.objects.filter(id=timetable_id).update(name=name) return JsonResponse(timetable.to_json()) +@method_decorator(login_required_ajax, name="dispatch") +class UserInstanceTimetableInstancePinView(View): + def post(self, request, user_id, timetable_id): + + userprofile = request.user.userprofile + if userprofile.id != int(user_id): + return HttpResponse(status=401) + + try: + timetable = userprofile.timetables.get(id=timetable_id) + except Timetable.DoesNotExist: + return HttpResponseNotFound() + + with transaction.atomic(): + Timetable.objects.filter(user_id=user_id).update(is_pinned=False) + Timetable.objects.filter(id=timetable_id).update(is_pinned=True) + + return JsonResponse(timetable.to_json()) + @method_decorator(login_required_ajax, name="dispatch") diff --git a/otlplus/urls.py b/otlplus/urls.py index 02fb6296a..74eafbdbc 100644 --- a/otlplus/urls.py +++ b/otlplus/urls.py @@ -72,6 +72,8 @@ timetable_views.UserInstanceTimetableInstanceReorderView.as_view()), url(r"^api/users/(?P\d+)/timetables/(?P\d+)/name", timetable_views.UserInstanceTimetableInstanceChangeNameView.as_view()), + url(r"^api/users/(?P\d+)/timetables/(?P\d+)/pin", + timetable_views.UserInstanceTimetableInstancePinView.as_view()), url(r"^api/users/(?P\d+)/planners$", From a53cdc862dd0168556a6fdbe7511ad052801fa6e Mon Sep 17 00:00:00 2001 From: ddungiii Date: Fri, 23 Feb 2024 20:17:05 +0900 Subject: [PATCH 4/6] feat: add is_pinned to response --- apps/timetable/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/timetable/models.py b/apps/timetable/models.py index e11901780..68124707e 100644 --- a/apps/timetable/models.py +++ b/apps/timetable/models.py @@ -20,7 +20,8 @@ def to_json(self, nested=False): "lectures": [lecture.to_json(nested=False) for lecture in self.lectures.filter(deleted=False)], "arrange_order": self.arrange_order, - "name": self.name + "name": self.name, + "is_pinned": self.is_pinned } return result From fe37440a44222e4458d1f34a713bfad061130418 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 26 Feb 2024 15:14:34 +0900 Subject: [PATCH 5/6] fix: return modified object --- apps/timetable/views.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/timetable/views.py b/apps/timetable/views.py index dd5acf715..fb4e08bc7 100644 --- a/apps/timetable/views.py +++ b/apps/timetable/views.py @@ -218,13 +218,13 @@ def patch(self, request, user_id, timetable_id): name, = parse_body(request.body, BODY_STRUCTURE) - Timetable.objects.filter(id=timetable_id).update(name=name) + timetable.name = name + timetable.save() return JsonResponse(timetable.to_json()) @method_decorator(login_required_ajax, name="dispatch") class UserInstanceTimetableInstancePinView(View): def post(self, request, user_id, timetable_id): - userprofile = request.user.userprofile if userprofile.id != int(user_id): return HttpResponse(status=401) @@ -236,7 +236,8 @@ def post(self, request, user_id, timetable_id): with transaction.atomic(): Timetable.objects.filter(user_id=user_id).update(is_pinned=False) - Timetable.objects.filter(id=timetable_id).update(is_pinned=True) + timetable.is_pinned = True + timetable.save() return JsonResponse(timetable.to_json()) From aa6dc715faf8e7d7d7e695054e9102dfc50c349e Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 26 Feb 2024 15:15:26 +0900 Subject: [PATCH 6/6] fix: unpin timetable only same semester --- apps/timetable/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/timetable/views.py b/apps/timetable/views.py index fb4e08bc7..8d6026c24 100644 --- a/apps/timetable/views.py +++ b/apps/timetable/views.py @@ -235,7 +235,7 @@ def post(self, request, user_id, timetable_id): return HttpResponseNotFound() with transaction.atomic(): - Timetable.objects.filter(user_id=user_id).update(is_pinned=False) + Timetable.objects.filter(user_id=user_id, semester=timetable.semester).update(is_pinned=False) timetable.is_pinned = True timetable.save()