') == 1
def test_resource_week_view_event_outside_timeperiod(app, admin_user):
middle_day = now().replace(day=15)
middle_day = middle_day + datetime.timedelta(days=4 - middle_day.weekday())
resource = Resource.objects.create(label='Foo bar')
agenda = Agenda.objects.create(label='Agenda', kind='meetings')
agenda.resources.add(resource)
desk = Desk.objects.create(agenda=agenda, label='Desk')
meetingtype = MeetingType.objects.create(agenda=agenda, label='Bar', duration=30)
login(app)
# no time period - no events
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert 'No bookings this week.' in resp.text
assert 'div class="booking' not in resp.text
# book some slots
for hour, minute in [(9, 0), (17, 0)]:
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=localtime(
now().replace(day=middle_day.day - middle_day.weekday() + 2, hour=hour, minute=minute)
),
)
event.resources.add(resource)
Booking.objects.create(event=event)
# no time period - events are displayed
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 2
# events outside time period
TimePeriod.objects.create(
desk=desk, weekday=2, start_time=datetime.time(10, 0), end_time=datetime.time(16, 0)
)
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 2
assert 'Sunday' not in resp.text
assert 'Saturday' not in resp.text
# bookings are cancelled
Booking.objects.update(cancellation_datetime=now())
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 0
# create an event on saturday
Booking.objects.update(cancellation_datetime=None) # reset
middle_day = now().replace(day=15)
middle_day = middle_day + datetime.timedelta(days=5 - middle_day.weekday())
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=localtime(now().replace(day=middle_day.day, hour=10, minute=0)),
)
event.resources.add(resource)
Booking.objects.create(event=event)
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 3
assert 'Sunday' not in resp.text
assert 'Saturday' in resp.text
# bookings are cancelled
Booking.objects.update(cancellation_datetime=now())
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 0
# and a timeperiod
Booking.objects.update(cancellation_datetime=None) # reset
TimePeriod.objects.create(
desk=desk, weekday=5, start_time=datetime.time(11, 0), end_time=datetime.time(12, 0)
)
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 3
assert 'Sunday' not in resp.text
assert 'Saturday' in resp.text
# create an event on sunday
middle_day = now().replace(day=15)
middle_day = middle_day + datetime.timedelta(days=6 - middle_day.weekday())
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=localtime(now().replace(day=middle_day.day, hour=10, minute=0)),
)
event.resources.add(resource)
Booking.objects.create(event=event)
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 4
assert 'Sunday' in resp.text
assert 'Saturday' in resp.text
# bookings are cancelled
Booking.objects.update(cancellation_datetime=now())
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 0
# and a timeperiod
Booking.objects.update(cancellation_datetime=None) # reset
TimePeriod.objects.create(
desk=desk, weekday=6, start_time=datetime.time(11, 0), end_time=datetime.time(12, 0)
)
resp = app.get(
'/manage/resource/%s/week/%s/%s/%s/'
% (resource.pk, middle_day.year, middle_day.month, middle_day.day)
)
assert resp.text.count('div class="booking') == 4
assert 'Sunday' in resp.text
assert 'Saturday' in resp.text
def test_week_view_resource_as_manager(app, manager_user):
agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
resource = Resource.objects.create(label='Resource 1')
app = login(app, username='manager', password='manager')
today = datetime.date.today()
app.get(
'/manage/resource/%s/week/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day), status=403
)
@freezegun.freeze_time('2020-06-15')
def test_resource_month_view(app, admin_user):
resource = Resource.objects.create(label='Foo bar')
agenda = Agenda.objects.create(label='Agenda', kind='meetings')
agenda.resources.add(resource)
desk = Desk.objects.create(agenda=agenda, label='Desk')
meetingtype = MeetingType.objects.create(agenda=agenda, label='Bar', duration=20)
TimePeriod.objects.create(
desk=desk, weekday=0, start_time=datetime.time(10, 0), end_time=datetime.time(18, 0)
)
login(app)
today = datetime.date(2018, 11, 10) # fixed day
app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, 42, today.day), status=404)
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert '
Foo Bar'
assert resp.pyquery.find('div.booking a').not_('.cancel')[1].text.strip() == "
bar's Foo Bar"
assert '<b>bar's</b> Foo Bar' in resp
# cancel booking
booking = Booking.objects.first()
booking.cancel()
# make sure the are not
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('
') in (4, 5)
def test_resource_month_view_event_outside_timeperiod(app, admin_user):
today = now().date()
resource = Resource.objects.create(label='Foo bar')
agenda = Agenda.objects.create(label='Agenda', kind='meetings')
agenda.resources.add(resource)
desk = Desk.objects.create(agenda=agenda, label='Desk')
meetingtype = MeetingType.objects.create(agenda=agenda, label='Bar', duration=30)
login(app)
# no time period - no events
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert 'No bookings this month.' in resp.text
assert 'div class="booking' not in resp.text
# book some slots
middle_day = now().replace(day=15)
for hour, minute in [(9, 0), (17, 0)]:
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=localtime(now().replace(day=middle_day.day - middle_day.weekday() + 2)).replace(
hour=hour, minute=minute
),
)
event.resources.add(resource)
Booking.objects.create(event=event)
# no time period - events are displayed
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 2
# events outside time period
TimePeriod.objects.create(
desk=desk, weekday=2, start_time=datetime.time(10, 0), end_time=datetime.time(16, 0)
)
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 2
assert 'Sunday' not in resp.text
assert 'Saturday' not in resp.text
# bookings are cancelled
Booking.objects.update(cancellation_datetime=now())
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 0
# create an event on saturday
Booking.objects.update(cancellation_datetime=None) # reset
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=localtime(
now().replace(day=middle_day.day - middle_day.weekday() + 5, hour=10, minute=0)
),
)
event.resources.add(resource)
Booking.objects.create(event=event)
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 3
assert 'Sunday' not in resp.text
assert 'Saturday' in resp.text
# bookings are cancelled
Booking.objects.update(cancellation_datetime=now())
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 0
# and a timeperiod
Booking.objects.update(cancellation_datetime=None) # reset
TimePeriod.objects.create(
desk=desk, weekday=5, start_time=datetime.time(11, 0), end_time=datetime.time(12, 0)
)
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 3
assert 'Sunday' not in resp.text
assert 'Saturday' in resp.text
# create an event on sunday
middle_day = now().replace(day=15)
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=localtime(
now().replace(day=middle_day.day - middle_day.weekday() + 6, hour=10, minute=0)
),
)
event.resources.add(resource)
Booking.objects.create(event=event)
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 4
assert 'Sunday' in resp.text
assert 'Saturday' in resp.text
# bookings are cancelled
Booking.objects.update(cancellation_datetime=now())
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 0
# and a timeperiod
Booking.objects.update(cancellation_datetime=None) # reset
TimePeriod.objects.create(
desk=desk, weekday=6, start_time=datetime.time(11, 0), end_time=datetime.time(12, 0)
)
resp = app.get('/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert resp.text.count('div class="booking') == 4
assert 'Sunday' in resp.text
assert 'Saturday' in resp.text
def test_month_view_resource_as_manager(app, manager_user):
agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
resource = Resource.objects.create(label='Resource 1')
app = login(app, username='manager', password='manager')
today = datetime.date.today()
app.get(
'/manage/resource/%s/month/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day), status=403
)
def test_edit_resource(app, admin_user):
resource = Resource.objects.create(label='Foo bar')
app = login(app)
resp = app.get('/manage/resource/%s/' % resource.pk, status=200)
resp = resp.click('Edit')
resp.form['label'] = 'Foo bar baz'
resp.form['slug'] = 'baz'
resp = resp.form.submit()
assert resp.location.endswith('/manage/resource/%s/' % resource.pk)
resource.refresh_from_db()
assert resource.label == 'Foo bar baz'
assert resource.slug == 'baz'
def test_edit_resource_as_manager(app, manager_user):
agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
resource = Resource.objects.create(label='Resource 1')
app = login(app, username='manager', password='manager')
app.get('/manage/resource/%s/edit/' % resource.pk, status=403)
def test_delete_resource(app, admin_user):
resource = Resource.objects.create(label='Foo bar')
app = login(app)
resp = app.get('/manage/resource/%s/' % resource.pk, status=200)
resp = resp.click('Delete')
resp = resp.form.submit()
assert resp.location.endswith('/manage/resources/')
assert Resource.objects.exists() is False
def test_delete_resource_as_manager(app, manager_user):
agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
resource = Resource.objects.create(label='Resource 1')
app = login(app, username='manager', password='manager')
app.get('/manage/resource/%s/delete/' % resource.pk, status=403)
def test_agenda_resources(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
resource = Resource.objects.create(label='Resource 1')
app = login(app)
# not for events agenda
app.get('/manage/agendas/%s/add-resource/' % agenda.pk, status=404)
app.get('/manage/agendas/%s/resource/%s/delete/' % (agenda.pk, resource.pk), status=404)
def test_meetings_agenda_resources(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
assert 'has_resources' in resp.context
assert resp.context['has_resources'] is False
assert 'Add resource' not in resp.text
resource = Resource.objects.create(label='Resource 1')
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
assert 'has_resources' in resp.context
assert resp.context['has_resources'] is True
assert '/manage/resource/%s/' % resource.pk not in resp.text
assert '/manage/agendas/%s/resource/%s/delete/' % (agenda.pk, resource.pk) not in resp.text
resp = resp.click('Add resource')
assert list(resp.context['form'].fields['resource'].queryset) == [resource]
resp.form['resource'] = resource.pk
resp = resp.form.submit()
assert resp.location.endswith('/manage/agendas/%s/settings#open:resources' % agenda.pk)
assert list(agenda.resources.all()) == [resource]
resp = resp.follow()
assert '/manage/resource/%s/' % resource.pk in resp.text
assert '/manage/agendas/%s/resource/%s/delete/' % (agenda.pk, resource.pk) in resp.text
resp = resp.click('Add resource')
assert list(resp.context['form'].fields['resource'].queryset) == []
resp = app.get('/manage/agendas/%s/resource/%s/delete/' % (agenda.pk, resource.pk))
resp = resp.form.submit()
assert resp.location.endswith('/manage/agendas/%s/settings#open:resources' % agenda.pk)
assert list(agenda.resources.all()) == []
resp = resp.follow()
assert '/manage/resource/%s/' % resource.pk not in resp.text
assert '/manage/agendas/%s/resource/%s/delete/' % (agenda.pk, resource.pk) not in resp.text
@pytest.mark.parametrize(
'view',
(
'/manage/resource/%(resource)s/day/%(year)d/%(month)d/%(day)d/',
'/manage/resource/%(resource)s/month/%(year)d/%(month)d/%(day)d/',
),
)
def test_agenda_day_month_view_backoffice_url_translation(
app, admin_user, manager_user, api_user, settings, view
):
today = now().date()
resource = Resource.objects.create(label='Foo bar')
agenda = Agenda.objects.create(label='Agenda', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk')
meetingtype = MeetingType.objects.create(agenda=agenda, label='Bar', duration=30)
TimePeriod.objects.create(
desk=desk, weekday=today.weekday(), start_time=datetime.time(10, 0), end_time=datetime.time(18, 30)
)
login(app)
url = view % {'resource': resource.id, 'year': today.year, 'month': today.month, 'day': today.day}
# book some slots
for hour, minute in [(10, 30), (14, 0)]:
event = Event.objects.create(
agenda=agenda,
places=1,
desk=desk,
meeting_type=meetingtype,
start_datetime=now().replace(hour=hour, minute=minute),
)
event.resources.add(resource)
Booking.objects.create(event=event, backoffice_url='publik://default/foo/')
resp = app.get(url)
assert 'http://example.org/foo/' in resp.text
def test_resource_access_permission(app, manager_user):
agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
resource = Resource.objects.create(label='Resource 1', agenda=agenda)
resource2 = Resource.objects.create(label='Resource 2')
agenda.resources.add(resource)
app = login(app, username='manager', password='manager')
assert app.get('/manage/resource/%s/' % resource.pk, status=403)
assert app.get('/manage/resource/%s/' % resource2.pk, status=403)
agenda.edit_role = manager_user.groups.all()[0]
agenda.save()
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('Resource 1')
assert 'Edit' not in resp.text
assert 'Delete' not in resp.text
assert resp.click('Month')
assert resp.click('Week')
assert resp.click('Day')
assert app.get('/manage/resource/%s/' % resource2.pk, status=403)
@freezegun.freeze_time('2020-10-01')
def test_resource_today_button(app, admin_user):
agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
resource = Resource.objects.create(label='Resource 1', agenda=agenda)
today = datetime.date.today()
login(app)
resp = app.get('/manage/resource/%s/day/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert 'Today' in resp.pyquery('a.active').text()
resp = resp.click('Next day')
assert 'Today' not in resp.pyquery('a.active').text()
resp = resp.click('Today')
assert 'Today' in resp.pyquery('a.active').text()
resp = app.get('/manage/resource/%s/week/%s/%s/%s/' % (resource.pk, today.year, today.month, today.day))
assert 'Today' not in resp.pyquery('a.active').text()