예제 #1
0
    def __init__(self, reservations, language):
        self.reservations = reservations
        self.language = language

        combined = tuple(combine_reservations(reservations))
        assert len(combined) == 1
        self.reservation = combined[0]
예제 #2
0
def send_reservation_mail(reservations,
                          email_type,
                          language,
                          to_managers=False,
                          reason=u'',
                          old_time=None,
                          new_time=None):

    if isinstance(reservations, CombinedReservations):
        reservation = reservations
    else:
        reservation = tuple(combine_reservations(reservations))[0]

    resource = utils.get_resource_by_uuid(reservation.resource)

    # the resource doesn't currently exist in testing so we quietly
    # exit. This should be changed => #TODO
    if not resource:
        log.warn('Cannot send email as the resource does not exist')
        return

    sender = utils.get_site_email_sender()

    if not sender:
        log.warn('Cannot send email as no sender is configured')
        return

    resource = resource.getObject()

    if to_managers:
        recipients = get_manager_emails(resource)
        if not recipients:
            log.warn("Couldn't find a manager to send an email to")
            return
    else:
        recipients = [reservation.email]

    subject, body = get_email_content(resource, email_type, language)

    for recipient in recipients:
        mail = ReservationMail(resource,
                               reservation,
                               sender=sender,
                               recipient=recipient,
                               subject=subject,
                               body=body,
                               reason=reason,
                               old_time=old_time,
                               new_time=new_time)

        if may_send_mail(resource, mail, intended_for_admin=to_managers):
            send_mail(resource, mail)
예제 #3
0
    def test_combined_reservations(self):
        class Reservation(object):
            def __init__(self, id, token, timespans, data):
                self.id = id
                self.data = data
                self.token = token
                self._timespans = timespans

            def timespans(self):
                return self._timespans

        reservations = [
            Reservation(1,
                        'a', [
                            (date(2014, 1, 1), date(2014, 1, 1)),
                            (date(2014, 1, 2), date(2014, 1, 2)),
                            (date(2014, 1, 3), date(2014, 1, 3)),
                        ],
                        data={'id': 1}),
            Reservation(2,
                        'b', [
                            (date(2015, 1, 1), date(2015, 1, 1)),
                            (date(2015, 1, 2), date(2015, 1, 2)),
                        ],
                        data={'id': 2}),
            Reservation(3,
                        'b', [
                            (date(2015, 1, 3), date(2015, 1, 3)),
                        ],
                        data={'id': 3}),
        ]

        combined = list(combine_reservations(reservations))
        self.assertEqual(len(combined), 2)

        a, b = combined
        self.assertEqual(a.reservation.data['id'], 1)
        self.assertEqual(b.reservation.data['id'], 2)

        self.assertEqual(a.timespans(), [
            (date(2014, 1, 1), date(2014, 1, 1)),
            (date(2014, 1, 2), date(2014, 1, 2)),
            (date(2014, 1, 3), date(2014, 1, 3)),
        ])

        self.assertEqual(b.timespans(), [
            (date(2015, 1, 1), date(2015, 1, 1)),
            (date(2015, 1, 2), date(2015, 1, 2)),
            (date(2015, 1, 3), date(2015, 1, 3)),
        ])
예제 #4
0
def send_reservation_mail(
    reservations, email_type, language, to_managers=False,
        reason=u'', old_time=None, new_time=None
):

    if isinstance(reservations, CombinedReservations):
        reservation = reservations
    else:
        reservation = tuple(combine_reservations(reservations))[0]

    resource = utils.get_resource_by_uuid(reservation.resource)

    # the resource doesn't currently exist in testing so we quietly
    # exit. This should be changed => #TODO
    if not resource:
        log.warn('Cannot send email as the resource does not exist')
        return

    sender = utils.get_site_email_sender()

    if not sender:
        log.warn('Cannot send email as no sender is configured')
        return

    resource = resource.getObject()

    if to_managers:
        recipients = get_manager_emails(resource)
        if not recipients:
            log.warn("Couldn't find a manager to send an email to")
            return
    else:
        recipients = [reservation.email]

    subject, body = get_email_content(resource, email_type, language)

    for recipient in recipients:
        mail = ReservationMail(
            resource, reservation,
            sender=sender,
            recipient=recipient,
            subject=subject,
            body=body,
            reason=reason,
            old_time=old_time,
            new_time=new_time
        )

        if may_send_mail(resource, mail, intended_for_admin=to_managers):
            send_mail(resource, mail)
