mirror of
https://github.com/ae-utbm/sith.git
synced 2026-10-05 18:34:15 +00:00
api to save timetable
This commit is contained in:
1 parent
7044a06546
commit
7a0df3d8a7
3 files changed
+65
-2
No files matched your search
@@ -0,0 +1,27 @@
|
|||||||
|
from ninja.security import SessionAuth
|
||||||
|
from ninja_extra import ControllerBase, api_controller, route
|
||||||
|
|
||||||
|
from core.utils import get_semester_code
|
||||||
|
from timetable.models import Timetable, TimetableSlot
|
||||||
|
from timetable.schemas import CreateTimetableSchema, TimetableSchema
|
||||||
|
|
||||||
|
|
||||||
|
@api_controller("/edt", urls_namespace="timetable")
|
||||||
|
class TimetableController(ControllerBase):
|
||||||
|
@route.put("", auth=SessionAuth(), response={200: TimetableSchema}, url_name="save")
|
||||||
|
def save_timetable(self, data: CreateTimetableSchema):
|
||||||
|
user = self.context.request.user
|
||||||
|
timetable, created = Timetable.objects.get_or_create(
|
||||||
|
semester=get_semester_code(), user=user
|
||||||
|
)
|
||||||
|
if not created:
|
||||||
|
timetable.slots.all().delete()
|
||||||
|
if user.preferences.show_my_timetable != data.is_viewable:
|
||||||
|
user.preferences.show_my_timetable = data.is_viewable
|
||||||
|
user.preferences.save()
|
||||||
|
slots = TimetableSlot.objects.bulk_create(
|
||||||
|
[TimetableSlot(timetable=timetable, **s.model_dump()) for s in data.slots]
|
||||||
|
)
|
||||||
|
return TimetableSchema(
|
||||||
|
id=timetable.id, semester=timetable.semester, slots=slots
|
||||||
|
)
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
from typing import Annotated
|
||||||
|
|
||||||
|
from annotated_types import Ge, Le
|
||||||
|
from ninja import ModelSchema, Schema
|
||||||
|
from pydantic import Field
|
||||||
|
|
||||||
|
from timetable.models import Timetable, TimetableSlot
|
||||||
|
|
||||||
|
|
||||||
|
class TimetableSlotSchema(Schema):
|
||||||
|
weekday: TimetableSlot.WeekDay = Field(
|
||||||
|
description=(
|
||||||
|
f"{TimetableSlot.WeekDay.MONDAY} is monday, "
|
||||||
|
f"{TimetableSlot.WeekDay.TUESDAY} is tuesday, etc."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
start_at: Annotated[int, Ge(0), Le(96)]
|
||||||
|
end_at: Annotated[int, Ge(0), Le(96)]
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = TimetableSlot
|
||||||
|
fields = ["start_at", "end_at"]
|
||||||
|
|
||||||
|
|
||||||
|
class CreateTimetableSchema(Schema):
|
||||||
|
is_viewable: bool
|
||||||
|
slots: list[TimetableSlotSchema]
|
||||||
|
|
||||||
|
|
||||||
|
class TimetableSchema(ModelSchema):
|
||||||
|
slots: list[TimetableSlotSchema]
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Timetable
|
||||||
|
fields = ["id", "semester"]
|
||||||
@@ -78,7 +78,7 @@ function parseSlots(s: string): TimetableSlot[] {
|
|||||||
document.addEventListener("alpine:init", () => {
|
document.addEventListener("alpine:init", () => {
|
||||||
Alpine.data("timetableGenerator", () => ({
|
Alpine.data("timetableGenerator", () => ({
|
||||||
content: DEFAULT_TIMETABLE,
|
content: DEFAULT_TIMETABLE,
|
||||||
error: null as { incorrectRow?: string },
|
error: null as { incorrectRow?: string } | null,
|
||||||
displayedWeekdays: [] as WeekDay[],
|
displayedWeekdays: [] as WeekDay[],
|
||||||
courses: [] as TimetableSlot[],
|
courses: [] as TimetableSlot[],
|
||||||
startSlot: 0,
|
startSlot: 0,
|
||||||
@@ -108,7 +108,8 @@ document.addEventListener("alpine:init", () => {
|
|||||||
this.courses = parseSlots(this.content);
|
this.courses = parseSlots(this.content);
|
||||||
this.error = null;
|
this.error = null;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.error = { incorrectRow: err?.cause?.row };
|
type ParseRowError = { cause: { row: string } };
|
||||||
|
this.error = { incorrectRow: (err as ParseRowError)?.cause?.row };
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user