Skip to content

Commit d1fdb2c

Browse files
authored
Org: Improves robustness of reject view for reservations
Previously it was possible to accidentally reject all reservations if a link was clicked multiple times or the ticket was opened in multiple tabs. TYPE: Bugfix LINK: OGC-3072
1 parent 0a198f0 commit d1fdb2c

File tree

4 files changed

+39
-26
lines changed

4 files changed

+39
-26
lines changed

src/onegov/org/locale/de_CH/LC_MESSAGES/onegov.org.po

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
msgid ""
33
msgstr ""
44
"Project-Id-Version: PACKAGE 1.0\n"
5-
"POT-Creation-Date: 2026-03-25 11:20+0100\n"
5+
"POT-Creation-Date: 2026-03-31 12:57+0200\n"
66
"PO-Revision-Date: 2022-03-15 10:21+0100\n"
77
"Last-Translator: Marc Sommerhalder <marc.sommerhalder@seantis.ch>\n"
88
"Language-Team: German\n"
@@ -7374,6 +7374,9 @@ msgstr ""
73747374
"Die folgende Nachricht wird an ${address} gesendet und als zukünftige "
73757375
"Referenz gespeichert."
73767376

7377+
msgid "The targeted reservation no longer exists"
7378+
msgstr "Die Reservation existiert nicht oder wurde bereits abgelehnt"
7379+
73777380
msgid ""
73787381
"The payment associated with this reservation needs to be refunded before the "
73797382
"reservation can be rejected"

src/onegov/org/locale/fr_CH/LC_MESSAGES/onegov.org.po

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
msgid ""
33
msgstr ""
44
"Project-Id-Version: PACKAGE 1.0\n"
5-
"POT-Creation-Date: 2026-03-25 11:20+0100\n"
5+
"POT-Creation-Date: 2026-03-31 12:57+0200\n"
66
"PO-Revision-Date: 2022-03-15 10:50+0100\n"
77
"Last-Translator: Marc Sommerhalder <marc.sommerhalder@seantis.ch>\n"
88
"Language-Team: French\n"
@@ -7386,6 +7386,9 @@ msgstr ""
73867386
"Le message suivant sera envoyé à ${adresse} et sera enregistré pour des "
73877387
"références futures."
73887388

7389+
msgid "The targeted reservation no longer exists"
7390+
msgstr "La réservation n'existe plus ou a déjà été refusée"
7391+
73897392
msgid ""
73907393
"The payment associated with this reservation needs to be refunded before the "
73917394
"reservation can be rejected"

src/onegov/org/locale/it_CH/LC_MESSAGES/onegov.org.po

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
msgid ""
33
msgstr ""
44
"Project-Id-Version: \n"
5-
"POT-Creation-Date: 2026-03-25 11:20+0100\n"
5+
"POT-Creation-Date: 2026-03-31 12:57+0200\n"
66
"PO-Revision-Date: 2022-03-15 10:52+0100\n"
77
"Last-Translator: \n"
88
"Language-Team: \n"
@@ -7349,6 +7349,9 @@ msgstr ""
73497349
"Il seguente messaggio verrà inviato a ${address} e sarà registrato per "
73507350
"riferimento futuro."
73517351

7352+
msgid "The targeted reservation no longer exists"
7353+
msgstr "La prenotazione non esiste più o è già stata rifiutata"
7354+
73527355
msgid ""
73537356
"The payment associated with this reservation needs to be refunded before the "
73547357
"reservation can be rejected"

src/onegov/org/views/reservation.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,26 +1235,40 @@ def reject_reservation(
12351235
view_ticket: ReservationTicket | None = None
12361236
) -> Response | None:
12371237

1238+
def respond() -> Response | None:
1239+
# return none on intercooler js requests
1240+
if not request.headers.get('X-IC-Request'):
1241+
if view_ticket is not None:
1242+
return request.redirect(request.link(view_ticket))
1243+
return request.redirect(request.link(self))
1244+
return None
1245+
12381246
token = self.token
12391247
resource = request.app.libres_resources.by_reservation(self)
12401248
assert resource is not None
12411249
reservation_id_str = request.params.get('reservation-id')
1242-
if isinstance(reservation_id_str, str) and reservation_id_str.isdigit():
1243-
reservation_id = int(reservation_id_str)
1244-
else:
1245-
reservation_id = 0
1246-
12471250
all_reservations: list[Reservation] = (
12481251
resource.scheduler.reservations_by_token(token) # type:ignore
12491252
.order_by(Reservation.start).all()
12501253
)
1251-
12521254
targeted: Sequence[Reservation]
1253-
targeted = tuple(r for r in all_reservations if r.id == reservation_id)
1254-
targeted = targeted or all_reservations
1255-
excluded = tuple(r for r in all_reservations if r.id not in {
1256-
r.id for r in targeted
1257-
})
1255+
if reservation_id_str is not None:
1256+
if not (
1257+
isinstance(reservation_id_str, str)
1258+
and reservation_id_str.isdigit()
1259+
):
1260+
raise exc.HTTPBadRequest()
1261+
1262+
reservation_id = int(reservation_id_str)
1263+
targeted = tuple(r for r in all_reservations if r.id == reservation_id)
1264+
if not targeted:
1265+
request.warning(_('The targeted reservation no longer exists'))
1266+
return respond()
1267+
else:
1268+
targeted = all_reservations
1269+
1270+
targeted_ids = {r.id for r in targeted}
1271+
excluded = tuple(r for r in all_reservations if r.id not in targeted_ids)
12581272

12591273
forms = FormCollection(request.session)
12601274
submission = forms.submissions.by_id(token)
@@ -1277,12 +1291,7 @@ def reject_reservation(
12771291
'to be refunded before the reservation can be rejected'
12781292
))
12791293

1280-
if not request.headers.get('X-IC-Request'):
1281-
if view_ticket is not None:
1282-
return request.redirect(request.link(view_ticket))
1283-
return request.redirect(request.link(self))
1284-
1285-
return None
1294+
return respond()
12861295

12871296
savepoint = transaction.savepoint()
12881297
ReservationMessage.create(targeted, ticket, request, 'rejected')
@@ -1441,12 +1450,7 @@ def email_iter() -> Iterator[EmailJsonDict]:
14411450
'but the payment is no longer open.'
14421451
))
14431452

1444-
# return none on intercooler js requests
1445-
if not request.headers.get('X-IC-Request'):
1446-
if view_ticket is not None:
1447-
return request.redirect(request.link(view_ticket))
1448-
return request.redirect(request.link(self))
1449-
return None
1453+
return respond()
14501454

14511455

14521456
@OrgApp.view(

0 commit comments

Comments
 (0)