0001-family-add-button-to-booking-form-62244.patch
combo/apps/family/forms.py | ||
---|---|---|
30 | 30 |
'start_date_filter', |
31 | 31 |
'end_date_filter', |
32 | 32 |
'user_external_template', |
33 |
'booking_form_url', |
|
33 | 34 |
] |
34 | 35 | |
35 | 36 |
def save(self, *args, **kwargs): |
combo/apps/family/migrations/0012_booking_form_url.py | ||
---|---|---|
1 |
from django.db import migrations, models |
|
2 | ||
3 |
import combo.data.models |
|
4 | ||
5 | ||
6 |
class Migration(migrations.Migration): |
|
7 | ||
8 |
dependencies = [ |
|
9 |
('family', '0011_agenda_subscribed_and_dates'), |
|
10 |
] |
|
11 | ||
12 |
operations = [ |
|
13 |
migrations.AddField( |
|
14 |
model_name='weeklyagendacell', |
|
15 |
name='booking_form_url', |
|
16 |
field=models.CharField( |
|
17 |
blank=True, |
|
18 |
max_length=2000, |
|
19 |
validators=[combo.data.models.django_template_validator], |
|
20 |
verbose_name='URL to the booking Form', |
|
21 |
), |
|
22 |
), |
|
23 |
migrations.AlterField( |
|
24 |
model_name='weeklyagendacell', |
|
25 |
name='agenda_categories', |
|
26 |
field=models.CharField( |
|
27 |
blank=True, |
|
28 |
max_length=2000, |
|
29 |
validators=[combo.data.models.django_template_validator], |
|
30 |
verbose_name='Agenda categories', |
|
31 |
), |
|
32 |
), |
|
33 |
migrations.AlterField( |
|
34 |
model_name='weeklyagendacell', |
|
35 |
name='agenda_references_template', |
|
36 |
field=models.CharField( |
|
37 |
blank=True, |
|
38 |
max_length=2000, |
|
39 |
validators=[combo.data.models.django_template_validator], |
|
40 |
verbose_name='Agenda references template', |
|
41 |
), |
|
42 |
), |
|
43 |
migrations.AlterField( |
|
44 |
model_name='weeklyagendacell', |
|
45 |
name='end_date_filter', |
|
46 |
field=models.CharField( |
|
47 |
blank=True, |
|
48 |
max_length=250, |
|
49 |
validators=[combo.data.models.django_template_validator], |
|
50 |
verbose_name='End date filter template', |
|
51 |
), |
|
52 |
), |
|
53 |
migrations.AlterField( |
|
54 |
model_name='weeklyagendacell', |
|
55 |
name='start_date_filter', |
|
56 |
field=models.CharField( |
|
57 |
blank=True, |
|
58 |
max_length=250, |
|
59 |
validators=[combo.data.models.django_template_validator], |
|
60 |
verbose_name='Start date filter template', |
|
61 |
), |
|
62 |
), |
|
63 |
migrations.AlterField( |
|
64 |
model_name='weeklyagendacell', |
|
65 |
name='user_external_template', |
|
66 |
field=models.CharField( |
|
67 |
blank=True, |
|
68 |
max_length=255, |
|
69 |
validators=[combo.data.models.django_template_validator], |
|
70 |
verbose_name='User external reference template', |
|
71 |
), |
|
72 |
), |
|
73 |
] |
combo/apps/family/models.py | ||
---|---|---|
19 | 19 |
from django.utils.translation import ugettext_lazy as _ |
20 | 20 | |
21 | 21 |
from combo.data.library import register_cell_class |
22 |
from combo.data.models import JsonCellBase |
|
22 |
from combo.data.models import JsonCellBase, django_template_validator |
|
23 |
from combo.utils import get_templated_url |
|
23 | 24 | |
24 | 25 | |
25 | 26 |
@register_cell_class |
... | ... | |
35 | 36 |
], |
36 | 37 |
) |
37 | 38 |
agenda_references_template = models.CharField( |
38 |
_('Agenda references template'), max_length=2000, blank=True |
|
39 |
_('Agenda references template'), max_length=2000, blank=True, validators=[django_template_validator] |
|
40 |
) |
|
41 |
agenda_categories = models.CharField( |
|
42 |
_('Agenda categories'), max_length=2000, blank=True, validators=[django_template_validator] |
|
43 |
) |
|
44 |
start_date_filter = models.CharField( |
|
45 |
_('Start date filter template'), max_length=250, blank=True, validators=[django_template_validator] |
|
46 |
) |
|
47 |
end_date_filter = models.CharField( |
|
48 |
_('End date filter template'), max_length=250, blank=True, validators=[django_template_validator] |
|
39 | 49 |
) |
40 |
agenda_categories = models.CharField(_('Agenda categories'), max_length=2000, blank=True) |
|
41 |
start_date_filter = models.CharField(_('Start date filter template'), max_length=250, blank=True) |
|
42 |
end_date_filter = models.CharField(_('End date filter template'), max_length=250, blank=True) |
|
43 | 50 |
user_external_template = models.CharField( |
44 |
_('User external reference template'), max_length=255, blank=True |
|
51 |
_('User external reference template'), |
|
52 |
max_length=255, |
|
53 |
blank=True, |
|
54 |
validators=[django_template_validator], |
|
55 |
) |
|
56 |
booking_form_url = models.CharField( |
|
57 |
_('URL to the booking Form'), max_length=2000, blank=True, validators=[django_template_validator] |
|
45 | 58 |
) |
46 | 59 | |
47 | 60 |
default_template_name = 'combo/family/weekly_agenda.html' |
... | ... | |
90 | 103 |
def get_cell_extra_context(self, context): |
91 | 104 |
if context.get('placeholder_search_mode'): |
92 | 105 |
return {} |
106 |
if self.booking_form_url: |
|
107 |
context['booking_form_url'] = get_templated_url(self.booking_form_url, context=context) |
|
108 | ||
93 | 109 |
return super().get_cell_extra_context(context) |
94 | 110 | |
95 | 111 |
def get_default_form_class(self): |
combo/apps/family/templates/combo/family/weekly_agenda.html | ||
---|---|---|
37 | 37 |
{% endwith %} |
38 | 38 |
{% if day.weekday == 6 %} |
39 | 39 |
</ul> |
40 |
{% if booking_form_url %}<p class="booking-btn"><a class="pk-button" href="{{ booking_form_url }}{% if '?' in booking_form_url %}&{% else %}?{% endif %}current={{ day|adjust_to_week_monday|date:"Y-m-d" }}">{% trans "Update bookings" %}</a></p>{% endif %} |
|
40 | 41 |
<p class="no-activity">{% trans "No activity this week" %}</p> |
41 | 42 |
</li> |
42 | 43 |
{% endif %} |
tests/test_family.py | ||
---|---|---|
264 | 264 |
'http://chrono.example.org/api/agendas/datetimes/' |
265 | 265 |
'?%s&date_start=&date_end=xyz&user_external_id=&show_past_events=true' % agenda_param |
266 | 266 |
) |
267 | ||
268 | ||
269 |
def test_weeklyagenda_cell_booking_form_url(context): |
|
270 |
page = Page.objects.create(title='Family', slug='index', template_name='standard') |
|
271 |
cell = WeeklyAgendaCell.objects.create(page=page, placeholder='content', order=0) |
|
272 |
data = { |
|
273 |
'data': [ |
|
274 |
{'text': 'Foo', 'date': '2022-02-28'}, |
|
275 |
] |
|
276 |
} |
|
277 | ||
278 |
context['synchronous'] = True # to get fresh content |
|
279 |
context['request'].user = MockUserWithNameId() |
|
280 | ||
281 |
with mock.patch('combo.utils.requests.get') as requests_get: |
|
282 |
requests_get.return_value = MockedRequestResponse(content=json.dumps(data)) |
|
283 |
result = cell.render(context) |
|
284 |
assert 'booking-btn' not in result |
|
285 | ||
286 |
cell.booking_form_url = 'http://example.com/foobar/' |
|
287 |
cell.save() |
|
288 |
with mock.patch('combo.utils.requests.get') as requests_get: |
|
289 |
requests_get.return_value = MockedRequestResponse(content=json.dumps(data)) |
|
290 |
result = cell.render(context) |
|
291 |
assert 'booking-btn' in result |
|
292 |
assert 'http://example.com/foobar/?current=2022-02-28' in result |
|
293 | ||
294 |
cell.booking_form_url = 'http://example.com/foobar/?user={{ user_nameid }}' |
|
295 |
cell.save() |
|
296 |
with mock.patch('combo.utils.requests.get') as requests_get: |
|
297 |
requests_get.return_value = MockedRequestResponse(content=json.dumps(data)) |
|
298 |
result = cell.render(context) |
|
299 |
assert 'booking-btn' in result |
|
300 |
assert 'http://example.com/foobar/?user=xyz¤t=2022-02-28' in result |
|
267 |
- |