예제 #5
0
def send_reservations_confirmed(reservations, language):

    sender = utils.get_site_email_sender()

    if not sender:
        log.warn('Cannot send email as no sender is configured')
        return

    # load resources
    resources = load_resources(reservations)

    # send reservations grouped by reservee email
    groupkey = lambda r: r.email
    by_recipient = groupby(sorted(reservations, key=groupkey), key=groupkey)

    for recipient, grouped_reservations in by_recipient:

        lines = []

        for reservation in combine_reservations(grouped_reservations):

            resource = resources[reservation.resource]

            prefix = '' if reservation.autoapprovable else '* '
            title_prefix = '{}x '.format(reservation.quota)
            lines.append(
                prefix + utils.get_resource_title(resource, title_prefix)
            )

            for start, end in reservation.timespans():
                lines.append(utils.display_date(start, end))

            lines.append('')

        # differs between resources
        subject, body = get_email_content(
            resource, 'reservation_received', language
        )

        mail = ReservationMail(
            resource, reservation,
            sender=sender,
            recipient=recipient,
            subject=subject,
            body=body,
            reservations=lines[:-1]
        )

        if may_send_mail(resource, mail, intended_for_admin=False):
            send_mail(resource, mail)
예제 #6
0
def send_reservations_confirmed(reservations, language):

    sender = utils.get_site_email_sender()

    if not sender:
        log.warn('Cannot send email as no sender is configured')
        return

    # load resources
    resources = load_resources(reservations)

    # send reservations grouped by reservee email
    groupkey = lambda r: r.email
    by_recipient = groupby(sorted(reservations, key=groupkey), key=groupkey)

    for recipient, grouped_reservations in by_recipient:

        lines = []

        for reservation in combine_reservations(grouped_reservations):

            resource = resources[reservation.resource]

            prefix = '' if reservation.autoapprovable else '* '
            title_prefix = '{}x '.format(reservation.quota)
            lines.append(prefix +
                         utils.get_resource_title(resource, title_prefix))

            for start, end in reservation.timespans():
                lines.append(utils.display_date(start, end))

            lines.append('')

        # differs between resources
        subject, body = get_email_content(resource, 'reservation_received',
                                          language)

        mail = ReservationMail(resource,
                               reservation,
                               sender=sender,
                               recipient=recipient,
                               subject=subject,
                               body=body,
                               reservations=lines[:-1])

        if may_send_mail(resource, mail, intended_for_admin=False):
            send_mail(resource, mail)
    def test_combined_reservations(self):

        class Reservation(object):

            def __init__(self, id, token, timespans, data):
                self.id = id
                self.data = data
                self.token = token
                self._timespans = timespans

            def timespans(self):
                return self._timespans

        reservations = [
            Reservation(1, 'a', [
                (date(2014, 1, 1), date(2014, 1, 1)),
                (date(2014, 1, 2), date(2014, 1, 2)),
                (date(2014, 1, 3), date(2014, 1, 3)),
            ], data={'id': 1}),
            Reservation(2, 'b', [
                (date(2015, 1, 1), date(2015, 1, 1)),
                (date(2015, 1, 2), date(2015, 1, 2)),
            ], data={'id': 2}),

            Reservation(3, 'b', [
                (date(2015, 1, 3), date(2015, 1, 3)),
            ], data={'id': 3}),
        ]

        combined = list(combine_reservations(reservations))
        self.assertEqual(len(combined), 2)

        a, b = combined
        self.assertEqual(a.reservation.data['id'], 1)
        self.assertEqual(b.reservation.data['id'], 2)

        self.assertEqual(a.timespans(), [
            (date(2014, 1, 1), date(2014, 1, 1)),
            (date(2014, 1, 2), date(2014, 1, 2)),
            (date(2014, 1, 3), date(2014, 1, 3)),
        ])

        self.assertEqual(b.timespans(), [
            (date(2015, 1, 1), date(2015, 1, 1)),
            (date(2015, 1, 2), date(2015, 1, 2)),
            (date(2015, 1, 3), date(2015, 1, 3)),
        ])
예제 #8
0
def on_reservations_confirmed(event):

    # send one mail to the reservee
    if settings.get('send_email_to_reservees'):
        send_reservations_confirmed(event.reservations, event.language)

    # send many mails to the admins
    if settings.get('send_email_to_managers') != 'never':
        for reservation in combine_reservations(event.reservations):

            if reservation.autoapprovable:
                send_reservation_mail(
                    reservation,
                    'reservation_made', event.language, to_managers=True
                )
            else:
                send_reservation_mail(
                    reservation,
                    'reservation_pending', event.language, to_managers=True
                )
예제 #9
0
def on_reservations_confirmed(event):

    # send one mail to the reservee
    if settings.get('send_email_to_reservees'):
        send_reservations_confirmed(event.reservations, event.language)

    # send many mails to the admins
    if settings.get('send_email_to_managers') != 'never':
        for reservation in combine_reservations(event.reservations):

            if reservation.autoapprovable:
                send_reservation_mail(reservation,
                                      'reservation_made',
                                      event.language,
                                      to_managers=True)
            else:
                send_reservation_mail(reservation,
                                      'reservation_pending',
                                      event.language,
                                      to_managers=True)
예제 #10
0
 def unique(self, reservations):
     return tuple(combine_reservations(reservations))
예제 #11
0
 def unique(self, reservations):
     return tuple(combine_reservations(reservations))