From deced3e5969b30ca24d44deaa2a61d0dc6fe0d61 Mon Sep 17 00:00:00 2001 From: Gonne Date: Tue, 1 Apr 2025 19:21:17 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=C3=84ndere=20Wochenfeld=20von=20Auswahl=20?= =?UTF-8?q?"Jede/gerade=20Vorlesungswochen/ungerade=20Vorlesungswochen"=20?= =?UTF-8?q?zu=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}} From e05d30b886753effc9e0c99a8b07b3bb5c34fcea Mon Sep 17 00:00:00 2001 From: Gonne Date: Wed, 2 Apr 2025 14:50:42 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=C3=84ndere=20Wochenfeld=20zu=20mehr=20Ausw?= =?UTF-8?q?ahl.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #28 --- controllers/addOfficeHourHandler.go | 4 ++-- models/date.go | 2 +- repositories/officeHour.go | 4 +--- templating/templates/addMask.html | 9 ++++++--- templating/templates/confirmationMail | 1 + templating/templates/deleteMailForm.html | 2 +- templating/templates/td.html | 2 +- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/controllers/addOfficeHourHandler.go b/controllers/addOfficeHourHandler.go index 20c3b8d..4e498e1 100644 --- a/controllers/addOfficeHourHandler.go +++ b/controllers/addOfficeHourHandler.go @@ -73,8 +73,8 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ 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.") + if !(week >= 0 && week <= 5) { + errors = append(errors, "Bitte wähle eine der vorgegebenen Optionen für Vorlesungswochen.") } day, err := strconv.Atoi(req.FormValue("tag")) if err != nil { diff --git a/models/date.go b/models/date.go index 61ce6a3..bea4dc4 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 int // Set whether the date is all weeks (0), weeks with exercise session (1) or weeks without exercise session (2), even weeks (3), odd weeks (4) or other (5). Day int Hour int Minute int diff --git a/repositories/officeHour.go b/repositories/officeHour.go index 27ccd86..4a0243a 100644 --- a/repositories/officeHour.go +++ b/repositories/officeHour.go @@ -245,9 +245,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..eda37d7 100644 --- a/templating/templates/addMask.html +++ b/templating/templates/addMask.html @@ -59,9 +59,12 @@
diff --git a/templating/templates/confirmationMail b/templating/templates/confirmationMail index 30205e1..1d61fdb 100644 --- a/templating/templates/confirmationMail +++ b/templating/templates/confirmationMail @@ -5,6 +5,7 @@ mit deiner Emailadresse soll eine Sprechstunde mit folgenden Daten {{if eq .Requ {{.Request.OfficeHour.Course.Name}} {{DayName .Request.OfficeHour.Date.Day}} {{printf "%02d" .Request.OfficeHour.Date.Hour}}:{{printf "%02d" .Request.OfficeHour.Date.Minute}} Uhr bis {{printf "%02d" .Request.OfficeHour.EndDate.Hour}}:{{printf "%02d" .Request.OfficeHour.EndDate.Minute}} Uhr +{{if eq 0 .Request.OfficeHour.Date.Week}}Jede Woche{{end}}{{if eq 1 .Request.OfficeHour.Date.Week}}In Wochen mit Übung{{end}}{{if eq 2 .Request.OfficeHour.Date.Week}}In Wochen ohne Übung{{end}}{{if eq 3 .Request.OfficeHour.Date.Week}}In geraden Vorlesungswochen{{end}}{{if eq 4 .Request.OfficeHour.Date.Week}}In ungeraden Vorlesungswochen{{end}} {{.Request.OfficeHour.Tutor.Name}} {{.Request.OfficeHour.Room.Name}} diff --git a/templating/templates/deleteMailForm.html b/templating/templates/deleteMailForm.html index 378e6e7..11a8119 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 eq 0 $.Date.Week}}>Jede Woche
{{end}}{{if eq 1 $.Date.Week}}In Wochen mit Übung
{{end}}{{if eq 2 $.Date.Week}}In Wochen ohne Übung
{{end}}{{if eq 3 $.Date.Week}}In geraden Vorlesungswochen
{{end}}{{if eq 4 $.Date.Week}}In ungeraden Vorlesungswochen
{{end}} {{.OfficeHour.Course.Name}}
{{.OfficeHour.Tutor.Name}}
{{.OfficeHour.Room.Name}}
diff --git a/templating/templates/td.html b/templating/templates/td.html index cb1f041..76fc5e1 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 eq 1 .OfficeHour.Date.Week}}In Wochen mit Übung
{{end}}{{if eq 2 .OfficeHour.Date.Week}}In Wochen ohne Übung
{{end}}{{if eq 3 .OfficeHour.Date.Week}}In geraden Vorlesungswochen
{{end}}{{if eq 4 .OfficeHour.Date.Week}}In ungeraden Vorlesungswochen
{{end}} {{.OfficeHour.Course.Name}}
{{.OfficeHour.Tutor.Name}}
{{.OfficeHour.Room.Name}}