def __doc_rvp(request, id, mode): ''' Read/View/Print :param mode:enum - mode (0: read, 1: html, 2: pdf) ''' __log_request(request) #print "__doc_rvp" item = models.Doc.objects.get(pk=id) uuid = item.type if (uuid not in moduledict): return 'Template not found' # else: tpl = moduledict[uuid] self_func = [K_T_F_READ, K_T_F_VIEW, K_T_F_PRINT][mode] if (self_func in tpl[K_V_MODULE].__dict__): return tpl[K_V_MODULE].__dict__[self_func](request, id) # ??? # else: data = json.loads(item.data) # auto date conversion if (K_V_DATES in tpl): for k in tpl[K_V_DATES]: utils.str2date(data, k) __try_to_call(tpl, K_T_F_POST_LOAD, data) # split 1: create data dict template_key = [K_T_T_READ, K_T_T_VIEW, K_T_T_PRINT][mode] if ((K_T_T in tpl[K_V_MODULE].DATA) and (template_key in tpl[K_V_MODULE].DATA[K_T_T])): template = tpl[K_V_MODULE].DATA[K_T_T][template_key] context_dict = { 'data': data } else: # auto_* #print "auto" template = ['auto_read.html', 'auto_view.html', 'auto_print.html'][mode] # transform data: # 1. single values: { key: value, } => [{ k: key, v: value, l: label, h: help }, ] datalist = list() for k, v in tpl[K_V_MODULE].DATA[K_T_FIELD].iteritems(): datalist.append({ 'k': k, 'v': data[k], 'l': v[K_T_FIELD_A]['label'], 'h': v[K_T_FIELD_A].get('help_text', None), }) # 2. multivalues: { key: [{k: value,},],} => [{l: label, h: help, t: header, v: [[{value,],],] datasets = list() if (K_T_S in tpl[K_V_MODULE].DATA): for k, v in tpl[K_V_MODULE].DATA[K_T_S].iteritems(): header = list() for i, j in v[K_T_FIELD_T].iteritems(): header.append(j[K_T_FIELD_A]['label']) dataset = list() # all lines if k in data: # skip empty multivalues for rec in data[k]: # one line in data - dict dataset.append(rec.values()) datasets.append({ 't': header, 'v': dataset, 'l': v[K_T_FIELD_A]['label'], 'h': v[K_T_FIELD_A].get('help_text', None), }) context_dict = { 'pk': item.pk, 'name': item.name, 'type': tpl, 'datalist': datalist, 'datasets': datasets, } # split 2: call render if (mode < 2): # READ, VIEW __try_to_call(tpl, (K_T_F_PRE_READ, K_T_F_PRE_VIEW)[mode], data) #return render_to_response(template, context_instance=RequestContext(request, context_dict)) return converter.html2html(request, context_dict, template) else: # PRINT __try_to_call(tpl, K_T_F_PRE_PRINT, data) return __doc_print(request, context_dict, template)
def __doc_acu(request, id, mode): ''' Anon/Create/Update :param id:int - uuid (anon/create) or doc id (update) :param mode:int (0: anon (print), 1: create, 2: update) ''' __log_request(request) if (mode == 2): item = models.Doc.objects.get(pk=id) # Update only uuid = item.type if (uuid not in moduledict): return 'Template not found' else: uuid = id if (request.method == 'POST') and (mode > 0) and (request.POST.get('_action', None) in set(('print', 'view'))): mode = 0 tpl = moduledict[uuid] # 1. check <pkg>.ANON/CREATE/UPDATE self_func = [K_T_F_ANON, K_T_F_ADD, K_T_F_EDIT][mode] if (self_func in tpl[K_V_MODULE].__dict__): return tpl[K_V_MODULE].__dict__[self_func](request, id) # else: # 2. get FORM and FORMSETS formclass = tpl[K_T_FORM] formsetsclass = tpl[K_T_FORMSETS] # SortedDict of dicts if request.method == 'POST': #pprint.pprint(request.POST['_action']) form = formclass(request.POST) if (mode == 0): # ANON, Create/Update -> view/print del form.fields[K_T_F_NAME] formlist = SortedDict() isvalid = form.is_valid() for k, formset in formsetsclass.iteritems(): formlist[k] = formset(request.POST, prefix=k) isvalid = isvalid and formlist[k].is_valid() if isvalid: data = form.cleaned_data # inject formsets into data for k, v in formlist.iteritems(): dataset = list() for i in v.cleaned_data: # list of dicts if i: # reject empty dicts dataset.append(i) if dataset: # reject empty lists data[k] = dataset # inject datasets into data __try_to_call(tpl, K_T_F_POST_FORM, data) # split if (mode == 0): # ANON > PRINT, C/U -> V/P if ((K_T_T in tpl[K_V_MODULE].DATA) and (K_T_T_PRINT in tpl[K_V_MODULE].DATA[K_T_T])): context_dict = {'data': data} template = tpl[K_V_MODULE].DATA[K_T_T][K_T_T_PRINT] if (request.POST.get('_action', None) == u'view'): __try_to_call(tpl, K_T_F_PRE_VIEW, data) # Create/Update -> View return converter.html2html(request, context_dict, template) else: # Anon/Create/Update -> PRINT __try_to_call(tpl, K_T_F_PRE_PRINT, data) return __doc_print(request, context_dict, template) else: # tmp dummy return redirect('dox.views.index') else: # CREATE/UPDATE -> SAVE if (mode == 1): # CREATE name = data[K_T_F_NAME] else: item.name = data[K_T_F_NAME] del data[K_T_F_NAME] # convert dates if (K_V_DATES in tpl): for k in tpl[K_V_DATES]: utils.date2str(data, k) __try_to_call(tpl, K_T_F_PRE_SAVE, data) if (mode == 1): # CREATE # user, type, name, data item = models.Doc(user=request.user, type=uuid, name=name, data=json.dumps(data, indent=1, ensure_ascii=False)) else: item.data = json.dumps(data, indent=1, ensure_ascii=False) item.save() return redirect(doc_r, id=item.pk) else: # GET if (mode < 2): # ANON, CREATE form = formclass() if (mode == 0): # ANON del form.fields[K_T_F_NAME] formlist = SortedDict() for k, formset in formsetsclass.iteritems(): formlist[k] = formset(prefix=k) else: # UPDATE data = json.loads(item.data) data[K_T_F_NAME] = item.name # inject name # restore dates after loading if (K_V_DATES in tpl): for k in tpl[K_V_DATES]: utils.str2date(data, k) #pprint.pprint(data) __try_to_call(tpl, K_T_F_POST_LOAD, data) #pprint.pprint(data) __try_to_call(tpl, K_T_F_PRE_FORM, data) # split form and formsets # 1. eject formsets formlist = SortedDict([]) for pfx, formset in formsetsclass.iteritems(): # formsetsclass == SortedDict {name: FormSetClass} formset_data = dict() for i, l in enumerate(data.get(pfx, list())): # l:str - formset name; l: for k, v in l.iteritems(): formset_data[pfx+'-'+str(i)+'-'+k] = v formset_data.update({ pfx+'-TOTAL_FORMS': len(data[pfx]) if pfx in data else 1, pfx+'-INITIAL_FORMS': u'0', pfx+'-MAX_NUM_FORMS': u'', }) formlist[pfx] = formset(formset_data, prefix=pfx) if (pfx in data): del data[pfx] # 2. else form = formclass(data) return render_to_response( tpl[K_V_MODULE].DATA[K_T_T][K_T_T_FORM] if ((K_T_T in tpl[K_V_MODULE].DATA) and (K_T_T_FORM in tpl[K_V_MODULE].DATA[K_T_T])) else 'auto_form.html', context_instance=RequestContext(request, { 'name': tpl[K_V_MODULE].DATA[K_T_NAME], 'comments': tpl[K_V_MODULE].DATA[K_T_COMMENTS], 'legend': tpl[K_V_MODULE].DATA.get(K_T_LEGEND, ''), 'uuid': tpl[K_V_MODULE].DATA[K_T_UUID], 'form': form, 'formlist': formlist, 'example': tpl[K_V_MODULE].DATA.get('example', None), }))