Skip to content

Commit

Permalink
Workaround per booking_type con caratteri encodati due volte (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
mamico authored Jan 25, 2024
1 parent c4ba116 commit 7e740f5
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 9 deletions.
4 changes: 2 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Changelog
1.2.2 (unreleased)
------------------

- Nothing changed yet.

- Workaround per booking_type con caratteri encodati due volte
[mamico]

1.2.1 (2023-12-19)
------------------
Expand Down
42 changes: 35 additions & 7 deletions src/design/plone/ioprenoto/restapi/services/bookable_list/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from zope.component import getUtility
from zope.intid.interfaces import IIntIds

import re


logger = getLogger(__name__)

Expand Down Expand Up @@ -80,9 +82,10 @@ def get_sede(self, uo):
if not ref:
return {}
venue = ref[0].to_object
if not venue:
if venue and api.user.has_permission("View", obj=venue):
return getMultiAdapter((venue, self.request), ISerializeToJsonSummary)()
else:
return {}
return getMultiAdapter((venue, self.request), ISerializeToJsonSummary)()

def get_uo_from_service_uid(self, uid):
"""Dato lo UID di un servizio, restituisce lo UID dell'UO a cui è collegato
Expand All @@ -100,11 +103,33 @@ def get_uo_from_service_uid(self, uid):


class BookableUOList(BookableList):
def booking_type_check(self, prenotazioni_folder, booking_type):
if not booking_type:
return True
tocheck = [booking_type]
# XXX: per qualche problema di doppio encoding arrivano dal frontend delle
# stringhe con caratteri in hex, questo codice serve a gestire quelle
# casistiche. Una volta fissato sul frontend può essere tolto.
try:
tocheck.append(
re.sub(
r"\\x([0-9a-fA-F]{2})",
lambda x: bytes.fromhex(x.group(1)).decode("unicode-escape"),
booking_type,
)
)
except Exception:
logger.exception("Error in booking_type_check %s", booking_type)
booking_types = [
b_type["name"]
for b_type in getattr(prenotazioni_folder, "booking_types", [])
]
return bool(set(tocheck).intersection(booking_types))

def reply(self):
"""
Return all UO with at least one back-refence from PrenotazioniFolder
"""

response = {
"@id": f"{self.context.absolute_url()}/@bookable-uo-list",
"items": [],
Expand All @@ -129,21 +154,24 @@ def reply(self):
}
)
for rel in relations:
# XXX: qui si da per scontato che l'oggetto sia un PrenotazioniFolder,
# ma non è detto
prenotazioni_folder = rel.from_object
if prenotazioni_folder and api.user.has_permission(
"View", obj=prenotazioni_folder
):
if booking_type and booking_type not in [
typ["name"]
for typ in getattr(prenotazioni_folder, "booking_types", [])
]: # noqa: E501
if not self.booking_type_check(prenotazioni_folder, booking_type):
continue
folders.append(
{
"@id": prenotazioni_folder.absolute_url(),
"uid": prenotazioni_folder.UID(),
"title": prenotazioni_folder.Title(),
"orario_di_apertura": prenotazioni_folder.orario_di_apertura,
# XXX: viene associata alla prenotazione_folder la seda della UO,
# il problema però emerge se una prenotazione_folder ha più
# sedi associate. In questo caso non sarebbe più possibile
# ricostruire la sede corretta a partire dalla prenotazione_folder
"address": sede,
"description_agenda": json_compatible(
prenotazioni_folder.descriptionAgenda,
Expand Down

0 comments on commit 7e740f5

Please sign in to comment.