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/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 110edb7d0..68124707e 100644 --- a/apps/timetable/models.py +++ b/apps/timetable/models.py @@ -11,6 +11,8 @@ 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) + is_pinned = models.BooleanField(default=False) def to_json(self, nested=False): result = { @@ -18,6 +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, + "is_pinned": self.is_pinned } return result diff --git a/apps/timetable/views.py b/apps/timetable/views.py index d57f5d5a7..8d6026c24 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 @@ -199,6 +200,49 @@ def post(self, request, user_id, timetable_id): return JsonResponse(timetable.to_json()) +@method_decorator(login_required_ajax, name="dispatch") +class UserInstanceTimetableInstanceChangeNameView(View): + def patch(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.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) + + try: + timetable = userprofile.timetables.get(id=timetable_id) + except Timetable.DoesNotExist: + return HttpResponseNotFound() + + with transaction.atomic(): + Timetable.objects.filter(user_id=user_id, semester=timetable.semester).update(is_pinned=False) + timetable.is_pinned = True + timetable.save() + + 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..74eafbdbc 100644 --- a/otlplus/urls.py +++ b/otlplus/urls.py @@ -70,6 +70,11 @@ 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+)/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$", planner_views.UserInstancePlannerListView.as_view()),