From deced3e5969b30ca24d44deaa2a61d0dc6fe0d61 Mon Sep 17 00:00:00 2001 From: Gonne Date: Tue, 1 Apr 2025 19:21:17 +0200 Subject: [PATCH] =?UTF-8?q?=C3=84ndere=20Wochenfeld=20von=20Auswahl=20"Jed?= =?UTF-8?q?e/gerade=20Vorlesungswochen/ungerade=20Vorlesungswochen"=20zu?= =?UTF-8?q?=20Freitextfeld=20mit=20Vorschlag.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #28 --- controllers/addOfficeHourHandler.go | 9 +------- controllers/timetable.go | 6 +++--- models/date.go | 4 ++-- models/date_test.go | 26 ++++++++++++------------ officeHoursMysql.sql | 2 +- officeHoursSQLite.sql | 2 +- repositories/officeHour.go | 10 ++++----- templating/templates/addMask.html | 13 ++++++------ templating/templates/deleteMailForm.html | 2 +- templating/templates/td.html | 2 +- 10 files changed, 35 insertions(+), 41 deletions(-) diff --git a/controllers/addOfficeHourHandler.go b/controllers/addOfficeHourHandler.go index 20c3b8d..7b53a98 100644 --- a/controllers/addOfficeHourHandler.go +++ b/controllers/addOfficeHourHandler.go @@ -69,13 +69,6 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ errors = append(errors, "Der Raum muss existieren.") } //Parse date - week, err := strconv.Atoi(req.FormValue("woche")) - if err != nil { - errors = append(errors, "Die Vorlesungswoche muss eine ganze Zahl sein.") - } - if !(week >= 0 && week <= 2) { - errors = append(errors, "Sprechstunden müssen jede, jede gerade oder jede ungerade Vorlesungswoche stattfinden.") - } day, err := strconv.Atoi(req.FormValue("tag")) if err != nil { errors = append(errors, "Der Tag muss eine ganze Zahl sein.") @@ -106,7 +99,7 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ errors = append(errors, fmt.Sprintf("Sprechstunden dürfen nur alle %d Minuten starten.", b.config.Date.MinuteGranularity)) } } - date := models.Date{Week: week, Day: day, Hour: hour, Minute: minute} + date := models.Date{Week: req.FormValue("woche"), Day: day, Hour: hour, Minute: minute} duration, err := strconv.Atoi(req.FormValue("dauer")) if err != nil { errors = append(errors, "Die Dauer muss eine ganze Zahl sein.") diff --git a/controllers/timetable.go b/controllers/timetable.go index 5393709..92bebb2 100644 --- a/controllers/timetable.go +++ b/controllers/timetable.go @@ -61,16 +61,16 @@ func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.Of } for day := 0; day < 5; day += 1 { for slot := 0; slot < slots[day]; slot += 1 { - current, currentExists := timetable[models.Date{Week: 0, Day: day, Hour: hour, Minute: minute}][slot] + current, currentExists := timetable[models.Date{Week: "", Day: day, Hour: hour, Minute: minute}][slot] if currentExists { // This slot is taken by some office hour var continued bool = false // is this slot occupied by the same office hour the previous minute? var predecessorExists bool var predecessor models.OfficeHour if hour > 0 && minute < b.config.Date.MinuteGranularity { - predecessor, predecessorExists = timetable[models.Date{Week: 0, Day: day, Hour: hour - 1, Minute: 60 - b.config.Date.MinuteGranularity}][slot] + predecessor, predecessorExists = timetable[models.Date{Week: "", Day: day, Hour: hour - 1, Minute: 60 - b.config.Date.MinuteGranularity}][slot] } else { - predecessor, predecessorExists = timetable[models.Date{Week: 0, Day: day, Hour: hour, Minute: minute - b.config.Date.MinuteGranularity}][slot] + predecessor, predecessorExists = timetable[models.Date{Week: "", Day: day, Hour: hour, Minute: minute - b.config.Date.MinuteGranularity}][slot] } if predecessorExists { continued = (predecessor == current) diff --git a/models/date.go b/models/date.go index 61ce6a3..40801c7 100644 --- a/models/date.go +++ b/models/date.go @@ -5,7 +5,7 @@ import ( ) type Date struct { - Week int // Set whether the date is all weeks (0), odd weeks (1) or even weeks (2). + Week string Day int Hour int Minute int @@ -54,7 +54,7 @@ func DateLess(first Date, second Date) bool { func GetEndDate(date Date, duration int, ignoreWeek bool) Date { var endDate Date if ignoreWeek { - endDate = Date{0, date.Day, date.Hour, date.Minute} // deep copy + endDate = Date{"", date.Day, date.Hour, date.Minute} // deep copy } else { endDate = Date{date.Week, date.Day, date.Hour, date.Minute} } diff --git a/models/date_test.go b/models/date_test.go index 43c54bd..e64d02d 100644 --- a/models/date_test.go +++ b/models/date_test.go @@ -11,11 +11,11 @@ func TestEndDate(t *testing.T) { duration int endDate Date }{ - {Date{Week: 0, Day: 0, Hour: 8, Minute: 0}, 10, Date{Week: 0, Day: 0, Hour: 8, Minute: 10}}, - {Date{Week: 0, Day: 0, Hour: 8, Minute: 0}, 90, Date{Week: 0, Day: 0, Hour: 9, Minute: 30}}, // More than one hour - {Date{Week: 0, Day: 0, Hour: 8, Minute: 0}, 130, Date{Week: 0, Day: 0, Hour: 10, Minute: 10}}, // More than two hours - {Date{Week: 0, Day: 0, Hour: 8, Minute: 15}, 90, Date{Week: 0, Day: 0, Hour: 9, Minute: 45}}, // More than one hour and start not 0 - {Date{Week: 0, Day: 0, Hour: 23, Minute: 15}, 90, Date{Week: 0, Day: 1, Hour: 0, Minute: 45}}, // More than one day + {Date{Week: "", Day: 0, Hour: 8, Minute: 0}, 10, Date{Week: "", Day: 0, Hour: 8, Minute: 10}}, + {Date{Week: "", Day: 0, Hour: 8, Minute: 0}, 90, Date{Week: "", Day: 0, Hour: 9, Minute: 30}}, // More than one hour + {Date{Week: "", Day: 0, Hour: 8, Minute: 0}, 130, Date{Week: "", Day: 0, Hour: 10, Minute: 10}}, // More than two hours + {Date{Week: "", Day: 0, Hour: 8, Minute: 15}, 90, Date{Week: "", Day: 0, Hour: 9, Minute: 45}}, // More than one hour and start not 0 + {Date{Week: "", Day: 0, Hour: 23, Minute: 15}, 90, Date{Week: "", Day: 1, Hour: 0, Minute: 45}}, // More than one day } for _, tc := range testCases { t.Run(fmt.Sprintf("%d:%d, Dauer %d", tc.startDate.Hour, tc.startDate.Minute, tc.duration), func(t *testing.T) { @@ -35,21 +35,21 @@ func TestDateLess(t *testing.T) { less bool }{ {"earlier day", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 0, Hour: 7, Minute: 10}, false}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 0, Hour: 7, Minute: 10}, false}, {"earlier hour", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 7, Minute: 10}, false}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 7, Minute: 10}, false}, {"earlier minute", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 8, Minute: 0}, false}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 8, Minute: 0}, false}, {"same date", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, false}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 8, Minute: 10}, false}, {"later minute", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 8, Minute: 20}, true}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 8, Minute: 20}, true}, {"later hour", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 9, Minute: 10}, true}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 9, Minute: 10}, true}, {"later day", - Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 2, Hour: 8, Minute: 10}, true}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 2, Hour: 8, Minute: 10}, true}, {"week should not matter", - Date{Week: 1, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 9, Minute: 30}, true}, + Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "every", Day: 1, Hour: 9, Minute: 30}, true}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { diff --git a/officeHoursMysql.sql b/officeHoursMysql.sql index 9583ab1..e7379b3 100644 --- a/officeHoursMysql.sql +++ b/officeHoursMysql.sql @@ -47,7 +47,7 @@ CREATE TABLE `officeHour` ( `room` int DEFAULT NULL, `roomname` text DEFAULT NULL, `course` int DEFAULT NULL, - `week` int DEFAULT NULL, + `week` varchar(255) DEFAULT NULL, `info` text DEFAULT NULL, `active` bool DEFAULT NULL, `duration` int DEFAULT NULL, diff --git a/officeHoursSQLite.sql b/officeHoursSQLite.sql index 39b54e6..1b8f2dc 100644 --- a/officeHoursSQLite.sql +++ b/officeHoursSQLite.sql @@ -36,7 +36,7 @@ CREATE TABLE `officeHour` ( `room` int DEFAULT NULL, `roomname` text DEFAULT NULL, `course` int DEFAULT NULL, - `week` int DEFAULT NULL, + `week` tinytext DEFAULT NULL, `info` text DEFAULT NULL, `active` bool DEFAULT NULL, `duration` int DEFAULT NULL, diff --git a/repositories/officeHour.go b/repositories/officeHour.go index 27ccd86..8cdb59f 100644 --- a/repositories/officeHour.go +++ b/repositories/officeHour.go @@ -157,7 +157,8 @@ func (r *OfficeHourRepo) Delete(officeHour models.OfficeHour) error { func (r *OfficeHourRepo) getFromRow(row *sql.Row) (models.OfficeHour, error) { var officeHour models.OfficeHour - var week, day, hour, minute, tutorId, courseId, roomId int + var day, hour, minute, tutorId, courseId, roomId int + var week string err := row.Scan(&officeHour.Id, &tutorId, &day, &hour, &minute, &roomId, &officeHour.RoomName, &courseId, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration) if err != nil { err = fmt.Errorf("error getting single officeHour row from database: %w", err) @@ -190,7 +191,8 @@ func (r *OfficeHourRepo) getFromRows(rows *sql.Rows) ([]models.OfficeHour, error var officeHours []models.OfficeHour for rows.Next() { var officeHour models.OfficeHour - var week, day, hour, minute, tutorId, roomId, courseId int + var day, hour, minute, tutorId, roomId, courseId int + var week string var err error if err := rows.Scan(&officeHour.Id, &tutorId, &day, &hour, &minute, &roomId, &officeHour.RoomName, &courseId, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration); err != nil { return officeHours, fmt.Errorf("error getting multiple officeHour rows from database: %w", err) @@ -245,9 +247,7 @@ func (r *OfficeHourRepo) NumberByTimeSpanAndRoom(date models.Date, duration int, for _, officeHour := range officeHours { // increase count if officehour starts before this point in time and ends later if models.DateLess(officeHour.Date, models.GetEndDate(date, minute, false)) && models.DateLess(models.GetEndDate(date, minute, false), models.GetEndDate(officeHour.Date, officeHour.Duration, false)) { - if date.Week == 0 || officeHour.Week == 0 || date.Week == officeHour.Week { // office hours in alternating weeks should not collide - minuteCount += 1 - } + minuteCount += 1 } } if minuteCount > count { diff --git a/templating/templates/addMask.html b/templating/templates/addMask.html index 98152d7..1080de6 100644 --- a/templating/templates/addMask.html +++ b/templating/templates/addMask.html @@ -58,12 +58,13 @@
- - + + + + + + +
diff --git a/templating/templates/deleteMailForm.html b/templating/templates/deleteMailForm.html index 378e6e7..c0599e7 100644 --- a/templating/templates/deleteMailForm.html +++ b/templating/templates/deleteMailForm.html @@ -11,7 +11,7 @@

