def accounting_import_step2(request, key): from accounting_main.models import AccountingLine, AccountingLineLogging from accounting_core.models import AccountingYear, CostCenter, Account (session_key, session_data) = _get_import_session_data(request, key) if not session_key: return session_data # Not very clean ^^' if not session_data['has_data']: return redirect('accounting_main-views-accounting_import_step1', key) year = get_object_or_404(AccountingYear, pk=session_data['year']) # Map line id to have lines (efficiently) line_cache = {} for line in AccountingLine.objects.filter(accounting_year=year, deleted=False): line_cache[line.pk] = line diff = session_data['data'] diff['nop'] = [line_cache[line_pk] for line_pk in diff['nop']] diff['to_delete'] = [line_cache[line_pk] for line_pk in diff['to_delete']] diff['to_update'] = [(line_cache[line_pk], arg1, arg2) for line_pk, arg1, arg2 in diff['to_update']] if request.method == 'POST': for wanted_line in diff['to_add']: # NB: Si quelqu'un modifie les trucs pendant l'import, ça pétera. # C'est ultra peu probable, donc ignoré costcenter = CostCenter.objects.get(accounting_year=year, account_number=wanted_line['costcenter']) account = Account.objects.get(accounting_year=year, account_number=wanted_line['account']) line = AccountingLine(account=account, costcenter=costcenter, date=wanted_line['date'], tva=wanted_line['tva'], text=wanted_line['text'], output=wanted_line['output'], input=wanted_line['input'], document_id=wanted_line['document_id'], deleted=False, accounting_year=year, current_sum=wanted_line['current_sum'], order=wanted_line['order']) line.save() AccountingLineLogging(object=line, who=request.user, what='created').save() for line, wanted_line, diffs in diff['to_update']: for field, (old, new) in diffs.items(): setattr(line, field, new) line.save() AccountingLineLogging(object=line, who=request.user, what='edited', extra_data=json.dumps({'added': None, 'edited': diffs, 'deleted': None})).save() for line in diff['to_delete']: for error in line.accountingerror_set.all(): error.linked_line = None error.save() line.delete() # harddelete. year.last_accounting_import = now() year.save() request.session[session_key] = {} messages.success(request, _(u"Compta importée ! Si tout est ok, n'oublie pas de notifier les gens.")) return redirect('accounting_main-views-accounting_import_step0') return render(request, "accounting_main/import/step2.html", {'key': key, 'diff': diff})
def accounting_import_step2(request, key): from accounting_main.models import AccountingLine, AccountingLineLogging from accounting_core.models import AccountingYear, CostCenter, Account (session_key, session_data) = _get_import_session_data(request, key) if not session_key: return session_data # Not very clean ^^' if not session_data['has_data']: return redirect('accounting_main.views.accounting_import_step1', key) year = get_object_or_404(AccountingYear, pk=session_data['year']) # Map line id to have lines (efficiently) line_cache = {} for line in AccountingLine.objects.filter(accounting_year=year, deleted=False): line_cache[line.pk] = line diff = session_data['data'] diff['nop'] = map(lambda line_pk: line_cache[line_pk], diff['nop']) diff['to_delete'] = map(lambda line_pk: line_cache[line_pk], diff['to_delete']) diff['to_update'] = map(lambda (line_pk, __, ___): (line_cache[line_pk], __, ___), diff['to_update']) if request.method == 'POST': for wanted_line in diff['to_add']: # NB: Si quelqu'un modifie les trucs pendant l'import, ça pétera. # C'est ultra peu probable, donc ignoré costcenter = CostCenter.objects.get(accounting_year=year, account_number=wanted_line['costcenter']) account = Account.objects.get(accounting_year=year, account_number=wanted_line['account']) line = AccountingLine(account=account, costcenter=costcenter, date=wanted_line['date'], tva=wanted_line['tva'], text=wanted_line['text'], output=wanted_line['output'], input=wanted_line['input'], document_id=wanted_line['document_id'], deleted=False, accounting_year=year, current_sum=wanted_line['current_sum'], order=wanted_line['order']) line.save() AccountingLineLogging(object=line, who=request.user, what='created').save() for line, wanted_line, diffs in diff['to_update']: for field, (old, new) in diffs.iteritems(): setattr(line, field, new) line.save() AccountingLineLogging(object=line, who=request.user, what='edited', extra_data=json.dumps({'added': None, 'edited': diffs, 'deleted': None})).save() for line in diff['to_delete']: for error in line.accountingerror_set.all(): error.linked_line = None error.save() line.delete() # harddelete. year.last_accounting_import = now() year.save() request.session[session_key] = {} messages.success(request, _(u"Compta importée ! Si tout est ok, n'oublie pas de notifier les gens.")) return redirect('accounting_main.views.accounting_import_step0') return render(request, "accounting_main/import/step2.html", {'key': key, 'diff': diff})