0001-manager-fix-handling-duplicated-slug-in-event-import.patch
chrono/manager/forms.py | ||
---|---|---|
295 | 295 |
dialect = None |
296 | 296 | |
297 | 297 |
events = [] |
298 |
slugs = set() |
|
298 | 299 |
for i, csvline in enumerate(csv.reader(content.splitlines(), dialect=dialect)): |
299 | 300 |
if not csvline: |
300 | 301 |
continue |
... | ... | |
335 | 336 |
exclude = ['desk', 'meeting_type'] |
336 | 337 |
if len(csvline) >= 6: |
337 | 338 |
event.slug = force_text(csvline[5]) if csvline[5] else None |
339 |
if event.slug and event.slug in slugs: |
|
340 |
raise ValidationError( |
|
341 |
_('File contains duplicated event identifiers: %s') % event.slug |
|
342 |
) |
|
343 |
else: |
|
344 |
slugs.add(event.slug) |
|
338 | 345 |
else: |
339 | 346 |
exclude += ['slug'] |
340 | 347 |
column_index = 7 |
chrono/manager/views.py | ||
---|---|---|
1120 | 1120 |
if form.events: |
1121 | 1121 |
for event in form.events: |
1122 | 1122 |
event.agenda_id = self.kwargs['pk'] |
1123 |
if event.slug and Event.objects.filter(agenda_id=event.agenda_id, slug=event.slug).exists(): |
|
1124 |
raise ValidationError(_('Duplicated event identifier')) |
|
1125 | 1123 |
event.save() |
1126 | 1124 |
messages.info(self.request, _('%d events have been imported.') % len(form.events)) |
1127 | 1125 |
return super(AgendaImportEventsView, self).form_valid(form) |
tests/test_manager.py | ||
---|---|---|
1137 | 1137 |
assert 'value cannot be a number' in resp.text |
1138 | 1138 |
assert 'Identifier:' in resp.text # verbose_name is shown, not field name ('slug:') |
1139 | 1139 | |
1140 |
# handle duplicated slug |
|
1141 |
Event.objects.all().delete() |
|
1142 |
resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200) |
|
1143 |
resp.form['events_csv_file'] = Upload( |
|
1144 |
't.csv', |
|
1145 |
b'2016-09-16,18:00,10,5,label,slug\n' |
|
1146 |
b'2016-09-16,18:00,10,5,label,slug\n', |
|
1147 |
'text/csv', |
|
1148 |
) |
|
1149 |
resp = resp.form.submit(status=200) |
|
1150 |
assert 'duplicated event identifiers' in resp.text |
|
1151 | ||
1140 | 1152 | |
1141 | 1153 |
def test_add_meetings_agenda(app, admin_user): |
1142 | 1154 |
app = login(app) |
1143 |
- |