def csv_import(request): from forms import CSVImportForm def generic_getter(field): return field def uppercase_getter(field): return field.upper() def allocation_getter(field): try: return models.Allocation.objects.get(name=field) except models.Allocation.DoesNotExist: return None def system_status_getter(field): try: return models.SystemStatus.objects.get(status=field) except models.SystemStatus.DoesNotExist: return def server_model_getter(field): try: return models.ServerModel.objects.get(id=field) except models.ServerModel.DoesNotExist: return def rack_getter(field): try: return models.SystemRack.objects.get(name=field) except models.SystemRack.DoesNotExist: return None ALLOWED_COLUMNS = { 'hostname': generic_getter, 'asset_tag': generic_getter, 'serial': uppercase_getter, 'notes': generic_getter, 'oob_ip': generic_getter, 'system_status': system_status_getter, 'allocation': allocation_getter, 'system_rack': rack_getter, 'rack_order': generic_getter, 'server_model': server_model_getter, 'purchase_price': generic_getter, } new_systems = 0 if request.method == 'POST': form = CSVImportForm(request.POST, request.FILES) if form.is_valid(): csv_reader = csv.reader(form.cleaned_data['csv']) headers = csv_reader.next() for line in csv_reader: cur_data = dict(zip(headers, line)) system_data = dict( (a, getter(cur_data.get(a, None))) for a, getter in ALLOWED_COLUMNS.iteritems()) s = models.System(**system_data) try: s.full_clean() except ValidationError, e: print e else: s.save() new_systems += 1 form = None
if request.method == 'POST': form = CSVImportForm(request.POST, request.FILES) if form.is_valid(): csv_reader = csv.reader(form.cleaned_data['csv']) headers = csv_reader.next() for line in csv_reader: cur_data = dict(zip(headers, line)) system_data = dict( (a, getter(cur_data.get(a, None))) for a, getter in ALLOWED_COLUMNS.iteritems()) s = models.System(**system_data) try: s.full_clean() except ValidationError, e: print e else: s.save() new_systems += 1 form = None else: form = CSVImportForm() return render_to_response( 'systems/csv_import.html', { 'form': form, 'allowed_columns': ALLOWED_COLUMNS, 'new_systems': new_systems, }, RequestContext(request))