Add option to choose delimiter in CSV import

This commit is contained in:
Jan Tuomi
2017-10-02 20:56:49 +03:00
parent d1343f8b58
commit 5666825738
7 changed files with 47 additions and 12 deletions
+9 -4
View File
@@ -52,16 +52,21 @@ class MemberForm(forms.ModelForm):
return self._clean_boolean_field('AYY')
@staticmethod
def csv_to_models(data, payment_source='AYY'):
def csv_to_models(data, payment_source='AYY', delimiter=','):
clean_data = data.strip().split('\n')
clean_data = [row.rstrip(',') for row in clean_data]
csv_reader = csv.DictReader(clean_data, fieldnames=MemberForm.Meta.fields)
csv_reader = csv.DictReader(clean_data, fieldnames=MemberForm.Meta.fields, delimiter=delimiter, quoting=csv.QUOTE_NONE)
members = []
payments = []
for line in csv_reader:
for key, value in line.items():
line[key] = value.strip()
try:
for key, value in line.items():
line[key] = value.strip()
except AttributeError as ex:
logging.error('Invalid line in CSV: "{}"'.format(line))
logging.error('Delimiter: {}'.format(delimiter))
raise
email = line['email']
member_exists = False
+7
View File
@@ -37,6 +37,13 @@
<option value="cash">{% trans "Cash payment" %}</option>
</select>
</div>
<div class="form-group">
<label>{% trans "CSV delimiter" %}</label>
<input type="text" name="delimiter" class="form-control" value=";" />
<p class="form-text text-muted">
{% blocktrans %}The symbol that is used to separate items in one line. Defaults to ';' (semicolon).{% endblocktrans %}
</p>
</div>
<div>
<button type="submit" class="btn btn-primary">{% trans "Send" %}</button>
</div>
+2 -1
View File
@@ -108,6 +108,7 @@ def import_csv(request, *args, **kwargs):
"""Get csv data imported to page and create members based on that."""
try:
data = request.POST['textfield']
delimiter = request.POST.get('delimiter', ',')
payment_source = request.POST['payment_source']
except:
return render(request,
@@ -115,7 +116,7 @@ def import_csv(request, *args, **kwargs):
{'error': _('Missing "textfield" POST request field')})
try:
result = MemberForm.csv_to_models(data, payment_source=payment_source)
result = MemberForm.csv_to_models(data, payment_source=payment_source, delimiter=delimiter)
except CSVValidationError as ex:
logging.exception('Model validation error')
return error_view(request, ex.form_errors)