0001-manager-configuer-user-block-on-check-page-53237.patch
chrono/agendas/migrations/0079_booking_user_block_template.py | ||
---|---|---|
1 |
from django.db import migrations, models |
|
2 | ||
3 |
import chrono.agendas.models |
|
4 | ||
5 | ||
6 |
class Migration(migrations.Migration): |
|
7 | ||
8 |
dependencies = [ |
|
9 |
('agendas', '0078_absence_reasons'), |
|
10 |
] |
|
11 | ||
12 |
operations = [ |
|
13 |
migrations.AddField( |
|
14 |
model_name='agenda', |
|
15 |
name='booking_user_block_template', |
|
16 |
field=models.TextField( |
|
17 |
blank=True, |
|
18 |
help_text='Displayed for each booking in event check page', |
|
19 |
verbose_name='User block template', |
|
20 |
validators=[chrono.agendas.models.django_template_validator], |
|
21 |
), |
|
22 |
), |
|
23 |
] |
chrono/agendas/models.py | ||
---|---|---|
204 | 204 |
_('Booking form URL'), max_length=200, blank=True, validators=[django_template_validator] |
205 | 205 |
) |
206 | 206 |
desk_simple_management = models.BooleanField(default=False) |
207 |
booking_user_block_template = models.TextField( |
|
208 |
_('User block template'), |
|
209 |
help_text=_('Displayed for each booking in event check page'), |
|
210 |
blank=True, |
|
211 |
validators=[django_template_validator], |
|
212 |
) |
|
207 | 213 | |
208 | 214 |
class Meta: |
209 | 215 |
ordering = ['label'] |
... | ... | |
664 | 670 |
except (VariableDoesNotExist, TemplateSyntaxError): |
665 | 671 |
return |
666 | 672 | |
673 |
def get_booking_user_block_template(self): |
|
674 |
return ( |
|
675 |
self.booking_user_block_template |
|
676 |
or '{{ booking.user_name|default:booking.label|default:"%s" }}' % _('Unknown') |
|
677 |
) |
|
678 | ||
667 | 679 |
def prefetch_desks_and_exceptions(self, with_sources=False): |
668 | 680 |
if self.kind == 'meetings': |
669 | 681 |
desks = self.desk_set.all() |
... | ... | |
1548 | 1560 |
self.secondary_booking_set.update(in_waiting_list=True) |
1549 | 1561 |
self.save() |
1550 | 1562 | |
1563 |
def get_user_block(self): |
|
1564 |
template_vars = Context(settings.TEMPLATE_VARS) |
|
1565 |
template_vars.update( |
|
1566 |
{ |
|
1567 |
'booking': self, |
|
1568 |
} |
|
1569 |
) |
|
1570 |
try: |
|
1571 |
return Template(self.event.agenda.get_booking_user_block_template()).render(template_vars) |
|
1572 |
except (VariableDoesNotExist, TemplateSyntaxError): |
|
1573 |
return |
|
1574 | ||
1551 | 1575 |
@classmethod |
1552 | 1576 |
def anonymize_bookings(cls, bookings_queryset): |
1553 | 1577 |
bookings_queryset.update( |
chrono/manager/templates/chrono/manager_event_check.html | ||
---|---|---|
31 | 31 |
<h3> |
32 | 32 |
{% blocktrans with places=object.waiting_list_places booked_places=waiting|length %}Waiting List ({{ booked_places }}/{{ places }}){% endblocktrans %} |
33 | 33 |
</h3> |
34 |
<div> |
|
35 |
<ul class="objects-list single-links"> |
|
36 |
{% for booking in waiting %} |
|
37 |
<li><a>{{ booking.user_name|default:booking.label|default:_('Unknown') }}</a></li> |
|
38 |
{% endfor %} |
|
39 |
</ul> |
|
40 |
</div> |
|
34 |
<div> |
|
35 |
<table class="main check-bookings"> |
|
36 |
<tbody> |
|
37 |
{% for booking in waiting %} |
|
38 |
<tr><td class="booking-username">{{ booking.get_user_block }}</td></tr> |
|
39 |
{% endfor %} |
|
40 |
</tbody> |
|
41 |
</table> |
|
42 |
</div> |
|
41 | 43 |
</div> |
42 | 44 |
{% endif %} |
43 | 45 |
{% endblock %} |
chrono/manager/templates/chrono/manager_event_check_booking_fragment.html | ||
---|---|---|
1 | 1 |
{% load i18n %} |
2 | 2 | |
3 |
<td class="booking-username">{{ booking.user_name|default:booking.label|default:_('Unknown') }}</td>
|
|
3 |
<td class="booking-username">{{ booking.get_user_block }}</td>
|
|
4 | 4 |
<td class="booking-status"> |
5 | 5 |
{{ booking.user_was_present|yesno:_('Present,Absent,-') }} |
6 | 6 |
{% if booking.user_was_present is False and booking.user_absence_reason %} |
chrono/manager/templates/chrono/manager_events_agenda_settings.html | ||
---|---|---|
50 | 50 |
</div> |
51 | 51 |
{% endif %} |
52 | 52 | |
53 |
<div class="section"> |
|
54 |
<h3>{% trans "Booking user block template" %} |
|
55 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-booking-user-template' pk=object.pk %}">{% trans 'Configure' %}</a> |
|
56 |
</h3> |
|
57 |
<div> |
|
58 |
<pre>{{ agenda.get_booking_user_block_template }}</pre> |
|
59 |
</div> |
|
60 |
</div> |
|
61 | ||
53 | 62 |
<div class="section"> |
54 | 63 |
<h3>{% trans "Notifications" %} |
55 | 64 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-notifications-settings' pk=object.id %}">{% trans 'Configure' %}</a> |
chrono/manager/urls.py | ||
---|---|---|
152 | 152 |
views.agenda_absence_reasons, |
153 | 153 |
name='chrono-manager-agenda-absence-reasons', |
154 | 154 |
), |
155 |
url( |
|
156 |
r'^agendas/(?P<pk>\d+)/booking-user-template$', |
|
157 |
views.agenda_booking_user_template, |
|
158 |
name='chrono-manager-agenda-booking-user-template', |
|
159 |
), |
|
155 | 160 |
url(r'^agendas/(?P<pk>\d+)/delete$', views.agenda_delete, name='chrono-manager-agenda-delete'), |
156 | 161 |
url(r'^agendas/(?P<pk>\d+)/export$', views.agenda_export, name='chrono-manager-agenda-export'), |
157 | 162 |
url(r'^agendas/(?P<pk>\d+)/add-event$', views.agenda_add_event, name='chrono-manager-agenda-add-event'), |
chrono/manager/views.py | ||
---|---|---|
924 | 924 |
agenda_absence_reasons = AgendaAbsenceReasonsView.as_view() |
925 | 925 | |
926 | 926 | |
927 |
class AgendaBookingUserTemplateView(AgendaEditView): |
|
928 |
form_class = None |
|
929 |
fields = ['booking_user_block_template'] |
|
930 |
title = _("Configure booking's user block template") |
|
931 | ||
932 |
def set_agenda(self, **kwargs): |
|
933 |
self.agenda = get_object_or_404(Agenda, pk=kwargs.get('pk'), kind='events') |
|
934 | ||
935 |
def get_initial(self): |
|
936 |
return {'booking_user_block_template': self.agenda.get_booking_user_block_template()} |
|
937 | ||
938 | ||
939 |
agenda_booking_user_template = AgendaBookingUserTemplateView.as_view() |
|
940 | ||
941 | ||
927 | 942 |
class AgendaDeleteView(DeleteView): |
928 | 943 |
template_name = 'chrono/manager_confirm_delete.html' |
929 | 944 |
model = Agenda |
tests/manager/test_all.py | ||
---|---|---|
492 | 492 |
assert agenda.maximal_booking_delay is None |
493 | 493 | |
494 | 494 | |
495 |
def test_options_agenda_booking_user_block_template(app, admin_user): |
|
496 |
agenda = Agenda.objects.create(label='Foo bar', kind='events') |
|
497 |
assert agenda.booking_user_block_template == '' |
|
498 |
assert ( |
|
499 |
agenda.get_booking_user_block_template() |
|
500 |
== '{{ booking.user_name|default:booking.label|default:"Unknown" }}' |
|
501 |
) |
|
502 | ||
503 |
app = login(app) |
|
504 |
url = '/manage/agendas/%s/booking-user-template' % agenda.pk |
|
505 |
resp = app.get(url) |
|
506 |
resp.form['booking_user_block_template'] = '{{ booking.user_name }} Foo Bar' |
|
507 |
resp = resp.form.submit() |
|
508 |
agenda.refresh_from_db() |
|
509 |
assert agenda.booking_user_block_template == '{{ booking.user_name }} Foo Bar' |
|
510 |
assert agenda.get_booking_user_block_template() == '{{ booking.user_name }} Foo Bar' |
|
511 | ||
512 |
resp = app.get(url) |
|
513 |
resp.form['booking_user_block_template'] = '' |
|
514 |
resp = resp.form.submit() |
|
515 |
agenda.refresh_from_db() |
|
516 |
assert agenda.booking_user_block_template == '' |
|
517 |
assert ( |
|
518 |
agenda.get_booking_user_block_template() |
|
519 |
== '{{ booking.user_name|default:booking.label|default:"Unknown" }}' |
|
520 |
) |
|
521 | ||
522 |
# check kind |
|
523 |
agenda.kind = 'meetings' |
|
524 |
agenda.save() |
|
525 |
app.get(url, status=404) |
|
526 |
agenda.kind = 'virtual' |
|
527 |
agenda.save() |
|
528 |
app.get(url, status=404) |
|
529 | ||
530 | ||
495 | 531 |
def test_options_agenda_as_manager(app, manager_user): |
496 | 532 |
agenda = Agenda(label=u'Foo bar') |
497 | 533 |
agenda.view_role = manager_user.groups.all()[0] |
tests/manager/test_event.py | ||
---|---|---|
1102 | 1102 |
) # user ordering is not optimal ... |
1103 | 1103 |
assert 'User Cancelled' not in resp |
1104 | 1104 | |
1105 |
agenda.booking_user_block_template = '{{ booking.user_name }} Foo Bar' |
|
1106 |
agenda.save() |
|
1107 |
resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk)) |
|
1108 |
assert 'User 1 Foo Bar' in resp |
|
1109 |
assert 'User Waiting Foo Bar' in resp |
|
1110 | ||
1105 | 1111 |
# cancelled booking |
1106 | 1112 |
token = resp.context['csrf_token'] |
1107 | 1113 |
app.post( |
1108 |
- |