diff --git a/README.rst b/README.rst
index 14235601..298d3a39 100644
--- a/README.rst
+++ b/README.rst
@@ -755,7 +755,6 @@ This is useful for some SMTP servers that have problems with `quoted-printable`
By default the content-transfer-encoding is `quoted-printable` as overrided in
https://github.com/zopefoundation/Products.MailHost/blob/master/src/Products/MailHost/MailHost.py#L65
->>>>>>> master
How to develop
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/__init__.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/adapters.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/adapters.py
deleted file mode 100644
index 86ef298a..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/adapters.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-
-from zope.component import adapter
-from zope.component import getUtility
-from zope.interface import implementer
-
-from redturtle.prenotazioni import logger
-from redturtle.prenotazioni.content.prenotazione import IPrenotazione
-from redturtle.prenotazioni.interfaces import IBookingAPPIoMessage
-from redturtle.prenotazioni.interfaces import IBookingNotificationSender
-from redturtle.prenotazioni.interfaces import IBookingNotificatorSupervisorUtility
-from redturtle.prenotazioni.interfaces import IRedturtlePrenotazioniLayer
-from redturtle.prenotazioni.io_tools.api import Api
-from redturtle.prenotazioni.io_tools.storage import logstorage
-
-
-@implementer(IBookingNotificationSender)
-@adapter(IBookingAPPIoMessage, IPrenotazione, IRedturtlePrenotazioniLayer)
-class BookingTransitionAPPIoSender:
- def __init__(self, message_adapter, booking, request) -> None:
- self.message_adapter = message_adapter
- self.booking = booking
- self.request = request
-
- def send(self):
- message = self.message_adapter.message
- subject = self.message_adapter.subject
- booking_type = self.booking.get_booking_type()
- service_code = getattr(booking_type, "service_code", None)
-
- if not service_code:
- return
-
- api_key = os.environ.get(service_code)
-
- if not api_key:
- return
-
- if getUtility(IBookingNotificatorSupervisorUtility).is_appio_message_allowed(
- self.booking
- ):
- api = Api(secret=api_key, storage=logstorage)
- id = api.send_message(
- fiscal_code=self.booking.fiscalcode,
- subject=subject,
- body=message,
- )
-
- if not id:
- logger.error("Could not send notification via AppIO gateway")
- return
-
- logger.info(
- f"Sent the notification <{self.booking.UID()}>(`{message}`, `{subject}`) via AppIO gateway, id returned: {id}"
- )
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/configure.zcml b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/configure.zcml
deleted file mode 100644
index f023f23a..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/configure.zcml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/events.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/events.py
deleted file mode 100644
index e730793a..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/events.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from zope.component import getMultiAdapter
-from zope.globalrequest import getRequest
-
-from redturtle.prenotazioni.behaviors.booking_folder import (
- get_booking_folder_notification_flags,
-)
-from redturtle.prenotazioni.interfaces import IBookingAPPIoMessage
-from redturtle.prenotazioni.interfaces import IBookingNotificationSender
-from redturtle.prenotazioni.utilities import handle_exception_by_log
-
-from .notification_appio import INotificationAppIO
-
-
-def booking_folder_provides_current_behavior(booking):
- return INotificationAppIO.providedBy(booking.getPrenotazioniFolder())
-
-
-@handle_exception_by_log
-def send_notification_on_transition(context, event) -> None:
- if not booking_folder_provides_current_behavior(context):
- return
-
- booking_folder = context.getPrenotazioniFolder()
- flags = get_booking_folder_notification_flags(booking_folder)
-
- if flags["confirm"] and getattr(booking_folder, "auto_confirm", False):
- flags["submit"] = False
-
- if flags.get(
- event.transition and event.transition.__name__ or "",
- False,
- ):
- message_adapter = getMultiAdapter(
- (context, event),
- IBookingAPPIoMessage,
- )
-
- sender_adapter = getMultiAdapter(
- (message_adapter, context, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_appio_sender",
- )
-
- if message_adapter and message_adapter.message:
- sender_adapter.send()
-
-
-# TODO: use the notify_on_after_transition_event method techique instead
-@handle_exception_by_log
-def notify_on_move(booking, event):
- if not booking_folder_provides_current_behavior(booking):
- return
-
- if not getattr(booking.getPrenotazioniFolder(), "notify_on_move", False):
- return
-
- message_adapter = getMultiAdapter((booking, event), IBookingAPPIoMessage)
- sender_adapter = getMultiAdapter(
- (message_adapter, booking, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_appio_sender",
- )
- if message_adapter and message_adapter.message:
- sender_adapter.send()
-
-
-@handle_exception_by_log
-def send_booking_reminder(context, event):
- if not booking_folder_provides_current_behavior(context):
- return
-
- message_adapter = getMultiAdapter(
- (context, event),
- IBookingAPPIoMessage,
- name="reminder_notification_appio_message",
- )
- sender_adapter = getMultiAdapter(
- (message_adapter, context, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_appio_sender",
- )
-
- if message_adapter and message_adapter.message:
- sender_adapter.send()
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/notfication_appio_message.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/notfication_appio_message.py
deleted file mode 100644
index 7d962aba..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/notfication_appio_message.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# -*- coding: utf-8 -*-
-"""AppIO notification templates"""
-
-from plone.stringinterp.interfaces import IContextWrapper
-from plone.stringinterp.interfaces import IStringInterpolator
-from Products.DCWorkflow.interfaces import IAfterTransitionEvent
-from zope.component import adapter
-from zope.interface import implementer
-
-from redturtle.prenotazioni.content.prenotazione import IPrenotazione
-from redturtle.prenotazioni.interfaces import IBookingAPPIoMessage
-from redturtle.prenotazioni.interfaces import IBookingReminderEvent
-from redturtle.prenotazioni.prenotazione_event import IMovedPrenotazione
-
-
-class PrenotazioneAPPIoMessage:
- prenotazione = None
- event = None
-
- def __init__(self, prenotazione, event):
- self.prenotazione = prenotazione
- self.event = event
-
- @property
- def message(self) -> str:
- NotImplementedError
-
-
-@implementer(IBookingAPPIoMessage)
-@adapter(IPrenotazione, IMovedPrenotazione)
-class PrenotazioneMovedAPPIoMessage(PrenotazioneAPPIoMessage):
- @property
- def message(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- "notify_on_move_appio_message",
- None,
- )
- )
-
- @property
- def subject(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- "notify_on_move_appio_subject",
- "",
- )
- )
-
-
-@implementer(IBookingAPPIoMessage)
-@adapter(IPrenotazione, IAfterTransitionEvent)
-class PrenotazioneAfterTransitionAPPIoMessage(PrenotazioneAPPIoMessage):
- @property
- def message(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- f"notify_on_{self.event.transition and self.event.transition.__name__}_appio_message",
- None,
- )
- )
-
- @property
- def subject(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- f"notify_on_{self.event.transition and self.event.transition.__name__}_appio_subject",
- None,
- )
- )
-
-
-@implementer(IBookingAPPIoMessage)
-@adapter(IPrenotazione, IBookingReminderEvent)
-class PrenotazioneReminderAppIOMessage(PrenotazioneAPPIoMessage):
- @property
- def message(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- "notify_as_reminder_appio_message",
- "",
- )
- )
-
- @property
- def subject(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- "notify_as_reminder_appio_subject",
- "",
- )
- )
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/notification_appio.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/notification_appio.py
deleted file mode 100644
index 64ab14eb..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/notification_appio.py
+++ /dev/null
@@ -1,308 +0,0 @@
-# -*- coding: utf-8 -*-
-from plone import api
-from plone.autoform.interfaces import IFormFieldProvider
-from plone.dexterity.interfaces import IDexterityContent
-from plone.supermodel import model
-from zope import schema
-from zope.component import adapter
-from zope.interface import implementer
-from zope.interface import provider
-from zope.schema.interfaces import IContextAwareDefaultFactory
-
-from redturtle.prenotazioni import _
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_submit_appio_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_submit_appio_subject_default_value",
- "[${prenotazioni_folder_title}] Booking created",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_submit_appio_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_submit_appio_message_default_value",
- "Booking ${booking_type} for ${booking_date} at ${booking_time} has been created.
You can see details and print a reminder following this [${booking_print_url}](link).",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_confirm_appio_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_confirm_appio_subject_default_value",
- "[${prenotazioni_folder_title}] Booking of ${booking_date} at ${booking_time} was accepted",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_confirm_appio_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_confirm_appio_message_default_value",
- "The booking ${booking_type} for ${title} has been confirmed."
- "
You can see details and print a reminder following this [link](${booking_print_url}).",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_move_appio_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_move_appio_subject_default_value",
- "[${prenotazioni_folder_title}] Booking date modified for ${title}",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_move_appio_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_move_appio_message_default_value",
- "The booking scheduling for ${booking_type} was modified."
- "
The new one is on ${booking_date} at ${booking_time}."
- "
You can see details and print a reminder following this [link](${booking_print_url}).",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_refuse_appio_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_refuse_appio_subject_default_value",
- "[${prenotazioni_folder_title}] Booking refused for ${title}",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_refuse_appio_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_refuse_appio_message_default_value",
- "The booking ${booking_type} of ${booking_date} at ${booking_time} was refused.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_as_reminder_appio_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_as_reminder_appio_subject_default_value",
- "[${prenotazioni_folder_title}] Booking reminder on ${booking_date}",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_as_reminder_appio_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_as_reminder_appio_message_default_value",
- "This is an automatic reminder about your booking on ${date} for ${booking_type}."
- "
You can see details and print a reminder following this [link](${booking_print_url}).",
- )
- )
-
-
-@provider(IFormFieldProvider)
-class INotificationAppIO(model.Schema):
- notifications_appio_enabled = schema.Bool(
- title=_("notifications_appio_enabled_label", default="AppIO notifications"),
- description=_(
- "notifications_appio_enabled_help",
- default="Enable AppIO notifications.",
- ),
- default=False,
- required=False,
- )
- notify_on_submit_appio_subject = schema.TextLine(
- title=_(
- "notify_on_submit_subject",
- default="[Created] subject",
- ),
- description=_(
- "notify_on_submit_subject_help",
- default="The message subject when a booking has been created.",
- ),
- defaultFactory=notify_on_submit_appio_subject_default_factory,
- required=False,
- )
- notify_on_submit_appio_message = schema.Text(
- title=_(
- "notify_on_submit_message",
- default="[Created] message",
- ),
- description=_(
- "notify_on_submit_message_help",
- default="The message text when a booking has been created.",
- ),
- defaultFactory=notify_on_submit_appio_message_default_factory,
- required=False,
- )
- notify_on_confirm_appio_subject = schema.Text(
- title=_(
- "notify_on_confirm_subject",
- default="[Confirm] subject",
- ),
- description=_(
- "notify_on_confirm_subject_help",
- default="The message subject when a booking has been confirmed.",
- ),
- defaultFactory=notify_on_confirm_appio_subject_default_factory,
- required=False,
- )
- notify_on_confirm_appio_message = schema.Text(
- title=_(
- "notify_on_confirm_message",
- default="[Confirmed] message",
- ),
- description=_(
- "notify_on_confirm_message_help",
- default="The message text when a booking has been confirmed.",
- ),
- defaultFactory=notify_on_confirm_appio_message_default_factory,
- required=False,
- )
- notify_on_move_appio_subject = schema.Text(
- title=_(
- "notify_on_move_subject",
- default="[Move] subject",
- ),
- description=_(
- "notify_on_move_subject_help",
- default="The message subject when a booking has been moved.",
- ),
- defaultFactory=notify_on_move_appio_subject_default_factory,
- required=False,
- )
- notify_on_move_appio_message = schema.Text(
- title=_(
- "notify_on_move_message",
- default="[Move] message",
- ),
- description=_(
- "notify_on_move_message_help",
- default="The message text when a booking has been moved.",
- ),
- defaultFactory=notify_on_move_appio_message_default_factory,
- required=False,
- )
- notify_on_refuse_appio_subject = schema.Text(
- title=_(
- "notify_on_refuse_subject",
- default="[Refuse] subject",
- ),
- description=_(
- "notify_on_refuse_subject_help",
- default="The message subject when a booking has been refused.",
- ),
- defaultFactory=notify_on_refuse_appio_subject_default_factory,
- required=False,
- )
- notify_on_refuse_appio_message = schema.Text(
- title=_(
- "notify_on_refuse_message",
- default="[Refuse] message",
- ),
- description=_(
- "notify_on_refuse_message_help",
- default="The message text when a booking has been refused.",
- ),
- defaultFactory=notify_on_refuse_appio_message_default_factory,
- required=False,
- )
- notify_as_reminder_appio_subject = schema.Text(
- title=_(
- "notify_as_reminder_subject",
- default="[Reminder] subject",
- ),
- description=_(
- "notify_as_reminder_appio_subject_help",
- default="The message subject when a reminder will be sent.",
- ),
- defaultFactory=notify_as_reminder_appio_subject_default_factory,
- required=False,
- )
- notify_as_reminder_appio_message = schema.Text(
- title=_(
- "notify_as_reminder_message",
- default="[Reminder] message",
- ),
- description=_(
- "notify_as_reminder_message_help",
- default="The message text when a reminder will be sent.",
- ),
- defaultFactory=notify_as_reminder_appio_message_default_factory,
- required=False,
- )
-
- model.fieldset(
- "appio_notifications",
- label=_(
- "bookings_appio_templates_label",
- default="AppIO Notifications",
- ),
- description=_(
- "bookings_appio_templates_help",
- default="Set message text for all available notification events.",
- ),
- fields=[
- "notifications_appio_enabled",
- "notify_on_submit_appio_subject",
- "notify_on_submit_appio_message",
- "notify_on_confirm_appio_subject",
- "notify_on_confirm_appio_message",
- "notify_on_move_appio_subject",
- "notify_on_move_appio_message",
- "notify_on_refuse_appio_subject",
- "notify_on_refuse_appio_message",
- "notify_as_reminder_appio_subject",
- "notify_as_reminder_appio_message",
- ],
- )
-
-
-@implementer(INotificationAppIO)
-@adapter(IDexterityContent)
-class NotificationAppIO(object):
- """ """
-
- def __init__(self, context):
- self.context = context
-
-
-@provider(IFormFieldProvider)
-class INotificationAppioBookingType(model.Schema):
- service_code = schema.Choice(
- title=_(
- "service_code_label",
- default="AppIO service code.",
- ),
- description=_(
- "service_code_help",
- default="AppIO service code related to the current booking type",
- ),
- required=False,
- vocabulary="redturtle.prenotazioni.appio_services",
- )
-
-
-@implementer(INotificationAppioBookingType)
-@adapter(IDexterityContent)
-class NotificationAppIOBookingType(object):
- """ """
-
- def __init__(self, context):
- self.context = context
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/voc_service_keys.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/voc_service_keys.py
deleted file mode 100644
index 597b3175..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_appio/voc_service_keys.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-import re
-
-from zope.interface import implementer
-from zope.schema.interfaces import IVocabularyFactory
-from zope.schema.vocabulary import SimpleTerm
-from zope.schema.vocabulary import SimpleVocabulary
-
-
-@implementer(IVocabularyFactory)
-class VocPrenotazioneTypeGatesFactory(object):
- """ """
-
- def __call__(self, context):
- terms = []
-
- myPattern = re.compile(r"REDTURTLE_PRENOTAZIONI_APPIO_KEY_\w+")
-
- for key in os.environ.keys():
- if myPattern.match(key):
- terms.append(
- SimpleTerm(
- value=key,
- token=key,
- title=key.replace("REDTURTLE_PRENOTAZIONI_APPIO_KEY_", ""),
- )
- )
-
- return SimpleVocabulary(terms)
-
-
-VocPrenotazioneTypeGatesFactory = VocPrenotazioneTypeGatesFactory()
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/__init__.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/adapters.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/adapters.py
deleted file mode 100644
index 3375e3dd..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/adapters.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# -*- coding: utf-8 -*-
-from zope.component import adapter
-from zope.component import getUtility
-from zope.interface import implementer
-
-from redturtle.prenotazioni import logger
-from redturtle.prenotazioni.content.prenotazione import IPrenotazione
-from redturtle.prenotazioni.interfaces import IBookingEmailMessage
-from redturtle.prenotazioni.interfaces import IBookingNotificationSender
-from redturtle.prenotazioni.interfaces import IBookingNotificatorSupervisorUtility
-from redturtle.prenotazioni.interfaces import IRedturtlePrenotazioniLayer
-from redturtle.prenotazioni.utilities import send_email
-
-
-@implementer(IBookingNotificationSender)
-@adapter(IBookingEmailMessage, IPrenotazione, IRedturtlePrenotazioniLayer)
-class BookingTransitionEmailSender:
- def __init__(self, message_adapter, booking, request) -> None:
- self.message_adapter = message_adapter
- self.booking = booking
- self.request = request
-
- def send(self, force=False):
- message = self.message_adapter.message
-
- if force or getUtility(
- IBookingNotificatorSupervisorUtility
- ).is_email_message_allowed(self.booking):
- logger.debug(
- f"Sending the notification <{self.booking.UID()}>(`{message}`) via Email gateway"
- )
- logger.info(
- f"Sending the notification <{self.booking.UID()}> via Email gateway"
- )
- send_email(message)
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/configure.zcml b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/configure.zcml
deleted file mode 100644
index a3a2951e..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/configure.zcml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/events.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/events.py
deleted file mode 100644
index 6ca25b8f..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/events.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from zope.component import getMultiAdapter
-from zope.globalrequest import getRequest
-
-from redturtle.prenotazioni import is_migration
-from redturtle.prenotazioni.behaviors.booking_folder import (
- get_booking_folder_notification_flags,
-)
-from redturtle.prenotazioni.interfaces import IBookingEmailMessage
-from redturtle.prenotazioni.interfaces import IBookingNotificationSender
-from redturtle.prenotazioni.utilities import handle_exception_by_log
-
-from .notification_email import INotificationEmail
-
-
-def booking_folder_provides_current_behavior(booking):
- return INotificationEmail.providedBy(booking.getPrenotazioniFolder())
-
-
-@handle_exception_by_log
-def send_email_notification_on_transition(context, event) -> None:
- if not booking_folder_provides_current_behavior(context):
- return
-
- booking_folder = context.getPrenotazioniFolder()
- flags = get_booking_folder_notification_flags(booking_folder)
-
- if flags["confirm"] and getattr(booking_folder, "auto_confirm", False):
- flags["submit"] = False
-
- if flags.get(
- event.transition and event.transition.__name__ or "",
- False,
- ):
- if not getattr(context, "email", ""):
- # booking does not have an email set
- return
- message_adapter = getMultiAdapter(
- (context, event),
- IBookingEmailMessage,
- )
- sender_adapter = getMultiAdapter(
- (message_adapter, context, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_email_sender",
- )
-
- if message_adapter and message_adapter.message:
- sender_adapter.send()
-
-
-# TODO: use the notify_on_after_transition_event method techique instead
-@handle_exception_by_log
-def notify_on_move(booking, event):
- if not booking_folder_provides_current_behavior(booking):
- return
-
- if not getattr(booking.getPrenotazioniFolder(), "notify_on_move", False):
- return
- if not getattr(booking, "email", ""):
- # booking does not have an email set
- return
- message_adapter = getMultiAdapter((booking, event), IBookingEmailMessage)
- sender_adapter = getMultiAdapter(
- (message_adapter, booking, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_email_sender",
- )
-
- sender_adapter.send()
-
-
-@handle_exception_by_log
-def send_booking_reminder(context, event):
- if not booking_folder_provides_current_behavior(context):
- return
-
- message_adapter = getMultiAdapter(
- (context, event),
- IBookingEmailMessage,
- name="reminder_notification_email_message",
- )
- sender_adapter = getMultiAdapter(
- (message_adapter, context, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_email_sender",
- )
-
- sender_adapter.send()
-
-
-@handle_exception_by_log
-def send_email_to_managers(booking, event):
- if not booking_folder_provides_current_behavior(booking):
- return
-
- # skip email for vacation/out-of-office
- if is_migration():
- return
-
- if booking.isVacation():
- return
- if not getattr(booking, "email_responsabile", []):
- return
-
- message_adapter = getMultiAdapter(
- (booking, event), IBookingEmailMessage, name="notify_manager"
- )
- sender_adapter = getMultiAdapter(
- (message_adapter, booking, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_email_sender",
- )
-
- sender_adapter.send(force=True)
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/notification_email.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/notification_email.py
deleted file mode 100644
index c1995c9e..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_email/notification_email.py
+++ /dev/null
@@ -1,283 +0,0 @@
-# -*- coding: utf-8 -*-
-from plone import api
-from plone.autoform.interfaces import IFormFieldProvider
-from plone.dexterity.interfaces import IDexterityContent
-from plone.supermodel import model
-from zope import schema
-from zope.component import adapter
-from zope.interface import implementer
-from zope.interface import provider
-from zope.schema.interfaces import IContextAwareDefaultFactory
-
-from redturtle.prenotazioni import _
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_submit_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_submit_subject_default_value",
- "[${prenotazioni_folder_title}] Booking created",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_submit_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_submit_message_default_value",
- "Booking ${booking_type} for ${booking_date} at ${booking_time} has been created.
You can see details and print a reminder following this link.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_confirm_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_confirm_subject_default_value",
- "[${prenotazioni_folder_title}] Booking of ${booking_date} at ${booking_time} was accepted",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_confirm_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_confirm_message_default_value",
- "The booking ${booking_type} for ${title} has been confirmed."
- "
You can see details and print a reminder following this link.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_move_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_move_subject_default_value",
- "[${prenotazioni_folder_title}] Booking date modified for ${title}",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_move_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_move_message_default_value",
- "The booking scheduling for ${booking_type} was modified."
- "
The new one is on ${booking_date} at ${booking_time}."
- "
You can see details and print a reminder following this link.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_refuse_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_refuse_subject_default_value",
- "[${prenotazioni_folder_title}] Booking refused for ${title}",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_refuse_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_refuse_message_default_value",
- "The booking ${booking_type} of ${booking_date} at ${booking_time} was refused.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_as_reminder_subject_default_factory(context):
- return api.portal.translate(
- _(
- "notify_as_reminder_subject_default_value",
- "[${prenotazioni_folder_title}] Booking reminder on ${booking_date}",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_as_reminder_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_as_reminder_message_default_value",
- "This is an automatic reminder about your booking on ${date} for ${booking_type}."
- "
You can see details and print a reminder following this link.",
- )
- )
-
-
-@provider(IFormFieldProvider)
-class INotificationEmail(model.Schema):
- notifications_email_enabled = schema.Bool(
- title=_("notifications_email_enabled_label", default="Email notifications"),
- description=_(
- "notifications_email_enabled_help",
- default="Enable Email notifications.",
- ),
- default=True,
- required=False,
- )
- notify_on_submit_subject = schema.TextLine(
- title=_(
- "notify_on_submit_subject",
- default="[Created] subject",
- ),
- description=_(
- "notify_on_submit_subject_help",
- default="The message subject when a booking has been created.",
- ),
- defaultFactory=notify_on_submit_subject_default_factory,
- required=False,
- )
- notify_on_submit_message = schema.Text(
- title=_(
- "notify_on_submit_message",
- default="[Created] message",
- ),
- description=_(
- "notify_on_submit_message_help",
- default="The message text when a booking has been created.",
- ),
- defaultFactory=notify_on_submit_message_default_factory,
- required=False,
- )
- notify_on_confirm_subject = schema.TextLine(
- title=_(
- "notify_on_confirm_subject",
- default="[Confirm] subject",
- ),
- description=_(
- "notify_on_confirm_subject_help",
- default="The message subject when a booking has been confirmed.",
- ),
- defaultFactory=notify_on_confirm_subject_default_factory,
- required=False,
- )
- notify_on_confirm_message = schema.Text(
- title=_(
- "notify_on_confirm_message",
- default="[Confirmed] message",
- ),
- description=_(
- "notify_on_confirm_message_help",
- default="The message text when a booking has been confirmed.",
- ),
- defaultFactory=notify_on_confirm_message_default_factory,
- required=False,
- )
- notify_on_move_subject = schema.TextLine(
- title=_(
- "notify_on_move_subject",
- default="[Move] subject",
- ),
- description=_(
- "notify_on_move_subject_help",
- default="The message subject when a booking has been moved.",
- ),
- defaultFactory=notify_on_move_subject_default_factory,
- required=False,
- )
- notify_on_move_message = schema.Text(
- title=_(
- "notify_on_move_message",
- default="[Move] message",
- ),
- description=_(
- "notify_on_move_message_help",
- default="The message text when a booking has been moved.",
- ),
- defaultFactory=notify_on_move_message_default_factory,
- required=False,
- )
- notify_on_refuse_subject = schema.TextLine(
- title=_(
- "notify_on_refuse_subject",
- default="[Refuse] subject",
- ),
- description=_(
- "notify_on_refuse_subject_help",
- default="The message subject when a booking has been refused.",
- ),
- defaultFactory=notify_on_refuse_subject_default_factory,
- required=False,
- )
- notify_on_refuse_message = schema.Text(
- title=_(
- "notify_on_refuse_message",
- default="[Refuse] message",
- ),
- description=_(
- "notify_on_refuse_message_help",
- default="The message text when a booking has been refused.",
- ),
- defaultFactory=notify_on_refuse_message_default_factory,
- required=False,
- )
- notify_as_reminder_subject = schema.TextLine(
- title=_(
- "notify_as_reminder_subject",
- default="[Reminder] subject",
- ),
- description=_(
- "notify_as_reminder_subject_help",
- default="The message subject when a reminder will be sent.",
- ),
- defaultFactory=notify_as_reminder_subject_default_factory,
- required=False,
- )
- notify_as_reminder_message = schema.Text(
- title=_(
- "notify_as_reminder_message",
- default="[Reminder] message",
- ),
- description=_(
- "notify_as_reminder_message_help",
- default="The message text when a reminder will be sent.",
- ),
- defaultFactory=notify_as_reminder_message_default_factory,
- required=False,
- )
-
- model.fieldset(
- "email_notifications",
- label=_(
- "bookings_email_templates_label",
- default="Email Notifications",
- ),
- description=_(
- "bookings_email_templates_help",
- default="Set message text for all available notification events.",
- ),
- fields=[
- "notifications_email_enabled",
- "notify_on_submit_subject",
- "notify_on_submit_message",
- "notify_on_confirm_subject",
- "notify_on_confirm_message",
- "notify_on_move_subject",
- "notify_on_move_message",
- "notify_on_refuse_subject",
- "notify_on_refuse_message",
- "notify_as_reminder_subject",
- "notify_as_reminder_message",
- ],
- )
-
-
-@implementer(INotificationEmail)
-@adapter(IDexterityContent)
-class NotificationEmail(object):
- """ """
-
- def __init__(self, context):
- self.context = context
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/__init__.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/adapters.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/adapters.py
deleted file mode 100644
index 0c130bd4..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/adapters.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from zope.component import adapter
-from zope.component import getUtility
-from zope.interface import Interface
-from zope.interface import implementer
-
-from redturtle.prenotazioni.content.prenotazione import IPrenotazione
-from redturtle.prenotazioni.interfaces import IBookingNotificationSender
-from redturtle.prenotazioni.interfaces import IBookingNotificatorSupervisorUtility
-from redturtle.prenotazioni.interfaces import IBookingSMSMessage
-
-
-@implementer(IBookingNotificationSender)
-@adapter(IBookingSMSMessage, IPrenotazione, Interface)
-class BookingNotificationSender:
- def __init__(self, message_adapter, booking, request) -> None:
- self.message_adapter = message_adapter
- self.booking = booking
- self.request = request
-
- def send(self):
- if self.is_notification_allowed():
- raise NotImplementedError("The method was not implemented")
-
- def is_notification_allowed(self):
- if getUtility(
- IBookingNotificatorSupervisorUtility,
- ).is_sms_message_allowed(self.booking):
- return True
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/configure.zcml b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/configure.zcml
deleted file mode 100644
index 1e2db8c0..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/configure.zcml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/events.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/events.py
deleted file mode 100644
index fd8abbf0..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/events.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from zope.component import getMultiAdapter
-from zope.globalrequest import getRequest
-
-from redturtle.prenotazioni.behaviors.booking_folder import (
- get_booking_folder_notification_flags,
-)
-from redturtle.prenotazioni.interfaces import IBookingNotificationSender
-from redturtle.prenotazioni.interfaces import IBookingSMSMessage
-from redturtle.prenotazioni.utilities import handle_exception_by_log
-
-from .notification_sms import INotificationSMS
-
-
-def booking_folder_provides_current_behavior(booking):
- return INotificationSMS.providedBy(booking.getPrenotazioniFolder())
-
-
-@handle_exception_by_log
-def send_notification_on_transition(context, event) -> None:
- if not booking_folder_provides_current_behavior(context):
- return
-
- booking_folder = context.getPrenotazioniFolder()
- flags = get_booking_folder_notification_flags(booking_folder)
-
- if flags["confirm"] and getattr(booking_folder, "auto_confirm", False):
- flags["submit"] = False
-
- if flags.get(
- event.transition and event.transition.__name__ or "",
- False,
- ):
- if not getattr(context, "phone", ""):
- # booking does not have an phone set
- return
-
- message_adapter = getMultiAdapter(
- (context, event),
- IBookingSMSMessage,
- )
-
- sender_adapter = getMultiAdapter(
- (message_adapter, context, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_sms_sender",
- )
-
- if message_adapter and message_adapter.message:
- sender_adapter.send()
-
-
-# TODO: use the notify_on_after_transition_event method techique instead
-@handle_exception_by_log
-def notify_on_move(booking, event):
- if not booking_folder_provides_current_behavior(booking):
- return
-
- if not getattr(booking.getPrenotazioniFolder(), "notify_on_move", False):
- return
- if not getattr(booking, "email", ""):
- # booking does not have an email set
- return
- message_adapter = getMultiAdapter((booking, event), IBookingSMSMessage)
- sender_adapter = getMultiAdapter(
- (message_adapter, booking, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_sms_sender",
- )
- if message_adapter and message_adapter.message:
- sender_adapter.send()
-
-
-@handle_exception_by_log
-def send_booking_reminder(context, event):
- if not booking_folder_provides_current_behavior(context):
- return
-
- message_adapter = getMultiAdapter(
- (context, event),
- IBookingSMSMessage,
- name="reminder_notification_sms_message",
- )
- sender_adapter = getMultiAdapter(
- (message_adapter, context, getRequest()),
- IBookingNotificationSender,
- name="booking_transition_sms_sender",
- )
-
- if message_adapter and message_adapter.message:
- sender_adapter.send()
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/notification_sms.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/notification_sms.py
deleted file mode 100644
index 0614db08..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/notification_sms.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# -*- coding: utf-8 -*-
-from plone import api
-from plone.autoform.interfaces import IFormFieldProvider
-from plone.dexterity.interfaces import IDexterityContent
-from plone.supermodel import model
-from zope import schema
-from zope.component import adapter
-from zope.interface import implementer
-from zope.interface import provider
-from zope.schema.interfaces import IContextAwareDefaultFactory
-
-from redturtle.prenotazioni import _
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_submit_sms_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_submit_sms_message_default_value",
- "[${prenotazioni_folder_title}]: Booking ${booking_type} for ${booking_date} at ${booking_time} has been created.\nSee details or delete it: ${booking_print_url}.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_confirm_sms_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_confirm_sms_message_default_value",
- "[${prenotazioni_folder_title}]: Booking of ${booking_date} at ${booking_time} has been accepted.\nSee details or delete it: ${booking_print_url}.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_move_sms_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_move_sms_message_default_value",
- "[${prenotazioni_folder_title}]: The booking scheduling for ${booking_type} was modified.\nThe new one is on ${booking_date} at ${booking_time}.\nSee details or delete it: ${booking_print_url}.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_on_refuse_sms_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_on_refuse_sms_message_default_value",
- "[${prenotazioni_folder_title}]: The booking ${booking_type} of ${booking_date} at ${booking_time} was refused.",
- )
- )
-
-
-@provider(IContextAwareDefaultFactory)
-def notify_as_reminder_sms_message_default_factory(context):
- return api.portal.translate(
- _(
- "notify_as_reminder_sms_message_default_value",
- "[${prenotazioni_folder_title}]: This is an automatic reminder about your booking on ${date} for ${booking_type}."
- "\nSee details or delete it: ${booking_print_url}.",
- )
- )
-
-
-@provider(IFormFieldProvider)
-class INotificationSMS(model.Schema):
- notifications_sms_enabled = schema.Bool(
- title=_("notifications_sms_enabled_label", default="SMS notifications"),
- description=_(
- "notifications_sms_enabled_help",
- default="Enable SMS notifications.",
- ),
- default=False,
- required=False,
- )
- notify_on_submit_sms_message = schema.Text(
- title=_(
- "notify_on_submit_message",
- default="[Created] message",
- ),
- description=_(
- "notify_on_submit_message_help",
- default="The message text when a booking has been created.",
- ),
- defaultFactory=notify_on_submit_sms_message_default_factory,
- required=False,
- )
- notify_on_confirm_sms_message = schema.Text(
- title=_(
- "notify_on_confirm_message",
- default="[Confirmed] message",
- ),
- description=_(
- "notify_on_confirm_message_help",
- default="The message text when a booking has been confirmed.",
- ),
- defaultFactory=notify_on_confirm_sms_message_default_factory,
- required=False,
- )
- notify_on_move_sms_message = schema.Text(
- title=_(
- "notify_on_move_message",
- default="[Move] message",
- ),
- description=_(
- "notify_on_move_message_help",
- default="The message text when a booking has been moved.",
- ),
- defaultFactory=notify_on_move_sms_message_default_factory,
- required=False,
- )
- notify_on_refuse_sms_message = schema.Text(
- title=_(
- "notify_on_refuse_message",
- default="[Refuse] message",
- ),
- description=_(
- "notify_on_refuse_message_help",
- default="The message text when a booking has been refused.",
- ),
- defaultFactory=notify_on_refuse_sms_message_default_factory,
- required=False,
- )
- notify_as_reminder_sms_message = schema.Text(
- title=_(
- "notify_as_reminder_message",
- default="[Reminder] message",
- ),
- description=_(
- "notify_as_reminder_message_help",
- default="The message text when a reminder will be sent.",
- ),
- defaultFactory=notify_as_reminder_sms_message_default_factory,
- required=False,
- )
-
- model.fieldset(
- "sms_notifications",
- label=_(
- "bookings_sms_templates_label",
- default="SMS Notifications",
- ),
- description=_(
- "bookings_sms_templates_help",
- default="Set message text for all available notification events. Remember that SMS has a 160 characters limit. Depending on your gateway service, it can split messages, if you exceed that limit.",
- ),
- fields=[
- "notifications_sms_enabled",
- "notify_on_submit_sms_message",
- "notify_on_confirm_sms_message",
- "notify_on_move_sms_message",
- "notify_on_refuse_sms_message",
- "notify_as_reminder_sms_message",
- ],
- )
-
-
-@implementer(INotificationSMS)
-@adapter(IDexterityContent)
-class NotificationSMS(object):
- """ """
-
- def __init__(self, context):
- self.context = context
diff --git a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/notification_sms_message.py b/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/notification_sms_message.py
deleted file mode 100644
index 95067fa3..00000000
--- a/src/redturtle/prenotazioni/behaviors/booking_folder/notification_sms/notification_sms_message.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-"""SMS Notification Templates"""
-
-from plone.stringinterp.interfaces import IContextWrapper
-from plone.stringinterp.interfaces import IStringInterpolator
-from Products.DCWorkflow.interfaces import IAfterTransitionEvent
-from zope.component import adapter
-from zope.interface import implementer
-
-from redturtle.prenotazioni.content.prenotazione import IPrenotazione
-from redturtle.prenotazioni.interfaces import IBookingReminderEvent
-from redturtle.prenotazioni.interfaces import IBookingSMSMessage
-from redturtle.prenotazioni.prenotazione_event import IMovedPrenotazione
-
-
-class PrenotazioneSMSMessage:
- prenotazione = None
- event = None
-
- def __init__(self, prenotazione, event):
- self.prenotazione = prenotazione
- self.event = event
-
- @property
- def message(self) -> str:
- NotImplementedError
-
-
-@implementer(IBookingSMSMessage)
-@adapter(IPrenotazione, IMovedPrenotazione)
-class PrenotazioneMovedSMSMessage(PrenotazioneSMSMessage):
- @property
- def message(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- "notify_on_move_sms_message",
- None,
- ),
- )
-
-
-@implementer(IBookingSMSMessage)
-@adapter(IPrenotazione, IAfterTransitionEvent)
-class PrenotazioneAfterTransitionSMSMessage(PrenotazioneSMSMessage):
- @property
- def message(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- f"notify_on_{self.event.transition and self.event.transition.__name__}_sms_message",
- None,
- ),
- )
-
-
-@implementer(IBookingSMSMessage)
-@adapter(IPrenotazione, IBookingReminderEvent)
-class PrenotazioneReminderSMSMessage(PrenotazioneSMSMessage):
- @property
- def message(self) -> str:
- return IStringInterpolator(IContextWrapper(self.prenotazione)())(
- getattr(
- self.prenotazione.getPrenotazioniFolder(),
- "notify_as_reminder_sms_message",
- "",
- )
- )