agendas: fix custom fields export/import and display in inspect (#89485)
gitea/chrono/pipeline/head This commit looks good
Details
gitea/chrono/pipeline/head This commit looks good
Details
This commit is contained in:
parent
5fa96e62a8
commit
8504dc18dd
|
@ -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):
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue