Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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),
		}))