Add option to choose delimiter in CSV import
This commit is contained in:
+9
-4
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user