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", - "", - ) - )