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
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)
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)