Projet

Général

Profil

0001-manager-configuer-user-block-on-check-page-53237.patch

Lauréline Guérin, 19 avril 2021 15:49

Télécharger (10,1 ko)

Voir les différences:

Subject: [PATCH] manager: configuer user block on check page (#53237)

 .../0079_booking_user_block_template.py       | 23 ++++++++++++
 chrono/agendas/models.py                      | 24 +++++++++++++
 .../templates/chrono/manager_event_check.html | 16 +++++----
 .../manager_event_check_booking_fragment.html |  2 +-
 .../manager_events_agenda_settings.html       |  9 +++++
 chrono/manager/urls.py                        |  5 +++
 chrono/manager/views.py                       | 15 ++++++++
 tests/manager/test_all.py                     | 36 +++++++++++++++++++
 tests/manager/test_event.py                   |  6 ++++
 9 files changed, 128 insertions(+), 8 deletions(-)
 create mode 100644 chrono/agendas/migrations/0079_booking_user_block_template.py
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
-