agendas: fix custom fields export/import and display in inspect (#89485)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Lauréline Guérin 2024-04-12 12:10:45 +02:00
parent 5fa96e62a8
commit 8504dc18dd
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 68 additions and 7 deletions

View File

@ -601,7 +601,7 @@ class Agenda(WithSnapshotMixin, WithApplicationMixin, WithInspectMixin, models.M
AgendaNotificationsSettings.objects.filter(agenda=agenda).delete()
for event_data in events:
event_data['agenda'] = agenda
Event.import_json(event_data)
Event.import_json(event_data, snapshot=snapshot)
if notifications_settings:
notifications_settings['agenda'] = agenda
AgendaNotificationsSettings.import_json(notifications_settings)
@ -2695,7 +2695,7 @@ class Event(WithInspectMixin, models.Model):
return
@classmethod
def import_json(cls, data):
def import_json(cls, data, snapshot=None):
try:
data['start_datetime'] = make_aware(
datetime.datetime.strptime(data['start_datetime'], '%Y-%m-%d %H:%M:%S')
@ -2721,7 +2721,7 @@ class Event(WithInspectMixin, models.Model):
else:
event = cls(**data)
event.save()
if event.recurrence_days:
if snapshot is None and event.recurrence_days:
event.refresh_from_db()
if event.recurrence_end_date:
event.recurrences.filter(start_datetime__gt=event.recurrence_end_date).delete()
@ -2737,6 +2737,7 @@ class Event(WithInspectMixin, models.Model):
'description',
'pricing',
'url',
'custom_fields',
]
}
event.recurrences.update(**update_fields)
@ -2769,6 +2770,7 @@ class Event(WithInspectMixin, models.Model):
'url': self.url,
'pricing': self.pricing,
'duration': self.duration,
'custom_fields': self.get_custom_fields(),
}
def get_inspect_keys(self):

View File

@ -132,6 +132,19 @@
{{ value }}
</li>
{% endfor %}
{% if object.events_type %}
<li class="parameter-custom-fields">
<span class="parameter">{% trans "Custom fields:" %}</span>
<ul>
{% for value in object.events_type.get_custom_fields %}
<li class="parameter-custom-field-{{ value.varname }}">
<span class="parameter">{% blocktrans with label=value.label %}{{ label }}:{% endblocktrans %}</span>
{{ event.get_custom_fields|get:value.varname|default:"" }}
</li>
{% endfor %}
</ul>
</li>
{% endif %}
</ul>
{% endfor %}
</div>

View File

@ -57,7 +57,7 @@ def test_agenda_history(settings, app, admin_user):
assert resp.text.count('<del>') == 0
else:
assert resp.text.count('diff_sub') == 1
assert resp.text.count('diff_add') == 17
assert resp.text.count('diff_add') == 18
assert resp.text.count('diff_chg') == 0
resp = app.get(
'/manage/agendas/%s/history/compare/?version1=%s&version2=%s'
@ -66,7 +66,7 @@ def test_agenda_history(settings, app, admin_user):
assert 'Snapshot (%s)' % (snapshot1.pk) in resp
assert 'Snapshot (%s) - (Version 42.0)' % (snapshot2.pk) in resp
assert resp.text.count('diff_sub') == 1
assert resp.text.count('diff_add') == 17
assert resp.text.count('diff_add') == 18
assert resp.text.count('diff_chg') == 0
# check compare on application version number

View File

@ -264,7 +264,15 @@ def test_import_export_events_agenda_options(app):
def test_import_export_event_details(app):
agenda = Agenda.objects.create(label='Foo Bar', kind='events')
events_type = EventsType.objects.create(
label='Foo',
custom_fields=[
{'varname': 'text', 'label': 'Text', 'field_type': 'text'},
{'varname': 'textarea', 'label': 'TextArea', 'field_type': 'textarea'},
{'varname': 'bool', 'label': 'Bool', 'field_type': 'bool'},
],
)
agenda = Agenda.objects.create(label='Foo Bar', kind='events', events_type=events_type)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
Event.objects.create(
slug='event',
@ -277,6 +285,11 @@ def test_import_export_event_details(app):
start_datetime=now(),
end_time=datetime.time(20, 00),
duration=30,
custom_fields={
'text': 'foo',
'textarea': 'foo bar',
'bool': True,
},
)
# check event (agenda, slug) unicity
agenda2 = Agenda.objects.create(label='Foo Bar 2', kind='events')
@ -308,12 +321,25 @@ def test_import_export_event_details(app):
assert str(first_imported_event.publication_datetime.tzinfo) == 'UTC'
assert first_imported_event.duration == 30
assert first_imported_event.end_time == datetime.time(20, 00)
assert first_imported_event.custom_fields == {
'text': 'foo',
'textarea': 'foo bar',
'bool': True,
}
assert Agenda.objects.get(label='Foo Bar 2').event_set.first().slug == 'event'
def test_import_export_recurring_event(app, freezer):
freezer.move_to('2021-01-12 12:10')
agenda = Agenda.objects.create(label='Foo Bar', kind='events')
events_type = EventsType.objects.create(
label='Foo',
custom_fields=[
{'varname': 'text', 'label': 'Text', 'field_type': 'text'},
{'varname': 'textarea', 'label': 'TextArea', 'field_type': 'textarea'},
{'varname': 'bool', 'label': 'Bool', 'field_type': 'bool'},
],
)
agenda = Agenda.objects.create(label='Foo Bar', kind='events', events_type=events_type)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
agenda=agenda,
@ -323,6 +349,11 @@ def test_import_export_recurring_event(app, freezer):
recurrence_week_interval=2,
places=10,
slug='test',
custom_fields={
'text': 'foo',
'textarea': 'foo bar',
'bool': True,
},
)
assert Event.objects.count() == 1
@ -355,6 +386,14 @@ def test_import_export_recurring_event(app, freezer):
event = Event.objects.get(slug='test')
assert Event.objects.filter(primary_event=event).count() == 1
first_event = event.recurrences.first()
assert first_event.custom_fields == {
'text': 'foo',
'textarea': 'foo bar',
'bool': True,
}
first_event.custom_fields = {}
first_event.save()
# import again
with tempfile.NamedTemporaryFile() as f:
@ -364,6 +403,13 @@ def test_import_export_recurring_event(app, freezer):
event = Event.objects.get(slug='test')
assert Event.objects.filter(primary_event=event).count() == 1
first_event2 = event.recurrences.first()
assert first_event.pk == first_event2.pk
assert first_event2.custom_fields == {
'text': 'foo',
'textarea': 'foo bar',
'bool': True,
}
# import again but change places
payload = json.loads(output)