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 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)
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, })
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])