Exemplo n.º 1
0
 def setUp(self):
     user = User(username="******", first_name="Foo", last_name="Bar", email="*****@*****.**")
     user.save()
     self.player1 = Player(user=user, cell_phone="07123 4567890", other_phone="01234 567890")
     self.player1.save()
     user = User(username="******", first_name="Foo", last_name="Baz", email="*****@*****.**")
     user.save()
     self.player2 = Player(user=user)
     self.player2.save()
Exemplo n.º 2
0
Arquivo: views.py Projeto: perrys/WSRC
def booking_view(request, date=None):
    if date is None:
        date = datetime.date.today()
    else:
        date = timezones.parse_iso_date_to_naive(date)
    def get_bookings(date):
      today_str    = timezones.as_iso_date(date)
      tomorrow_str = timezones.as_iso_date(date + datetime.timedelta(days=1))
      url = settings.BOOKING_SYSTEM_URL + "/api/entries.php?start_date={today_str}&end_date={tomorrow_str}&with_tokens=1".format(**locals())
      h = httplib2.Http()
      (resp_headers, content) = h.request(url, "GET")
      if resp_headers.status != httplib.OK:
          raise Exception("unable to fetch bookings data, status = " + str(resp_headers.status) + ", response: " +  content)
      return content
    bookings = get_bookings(date)
    context = {
        "date": date,
        "bookings": bookings,
        "booking_system_url": settings.BOOKING_SYSTEM_URL,
        "starts": range(420, 1380, 15),
        "durations": [30, 45, 60, 75, 90, 120, 180, 240]
    }
    if request.user.is_authenticated():
      player = Player.get_player_for_user(request.user)
      if player is not None:
          booking_user_id = player.booking_system_id
          context["booking_user_id"] = booking_user_id
          context["booking_user_auth_token"] = BookingSystemEvent.generate_hmac_token_raw("id:{booking_user_id}".format(**locals()))
          context["booking_user_name"] = player.user.get_full_name()

    return render(request, 'court_booking.html', context)
Exemplo n.º 3
0
Arquivo: views.py Projeto: perrys/WSRC
def settings_view(request):

    max_filters = 7
    success = False
    player = Player.get_player_for_user(request.user)
    events = EventFilter.objects.filter(player=player)
    filter_formset_factory = create_notifier_filter_formset_factory(max_filters)
    initial = [{'player': player}] * (max_filters)
    if request.method == 'POST': 
        pform = PlayerForm(request.POST, instance=player)
        uform = UserForm(request.POST, instance=request.user)
        eformset = filter_formset_factory(request.POST, queryset=events, initial=initial)
        if pform.is_valid() and uform.is_valid() and eformset.is_valid(): 
            with transaction.atomic():
                if pform.has_changed():
                    pform.save()
                if uform.has_changed():
                    uform.save()
                for form in eformset:
                    if form.has_changed():
                        if form.cleaned_data['player'] != player:
                            raise PermissionDenied()
                if eformset.has_changed():
                    eformset.save()
                    events = EventFilter.objects.filter(player=player)
                    eformset = filter_formset_factory(queryset=events, initial=initial)
                success = True
    else:
        pform = PlayerForm(instance=player)
        uform = UserForm(instance=request.user)
        eformset = filter_formset_factory(queryset=events, initial=initial)

    iform = InfoForm(instance=player)

    return render(request, 'settings.html', {
        'player_form':     pform,
        'user_form':       uform,
        'info_form':       iform,
        'notify_formset':  eformset,
        'n_notifiers':     len(events),
        'form_saved':      success,
    })
