Example #1
0
def _extract_query_result(starter_table, query_result, result_columns):
	result = list()
	
	for datum in query_result:
		result_row = list()
		
		for result_column in result_columns:
			if result_column['column_hierarchy']:
				hierarchy_list = result_column['column_hierarchy'].split(".")
				
				if type(datum).__name__ != 'dict':
					try:
						attr = datum
						for hierarchy in hierarchy_list: attr = getattr(attr, hierarchy)
						result_row.append(getattr(attr, result_column['physical_name']))
					except:
						result_row.append("")
					
				else: # query_result returns as a list of dict (cause by using group by)
					
					growing_hierarchy = ""
					hierarchy_user_table = starter_table
					hierarchy_data = None
					
					for index, hierarchy in enumerate(hierarchy_list):
						
						try:
							value = hierarchy_data.id
						except:
							value = datum[hierarchy]
						
						table_column = utilities.list_find(lambda table_column: table_column.physical_column_name==hierarchy, UserTableColumn.objects.filter(table=hierarchy_user_table))
						related_table = table_column.related_table
						
						hierarchy_user_table = UserTable.objects.get(pk=related_table)
						hierarchy_model_object = opengis.create_model(hierarchy_user_table)
						
						hierarchy_data = hierarchy_model_object.objects.get(pk=value)

					result_row.append(getattr(hierarchy_data, result_column['physical_name']))
					
			else:
				try:
					result_row.append(getattr(datum, result_column['physical_name']))
				except:
					try:
						result_row.append(datum[result_column['physical_name']])
					except:
						result_row.append("")
		
		if result_row: result.append(result_row)

	return result
Example #2
0
def api_table_save_row(request):
	# TODO: Check permissions.
	if request.method == 'POST':
		account = Account.objects.get(user=request.user)

		table_id = int(request.POST.get('table_id'))
		row = request.POST.getlist('row[]')
		row_id = int(request.POST.get('row_id', 0))
		op = request.POST.get('op')
		
		if not table_id: return api.APIResponse(api.API_RESPONSE_ERROR, response_meta={'error':'required_table_id'})
		
		user_table = UserTable.objects.filter(account=account, pk=table_id);
		if not user_table.count():
			return api.APIResponse(api.API_RESPONSE_ERROR, response_meta={'error':'missing_table_id'})
		
		user_table = user_table[0]
		table_columns = UserTableColumn.objects.filter(table=user_table)
		target_model = opengis.create_model(user_table)
		
		if row_id:
			model_obj = target_model.objects.get(pk=row_id)
		else:
			model_obj = target_model()
		
		print model_obj.id
		if op == 'delete': 
			model_obj.delete()
			return api.APIResponse(api.API_RESPONSE_SUCCESS)
		
		error = []
		for index, column in enumerate(row):
			column_name, column_data = column.split('=')
			table_column = utilities.list_find(lambda table_column: table_column.column_name == column_name, table_columns)
			physical_column_name = table_column.physical_column_name
			print column_data
			
			column_data = utilities.convert_string_to_data_with_format(column_data, table_column)
			if not column_data['error']:
				setattr(model_obj, physical_column_name, column_data['value'])
			else:
				error += [str(index + 1) + '. ' + column_data['error']]
				
		if not len(error):
			model_obj.save()
			return api.APIResponse(api.API_RESPONSE_SUCCESS, result=model_obj.id)
		else:
			return api.APIResponse(api.API_RESPONSE_ERROR, result='\n'.join(error))
	else:
		return api.APIResponse(api.API_RESPONSE_POSTONLY)
Example #3
0
def import_table(user_table, account, request):
	temp_csv_file = settings.TEMP_CSV_PATH + '/temp_' + str(account.user.id) + "_" + str(long(round(time.time()))) + '.csv'
	
	destination = open(temp_csv_file, 'wb')
	for chunk in request.FILES['file'].chunks(): destination.write(chunk)
	destination.close()
	
	destination = open(temp_csv_file, 'rb')
	csv_reader = csv.reader(destination)
	
	table_columns = UserTableColumn.objects.filter(table=user_table)
	
	target_model = opengis.create_model(user_table)
	target_model.objects.all().delete()
	
	column_mapping = list()
	
	for row in csv_reader:
		if not column_mapping: # csv.reader object is unsubscriptable
			
			# Map logical column name used in CSV to physical database column name
			for index, column_name in enumerate(row):
				(parent_column, separator, child_column) = column_name.partition("---")
				column_info = dict()
				
				table_column = utilities.list_find(lambda table_column: table_column.column_name == parent_column, table_columns)
				
				if child_column:
					column_info['physical_column_name'] = table_column.physical_column_name
					column_info['related_table'] = table_column.related_table
					
					related_user_table = UserTable.objects.get(pk=table_column.related_table)
					related_table_columns = UserTableColumn.objects.filter(table=related_user_table)
					
					related_column = utilities.list_find(lambda related_column: related_column.column_name == child_column, related_table_columns)
					column_info['related_column'] = related_column.physical_column_name
					
				else:
					column_info['physical_column_name'] = table_column.physical_column_name
				
				column_mapping.append(column_info)
				
		else:
			model_obj = target_model()
			
			for index, column_data in enumerate(row):
				column_info = column_mapping[index]
				
				if column_info.get('related_table'):
					related_user_table = UserTable.objects.get(pk=column_info['related_table'])
					related_model = opengis.create_model(related_user_table)
					
					related_model_object = related_model.objects.get(**{str(column_info['related_column']):column_data})
					setattr(model_obj, column_info['physical_column_name'], related_model_object)
					
				else:
					setattr(model_obj, column_info['physical_column_name'], column_data)
			
			model_obj.save()
	
	destination.close()
	
	import os
	os.remove(temp_csv_file)