cards: csv import & user support (#48776)

This commit is contained in:
Lauréline Guérin 2020-12-04 15:29:43 +01:00
parent d42ef313f3
commit c5c52e4ab8
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 93 additions and 1 deletions

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import datetime
import os
import uuid
import pytest
from webtest import Upload
@ -377,6 +378,68 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
assert card2.data['5'].tm_mday == 3
def test_backoffice_cards_import_data_csv_user_support(pub, studio):
user = create_user(pub)
user.name_identifiers = [str(uuid.uuid4())]
user.store()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'test'
carddef.fields = [
fields.ItemField(id='1', label='List',
items=['item1', 'item2']),
]
carddef.user_support = 'optional'
carddef.workflow_roles = {'_editor': user.roles[0]}
carddef.backoffice_submission_roles = user.roles
carddef.store()
carddef.data_class().wipe()
app = login(get_app(pub))
sample_resp = app.get('/backoffice/data/test/data-sample-csv')
assert sample_resp.text == 'User (email or UUID),List\r\nvalue,value\r\n'
data = [
b'User,List',
b'%s,item1' % user.email.encode('utf-8'),
b'%s,item2' % user.nameid.encode('utf-8'),
b',item1',
b'foobar,item2',
b'foobar@mail.com,item2',
]
resp = app.get('/backoffice/data/test/import-csv')
resp.forms[0]['file'] = Upload('test.csv', b'\n'.join(data),
'text/csv')
resp = resp.forms[0].submit().follow()
assert carddef.data_class().count() == 5
cards = carddef.data_class().select(order_by='id')
#assert cards[0].user_id == user.id
#assert cards[1].user_id == user.id
#assert cards[2].user_id is None
#assert cards[3].user_id is None
#assert cards[4].user_id is None
# if no user support, user columns is ignored in import
carddef.user_support = None
carddef.store()
carddef.data_class().wipe()
data = [
b'User',
user.email.encode('utf-8'),
user.nameid.encode('utf-8'),
b'foobar',
b'foobar@mail.com',
]
resp = app.get('/backoffice/data/test/import-csv')
resp.forms[0]['file'] = Upload('test.csv', b'\n'.join(data),
'text/csv')
resp = resp.forms[0].submit().follow()
assert carddef.data_class().count() == 4
cards = carddef.data_class().select(order_by='id')
assert [c.user_id for c in cards] == [None, None, None, None]
def test_backoffice_cards_import_data_csv_invalid_columns(pub):
user = create_user(pub)

View File

@ -140,8 +140,21 @@ class CardPage(FormPage):
return r
def get_import_csv_fields(self):
class UserField:
key = 'user'
id = '_user'
label = _('User (email or UUID)')
store_display_value = None
store_structured_value = None
def convert_value_from_str(self, x):
return x
# skip non-data fields
return [x for x in self.formdef.get_all_fields() if isinstance(x, fields.WidgetField)]
csv_fields = [x for x in self.formdef.get_all_fields() if isinstance(x, fields.WidgetField)]
if self.formdef.user_support == 'optional':
return [UserField()] + csv_fields
return csv_fields
def data_sample_csv(self):
carddef_fields = self.get_import_csv_fields()
@ -277,6 +290,20 @@ class CardPage(FormPage):
error_message += ' ' + _('(line numbers %s and more)') % ', '.join(incomplete_lines[:5])
raise ValueError(error_message)
def user_lookup(user_value):
if self.formdef.user_support != 'optional':
return
if not user_value:
return
users = []
if '@' in user_value:
users = get_publisher().user_class.get_users_with_email(user_value)
else:
users = get_publisher().user_class.get_users_with_name_identifier(user_value)
if not users:
return
return users[0]
class ImportAction:
def __init__(self, data_class, lines):
self.data_class = data_class
@ -285,6 +312,8 @@ class CardPage(FormPage):
def execute(self, job=None):
for item in self.lines:
data_instance = self.data_class()
user_value = item.pop('_user', None)
data_instance.user = user_lookup(user_value)
data_instance.data = item
data_instance.just_created()
data_instance.store()