Compare commits

..

1 commit

Author SHA1 Message Date
e05d30b886
Ändere Wochenfeld zu mehr Auswahl.
Closes #28
2025-04-02 14:50:42 +02:00
11 changed files with 42 additions and 34 deletions

View file

@ -69,6 +69,13 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
errors = append(errors, "Der Raum muss existieren.") errors = append(errors, "Der Raum muss existieren.")
} }
//Parse date //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 <= 5) {
errors = append(errors, "Bitte wähle eine der vorgegebenen Optionen für Vorlesungswochen.")
}
day, err := strconv.Atoi(req.FormValue("tag")) day, err := strconv.Atoi(req.FormValue("tag"))
if err != nil { if err != nil {
errors = append(errors, "Der Tag muss eine ganze Zahl sein.") errors = append(errors, "Der Tag muss eine ganze Zahl sein.")
@ -99,7 +106,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)) errors = append(errors, fmt.Sprintf("Sprechstunden dürfen nur alle %d Minuten starten.", b.config.Date.MinuteGranularity))
} }
} }
date := models.Date{Week: req.FormValue("woche"), Day: day, Hour: hour, Minute: minute} date := models.Date{Week: week, Day: day, Hour: hour, Minute: minute}
duration, err := strconv.Atoi(req.FormValue("dauer")) duration, err := strconv.Atoi(req.FormValue("dauer"))
if err != nil { if err != nil {
errors = append(errors, "Die Dauer muss eine ganze Zahl sein.") errors = append(errors, "Die Dauer muss eine ganze Zahl sein.")

View file

@ -61,16 +61,16 @@ func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.Of
} }
for day := 0; day < 5; day += 1 { for day := 0; day < 5; day += 1 {
for slot := 0; slot < slots[day]; slot += 1 { for slot := 0; slot < slots[day]; slot += 1 {
current, currentExists := timetable[models.Date{Week: "", Day: day, Hour: hour, Minute: minute}][slot] current, currentExists := timetable[models.Date{Week: 0, Day: day, Hour: hour, Minute: minute}][slot]
if currentExists { // This slot is taken by some office hour 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 continued bool = false // is this slot occupied by the same office hour the previous minute?
var predecessorExists bool var predecessorExists bool
var predecessor models.OfficeHour var predecessor models.OfficeHour
if hour > 0 && minute < b.config.Date.MinuteGranularity { if hour > 0 && minute < b.config.Date.MinuteGranularity {
predecessor, predecessorExists = timetable[models.Date{Week: "", Day: day, Hour: hour - 1, Minute: 60 - b.config.Date.MinuteGranularity}][slot] predecessor, predecessorExists = timetable[models.Date{Week: 0, Day: day, Hour: hour - 1, Minute: 60 - b.config.Date.MinuteGranularity}][slot]
} else { } else {
predecessor, predecessorExists = timetable[models.Date{Week: "", Day: day, Hour: hour, Minute: minute - b.config.Date.MinuteGranularity}][slot] predecessor, predecessorExists = timetable[models.Date{Week: 0, Day: day, Hour: hour, Minute: minute - b.config.Date.MinuteGranularity}][slot]
} }
if predecessorExists { if predecessorExists {
continued = (predecessor == current) continued = (predecessor == current)

View file

@ -5,7 +5,7 @@ import (
) )
type Date struct { type Date struct {
Week string 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 Day int
Hour int Hour int
Minute int Minute int
@ -54,7 +54,7 @@ func DateLess(first Date, second Date) bool {
func GetEndDate(date Date, duration int, ignoreWeek bool) Date { func GetEndDate(date Date, duration int, ignoreWeek bool) Date {
var endDate Date var endDate Date
if ignoreWeek { if ignoreWeek {
endDate = Date{"", date.Day, date.Hour, date.Minute} // deep copy endDate = Date{0, date.Day, date.Hour, date.Minute} // deep copy
} else { } else {
endDate = Date{date.Week, date.Day, date.Hour, date.Minute} endDate = Date{date.Week, date.Day, date.Hour, date.Minute}
} }

View file

@ -11,11 +11,11 @@ func TestEndDate(t *testing.T) {
duration int duration int
endDate Date endDate Date
}{ }{
{Date{Week: "", Day: 0, Hour: 8, Minute: 0}, 10, Date{Week: "", Day: 0, Hour: 8, Minute: 10}}, {Date{Week: 0, Day: 0, Hour: 8, Minute: 0}, 10, Date{Week: 0, 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: 0, Day: 0, Hour: 8, Minute: 0}, 90, Date{Week: 0, 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: 0, Day: 0, Hour: 8, Minute: 0}, 130, Date{Week: 0, 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: 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: "", Day: 0, Hour: 23, Minute: 15}, 90, Date{Week: "", Day: 1, Hour: 0, Minute: 45}}, // More than one day {Date{Week: 0, Day: 0, Hour: 23, Minute: 15}, 90, Date{Week: 0, Day: 1, Hour: 0, Minute: 45}}, // More than one day
} }
for _, tc := range testCases { for _, tc := range testCases {
t.Run(fmt.Sprintf("%d:%d, Dauer %d", tc.startDate.Hour, tc.startDate.Minute, tc.duration), func(t *testing.T) { 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 less bool
}{ }{
{"earlier day", {"earlier day",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 0, Hour: 7, Minute: 10}, false}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 0, Hour: 7, Minute: 10}, false},
{"earlier hour", {"earlier hour",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 7, Minute: 10}, false}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 7, Minute: 10}, false},
{"earlier minute", {"earlier minute",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 8, Minute: 0}, false}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 8, Minute: 0}, false},
{"same date", {"same date",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 8, Minute: 10}, false}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, false},
{"later minute", {"later minute",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 8, Minute: 20}, true}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 8, Minute: 20}, true},
{"later hour", {"later hour",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 1, Hour: 9, Minute: 10}, true}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 9, Minute: 10}, true},
{"later day", {"later day",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "", Day: 2, Hour: 8, Minute: 10}, true}, Date{Week: 0, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 2, Hour: 8, Minute: 10}, true},
{"week should not matter", {"week should not matter",
Date{Week: "", Day: 1, Hour: 8, Minute: 10}, Date{Week: "every", Day: 1, Hour: 9, Minute: 30}, true}, Date{Week: 1, Day: 1, Hour: 8, Minute: 10}, Date{Week: 0, Day: 1, Hour: 9, Minute: 30}, true},
} }
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {

View file

@ -47,7 +47,7 @@ CREATE TABLE `officeHour` (
`room` int DEFAULT NULL, `room` int DEFAULT NULL,
`roomname` text DEFAULT NULL, `roomname` text DEFAULT NULL,
`course` int DEFAULT NULL, `course` int DEFAULT NULL,
`week` varchar(255) DEFAULT NULL, `week` int DEFAULT NULL,
`info` text DEFAULT NULL, `info` text DEFAULT NULL,
`active` bool DEFAULT NULL, `active` bool DEFAULT NULL,
`duration` int DEFAULT NULL, `duration` int DEFAULT NULL,

View file

@ -36,7 +36,7 @@ CREATE TABLE `officeHour` (
`room` int DEFAULT NULL, `room` int DEFAULT NULL,
`roomname` text DEFAULT NULL, `roomname` text DEFAULT NULL,
`course` int DEFAULT NULL, `course` int DEFAULT NULL,
`week` tinytext DEFAULT NULL, `week` int DEFAULT NULL,
`info` text DEFAULT NULL, `info` text DEFAULT NULL,
`active` bool DEFAULT NULL, `active` bool DEFAULT NULL,
`duration` int DEFAULT NULL, `duration` int DEFAULT NULL,

View file

@ -157,8 +157,7 @@ func (r *OfficeHourRepo) Delete(officeHour models.OfficeHour) error {
func (r *OfficeHourRepo) getFromRow(row *sql.Row) (models.OfficeHour, error) { func (r *OfficeHourRepo) getFromRow(row *sql.Row) (models.OfficeHour, error) {
var officeHour models.OfficeHour var officeHour models.OfficeHour
var day, hour, minute, tutorId, courseId, roomId int var week, 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) err := row.Scan(&officeHour.Id, &tutorId, &day, &hour, &minute, &roomId, &officeHour.RoomName, &courseId, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration)
if err != nil { if err != nil {
err = fmt.Errorf("error getting single officeHour row from database: %w", err) err = fmt.Errorf("error getting single officeHour row from database: %w", err)
@ -191,8 +190,7 @@ func (r *OfficeHourRepo) getFromRows(rows *sql.Rows) ([]models.OfficeHour, error
var officeHours []models.OfficeHour var officeHours []models.OfficeHour
for rows.Next() { for rows.Next() {
var officeHour models.OfficeHour var officeHour models.OfficeHour
var day, hour, minute, tutorId, roomId, courseId int var week, day, hour, minute, tutorId, roomId, courseId int
var week string
var err error 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 { 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) return officeHours, fmt.Errorf("error getting multiple officeHour rows from database: %w", err)

View file

@ -58,13 +58,15 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input class="form-control form-text" type="text" name="woche" id="woche" list="woche_list" value="{{$.Date.Week}}"> <select class="form-control form-select required" required name="woche" id="woche">
<datalist id="woche_list"> <option value="0"{{if eq 0 $.Date.Week}} selected{{end}}>Jede Woche</option>
<option>Jede Woche</option> <option value="1"{{if eq 1 $.Date.Week}} selected{{end}}>In Wochen mit Übung</option>
<option>In Wochen mit Übung</option> <option value="2"{{if eq 2 $.Date.Week}} selected{{end}}>In Wochen ohne Übung</option>
<option>In Wochen ohne Übung</option> <option value="1"{{if eq 3 $.Date.Week}} selected{{end}}>In geraden Vorlesungswochen</option>
</datalist> <option value="2"{{if eq 4 $.Date.Week}} selected{{end}}>In ungeraden Vorlesungswochen</option>
<label for="woche">Vorlesungswoche (z.B. jede / mit Übung / ohne Übung)</label> <option value="2"{{if eq 5 $.Date.Week}} selected{{end}}>Etwas anderes (nutze Infofeld)</option>
</select>
<label for="woche">Vorlesungswoche</label>
</div> </div>
</div> </div>

View file

@ -5,6 +5,7 @@ mit deiner Emailadresse soll eine Sprechstunde mit folgenden Daten {{if eq .Requ
{{.Request.OfficeHour.Course.Name}} {{.Request.OfficeHour.Course.Name}}
{{DayName .Request.OfficeHour.Date.Day}} {{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 {{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.Tutor.Name}}
{{.Request.OfficeHour.Room.Name}} {{.Request.OfficeHour.Room.Name}}

View file

@ -11,7 +11,7 @@
<p> <p>
Willst du die Sprechstunde<br> Willst du die Sprechstunde<br>
{{printf "%02d" .OfficeHour.Date.Hour}}:{{printf "%02d" .OfficeHour.Date.Minute}} - {{printf "%02d" .OfficeHour.EndDate.Hour}}:{{printf "%02d" .OfficeHour.EndDate.Minute}}<br> {{printf "%02d" .OfficeHour.Date.Hour}}:{{printf "%02d" .OfficeHour.Date.Minute}} - {{printf "%02d" .OfficeHour.EndDate.Hour}}:{{printf "%02d" .OfficeHour.EndDate.Minute}}<br>
{{if not (eq .OfficeHour.Date.Week "")}}{{ .OfficeHour.Date.Week }}<br>{{end}} {{if eq 0 $.Date.Week}}>Jede Woche<br>{{end}}{{if eq 1 $.Date.Week}}In Wochen mit Übung<br>{{end}}{{if eq 2 $.Date.Week}}In Wochen ohne Übung<br>{{end}}{{if eq 3 $.Date.Week}}In geraden Vorlesungswochen<br>{{end}}{{if eq 4 $.Date.Week}}In ungeraden Vorlesungswochen<br>{{end}}
{{.OfficeHour.Course.Name}}<br> {{.OfficeHour.Course.Name}}<br>
{{.OfficeHour.Tutor.Name}}<br> {{.OfficeHour.Tutor.Name}}<br>
{{.OfficeHour.Room.Name}}<br> {{.OfficeHour.Room.Name}}<br>

View file

@ -1,7 +1,7 @@
<td class="officeHour" rowspan="{{divide .OfficeHour.Duration .MinuteGranularity}}"> <td class="officeHour" rowspan="{{divide .OfficeHour.Duration .MinuteGranularity}}">
{{if .DeleteIcons}}<div style="text-align: right;"><a href="/deleteOfficeHour?id={{.OfficeHour.Id}}"></a></div>{{end}} {{if .DeleteIcons}}<div style="text-align: right;"><a href="/deleteOfficeHour?id={{.OfficeHour.Id}}"></a></div>{{end}}
{{printf "%02d" .OfficeHour.Date.Hour}}:{{printf "%02d" .OfficeHour.Date.Minute}} - {{printf "%02d" .OfficeHour.EndDate.Hour}}:{{printf "%02d" .OfficeHour.EndDate.Minute}}<br> {{printf "%02d" .OfficeHour.Date.Hour}}:{{printf "%02d" .OfficeHour.Date.Minute}} - {{printf "%02d" .OfficeHour.EndDate.Hour}}:{{printf "%02d" .OfficeHour.EndDate.Minute}}<br>
{{if not (eq .OfficeHour.Date.Week "")}}{{.OfficeHour.Date.Week}}<br>{{end}} {{if eq 1 .OfficeHour.Date.Week}}In Wochen mit Übung<br>{{end}}{{if eq 2 .OfficeHour.Date.Week}}In Wochen ohne Übung<br>{{end}}{{if eq 3 .OfficeHour.Date.Week}}In geraden Vorlesungswochen<br>{{end}}{{if eq 4 .OfficeHour.Date.Week}}In ungeraden Vorlesungswochen<br>{{end}}
{{.OfficeHour.Course.Name}}<br> {{.OfficeHour.Course.Name}}<br>
{{.OfficeHour.Tutor.Name}}<br> {{.OfficeHour.Tutor.Name}}<br>
{{.OfficeHour.Room.Name}} {{.OfficeHour.Room.Name}}