Exemplo n.º 4
0
    class Tester(unittest.TestCase):
        def setUp(self):
            user = User(username="******", first_name="Foo", last_name="Bar", email="*****@*****.**")
            user.save()
            self.player1 = Player(user=user, cell_phone="07123 4567890", other_phone="01234 567890")
            self.player1.save()
            user = User(username="******", first_name="Foo", last_name="Baz", email="*****@*****.**")
            user.save()
            self.player2 = Player(user=user)
            self.player2.save()

        def tearDown(self):
            self.player1.user.delete()
            self.player2.user.delete()
            self.player1.delete()
            self.player2.delete()

        @staticmethod
        def create_filter(player, earliest, latest, notice, days):
            filter = EventFilter(player=player, earliest=earliest, latest=latest, notice_period_minutes=notice)
            filter.save()
            for day in days:
                filter.days.add(day)

        def test_GIVEN_db_WHEN_deserializing_THEN_expected_config_returned(self):
            Tester.create_filter(self.player1, "09:00", "09:30", 270, [6])  # 9-9:30 on saturdays
            Tester.create_filter(self.player1, "19:00", "20:30", 360, [1, 2, 3, 4, 5])  # 7-8:30pm weekdays

            notifier = TestNotifier(datetime.datetime(1999, 1, 1))
            filters = notifier.userfilters.get(self.player1.id)
            self.assertIsNotNone(filters)

            def get_instance_from_list(lst, cls, count=1):
                ntimes = 0
                for i in lst:
                    if isinstance(i, cls):
                        ntimes += 1
                        if ntimes == count:
                            return i
                self.fail("could not find instance of {cls} in list".format(**locals()))

            self.assertIsInstance(filters, evt_filters.And)
            lst1 = filters.filters
            self.assertEqual(3, len(lst1))

            not_user = get_instance_from_list(lst1, evt_filters.Not)
            self.assertIsInstance(not_user.filter, evt_filters.IsPerson)
            self.assertEqual(not_user.filter.person, self.player1.user.get_full_name())

            cuttoff = get_instance_from_list(lst1, evt_filters.Not, 2)
            self.assertIsInstance(cuttoff.filter, evt_filters.IsFutureEvent)
            self.assertEqual(FUTURE_CUTTOFF, cuttoff.filter.delay)

            event_filters = get_instance_from_list(lst1, evt_filters.Or)
            event_filters = event_filters.filters
            self.assertEqual(2, len(event_filters))

            def test_filter(filter, player, start_time, end_time, notice, days):
                self.assertIsInstance(filter, evt_filters.And)
                filter_lst = filter.filters
                self.assertEqual(3, len(filter_lst))
                timefilt = get_instance_from_list(filter_lst, evt_filters.TimeOfDay)
                self.assertEqual(datetime.datetime.strptime(start_time, "%H:%M").time(), timefilt.starttime)
                self.assertEqual(datetime.datetime.strptime(end_time, "%H:%M").time(), timefilt.endtime)
                dayfilt = get_instance_from_list(filter_lst, evt_filters.DaysOfWeek)
                self.assertEqual(days, dayfilt.days)
                noticfilt = get_instance_from_list(filter_lst, evt_filters.IsFutureEvent)
                self.assertEqual(datetime.timedelta(minutes=notice), noticfilt.delay)

            test_filter(event_filters[0], self.player1, "09:00", "09:30", 270, [6])
            test_filter(event_filters[1], self.player1, "19:00", "20:30", 360, [1, 2, 3, 4, 5])

        def test_GIVEN_time_range_WHEN_filtering_events_THEN_only_events_within_time_range_returned(self):
            Tester.create_filter(self.player1, "09:00", "10:30", 0, [6])  # 9-10:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 6, 0))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 8, 59), name="Baz Baz", court=1
            )  # saturday 8:59
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNone(evt_list)

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 31), name="Baz Baz", court=1
            )  # saturday 10:31
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNone(evt_list)

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 0), name="Baz Baz", court=1
            )  # saturday 9:00
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

            notifier.recorder.clear()

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 30), name="Baz Baz", court=1
            )  # saturday 10:30
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_day_filter_WHEN_filtering_events_THEN_only_events_on_given_days_returned(self):
            Tester.create_filter(self.player1, "09:00", "10:30", 0, [6])  # 9-10:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 6, 0))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 3, 9, 15), name="Baz Baz", court=1
            )  # sunday 9:15
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNone(evt_list)

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 15), name="Baz Baz", court=1
            )  # saturday 9:15
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_notice_period_WHEN_filtering_events_THEN_only_events_with_enough_notice_returned(self):
            Tester.create_filter(self.player1, "09:00", "12:30", 180, [6])  # 9-12:30 on saturdays, 3hrs notice
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 8, 0))  # saturday 8am

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 15), name="Baz Baz", court=1
            )  # saturday 9:15
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 12, 15), name="Baz Baz", court=1
            )  # saturday 12:15
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_zero_notice_period_WHEN_filtering_events_THEN_only_future_events_returned(self):
            Tester.create_filter(self.player1, "09:00", "12:30", 0, [6])  # 9-12:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 10, 0))  # saturday 10am

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 15), name="Baz Baz", court=1
            )  # saturday 9:15
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 0), name="Baz Baz", court=1
            )  # saturday 10:00
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 1), name="Baz Baz", court=1
            )  # saturday 10:01
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_event_WHEN_filtering_events_THEN_only_events_within_one_week_returned(self):
            Tester.create_filter(self.player1, "09:00", "12:30", 0, [6])  # 9-12:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 10, 0))  # saturday 10am

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 9, 10, 01), name="Baz Baz", court=1
            )  # next saturday 10:01
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 9, 10, 0), name="Baz Baz", court=1
            )  # next saturday 10:00
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)
            notifier.recorder.clear()

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 9, 9, 59), name="Baz Baz", court=1
            )  # next saturday 09:59
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_eventlist_WHEN_composing_email_THEN_expected_content_returned(self):
            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(2099, 2, 3, 20, 00), name="Foo Bar", court=2
            )
            notifier = Notifier(datetime.datetime(2099, 2, 3))

            def send_email(subject, text_body, html_body, from_address, to_list):
                expected_link = "http://booking.wokingsquashclub.org/edit_entry_fixed.php?room=2&area=1&hour=20&minute=00&year=2099&month=2&day=3"
                self.assertTrue(expected_link in text_body)
                self.assertTrue(expected_link in html_body)
                self.assertEqual("Court Cancellation", subject)
                self.assertEqual("*****@*****.**", from_address)
                self.assertEqual([self.player1.user.email], to_list)

            notifier.send_email = send_email
            notifier.notify(removed_event, [self.player1.id])