Willst du die Sprechstunde
{{printf "%02d" .OfficeHour.Date.Hour}}:{{printf "%02d" .OfficeHour.Date.Minute}} - {{printf "%02d" .OfficeHour.EndDate.Hour}}:{{printf "%02d" .OfficeHour.EndDate.Minute}}
- {{if eq .OfficeHour.Date.Week 1}}in ungeraden Vorlesungswochen
{{end}}{{if eq .OfficeHour.Date.Week 2}}in geraden Vorlesungswochen
{{end}} + {{if not (eq .OfficeHour.Date.Week "")}}{{ .OfficeHour.Date.Week }}
{{end}} {{.OfficeHour.Course.Name}}
{{.OfficeHour.Tutor.Name}}
{{.OfficeHour.Room.Name}}
diff --git a/templating/templates/td.html b/templating/templates/td.html index cb1f041..e08659d 100644 --- a/templating/templates/td.html +++ b/templating/templates/td.html @@ -1,7 +1,7 @@ {{if .DeleteIcons}}

{{end}} {{printf "%02d" .OfficeHour.Date.Hour}}:{{printf "%02d" .OfficeHour.Date.Minute}} - {{printf "%02d" .OfficeHour.EndDate.Hour}}:{{printf "%02d" .OfficeHour.EndDate.Minute}}
- {{if eq .OfficeHour.Date.Week 1}}in ungeraden Vorlesungswochen
{{end}}{{if eq .OfficeHour.Date.Week 2}}in geraden Vorlesungswochen
{{end}} + {{if not (eq .OfficeHour.Date.Week "")}}{{.OfficeHour.Date.Week}}
{{end}} {{.OfficeHour.Course.Name}}
{{.OfficeHour.Tutor.Name}}
{{.OfficeHour.Room.Name}}