def sub_tables(request): tbl_name = request.GET.get('tbl_name', None) ucan_id = request.GET.get('ucan_id', None) network_station_ids_list = request.GET.getlist('network_station_id', []) network_station_ids_list = [str(n_id) for n_id in network_station_ids_list] context = { 'title': 'Table ADD Tool', 'tbl_name': tbl_name, 'network_station_ids_list':network_station_ids_list, 'ucan_id': ucan_id } obj = secondary_tables[tbl_name] table_dicts = {} max_instances = 0 for idx, network_station_id in enumerate(network_station_ids_list): table_dicts[network_station_id] = [] instances = obj.objects.filter(network_station_id=network_station_id) if len(instances) > max_instances:max_instances = len(instances) for inst_idx, inst in enumerate(instances): inst_list = convert_query_set(inst,'python_list') table_dicts[network_station_id].append(inst_list) #Format for html loop station = convert_query_set(models.Station.objects.filter(ucan_station_id=ucan_id), 'python_dict') init = { 'ucan_station_id':ucan_id, 'begin_date':WRCCUtils.convert_db_dates(station['begin_date']), 'end_date':WRCCUtils.convert_db_dates(station['end_date']), } form_class = getattr(mforms, tbl_name) form = form_class() if max_instances == 0: results = [[[] for idx in range(len(network_station_ids_list)+1)] for inst in range(1)] for idx, network_station_id in enumerate(network_station_ids_list): init['network_station_id'] = network_station_id for key, val in form.__dict__.iteritems(): if key[0]!= '_': if key in init.keys(): results[0][idx].append([key, init[key]]) else: results[0][idx].append([key, val]) #results[0][-1] = results[0][-2] for idx in range(len(results[0]) - 1): results[0][idx] = [] else: results = [[[] for idx in range(len(network_station_ids_list)+1)] for inst in range(max_instances)] for inst in range(max_instances): for idx, network_station_id in enumerate(network_station_ids_list): if len(table_dicts[network_station_id]) > inst: results[inst][idx]=table_dicts[network_station_id][inst] else: continue #add forms at end of each row for idx, network_station_id in enumerate(network_station_ids_list): if not table_dicts[network_station_id]: init['network_station_id'] = network_station_id for key, val in form.__dict__.iteritems(): if key[0]!= '_': if key in init.keys(): results[idx][-1].append([key, init[key]]) else: results[idx][-1].append([key, val]) else: results[idx][-1]=results[idx][idx] #Write to metadata load file if 'form_add' in request.POST or 'form_edit' in request.POST: form_idx = int(request.POST['form_id']) - 1 for key in request.POST: for idx,key_val in enumerate(results[form_idx][-1]): if str(key) == key_val[0]: results[form_idx][-1][idx][1] = str(request.POST[key]) meta_str = '' with open(load_tables_dir + load_tables[tbl_name],'a+') as f: for idx,key in enumerate(key_list[tbl_name]): if idx != len(key_list[tbl_name]) - 1: end_char = '|' else: end_char = '\n' try: meta_str+=str(request.POST[key]) + end_char except: #WTF?? Some db Variable tables have 'network' key but some have 'network_id' key #instead if key == 'network': meta_str+=str(request.POST['network_id']) + end_char if 'form_edit' in request.POST: pass else: f.write(meta_str) #Double check #os.chmod(load_tables_dir + load_tables[tbl_name], 0777) with open(load_tables_dir + load_tables[tbl_name], 'r') as f: if f.readlines()[-1] == meta_str: context['merge_successful'] = True context['form_id'] = int(request.POST['form_id']) context['results'] = results return render_to_response('wrcc_meta/sub_tables.html', context, context_instance=RequestContext(request))
def station_tables_merge(request): tbl_name = request.GET.get('tbl_name', None) ucan_id_list = request.GET.getlist('ucan_id', []) ucan_id_list = [str(uid) for uid in ucan_id_list] tbl_done_list = request.GET.getlist('tbl_done', []) context = { 'title': tbl_name + ' Table Merge Tool', 'tbl_done_list':tbl_done_list } tbl_done = False if tbl_name in tbl_done_list:tbl_done=True;context['tbl_done']=True if not tbl_name or not ucan_id_list: return render_to_response('wrcc_meta/station_tables_merge.html', context, context_instance=RequestContext(request)) context['ucan_id_list'] = ucan_id_list context['tbl_name'] = tbl_name table_dicts = {} #Find table instances for each ucan id ucan_station_id_acis = None ucan_station_id_form = None wrcc_id = None network_station_ids_dict = {} for idx, ucan_id in enumerate(ucan_id_list): if int(ucan_id) < 1000000: ucan_station_acis = ucan_id else: wrcc_id = ucan_id table_dicts[ucan_id] = [] obj = primary_tables[tbl_name] if tbl_name == 'StationNetwork': network_station_ids_dict[ucan_id] = [] instances = obj.objects.filter(ucan_station_id=ucan_id) for i, instance in enumerate(instances): inst_list = convert_query_set(instance,'python_list') table_dicts[ucan_id].append(inst_list) #Get network_station_id for Variable, StationDigital tables #if we are looking at the StationNetwork table if tbl_name == 'StationNetwork': inst_dict = convert_query_set(instance,'python_dict') network_station_ids_dict[ucan_id].append(str(inst_dict['network_station_id'])) context['network_station_ids_dict'] = network_station_ids_dict #query station_table entries in db for wrcc id entry if wrcc_id: station = convert_query_set(models.Station.objects.filter(ucan_station_id=wrcc_id), 'python_dict') if ucan_station_id_acis: ucan_station_id_form = ucan_station_id_acis else: ucan_station_id_form = ucan_id_list[0] else: if ucan_station_id_acis: station = convert_query_set(models.Station.objects.filter(ucan_station_id=ucan_station_id_form), 'python_dict') ucan_station_id_form = ucan_station_id_acis else: station = convert_query_set(models.Station.objects.filter(ucan_station_id=ucan_id_list[0]), 'python_dict') ucan_station_id_form = ucan_id_list[0] #Reorder results for easy html formatting max_instances = max([len(table_dicts[uid]) for uid in ucan_id_list]) if max_instances == 0: #set up blank form for table #get station table for start, end dates and data flags init = { 'ucan_station_id':ucan_station_id_form, 'begin_date':WRCCUtils.convert_db_dates(station['begin_date']), 'end_date':WRCCUtils.convert_db_dates(station['end_date']), 'begin_date_flag':station['begin_date_flag'], 'end_date_flag':station['end_date_flag'], 'history_flag':station['history_flag'], 'src_quality_code':station['src_quality_code'], 'updated_by': 'WRCCsync', 'last_updated':today_yr + '-' + today_month + '-' + today_day } form_class = getattr(mforms, tbl_name + 'Form') form = form_class(initial=init) for field in form.fields: if form[field].value(): table_dicts[ucan_station_id_form].append([str(field), str(form[field].value())]) else: table_dicts[ucan_station_id_form].append([str(field),'']) results=[[table_dicts[ucan_station_id_form]]] else: #Format for html display results = [[[] for idx in range(len(ucan_id_list)+1)] for inst in range(max_instances)] for inst in range(max_instances): for idx, ucan_id in enumerate(ucan_id_list): if len(table_dicts[ucan_id]) > inst: results[inst][idx]=table_dicts[ucan_id][inst] if ucan_id >1000000: results[inst][-1] = [] for idx, key_val in enumerate(table_dicts[ucan_id][inst]): results[inst][-1].append([key_val[0], key_val[1]]) if not results[inst][-1]: for idx, key_val in enumerate(table_dicts[ucan_id_list[-1]][inst]): results[inst][-1].append([key_val[0], key_val[1]]) #Overwrite editable form with wrcc values if they exist #and replace updated_by, last _updated and ucan_id context['x'] = WRCCUtils.convert_db_dates(station['begin_date']) if tbl_done: for idx, key_val in enumerate(results[inst][-1]): results[inst][-1][idx][1] = '' else: for idx, key_val in enumerate(results[inst][-1]): if str(key_val[0]) == 'ucan_station_id': results[inst][-1][idx][1]= ucan_station_id_form if str(key_val[0]) == 'begin_date_flag': results[inst][-1][idx][1]= station['begin_date_flag'] if str(key_val[0]) == 'begin_date': results[inst][-1][idx][1]= WRCCUtils.convert_db_dates(station['begin_date']) if str(key_val[0]) == 'end_date_flag': results[inst][-1][idx][1]= station['end_date_flag'] if str(key_val[0]) == 'end_date': results[inst][-1][idx][1]= WRCCUtils.convert_db_dates(station['end_date']) if str(key_val[0]) == 'history_flag': results[inst][-1][idx][1]= station['history_flag'] if str(key_val[0]) == 'src_quality_code': results[inst][-1][idx][1]= station['src_quality_code'] if str(key_val[0]) == 'last_updated':results[inst][-1][idx][1] = today_yr + '-' + today_month + '-' + today_day if str(key_val[0]) == 'updated_by':results[inst][-1][idx][1]= 'WRCCSync' context['results'] = results #Write merge information to metadata.load file if 'form_merge' in request.POST: form_idx = int(request.POST['form_id']) - 1 #Override merge table with new entries for key in request.POST: for idx,key_val in enumerate(results[form_idx][-1]): if str(key) == key_val[0]: results[form_idx][-1][idx][1] = str(request.POST[key]) meta_str = '' with open(load_tables_dir + load_tables[tbl_name],'a+') as f: for idx,key in enumerate(key_list[tbl_name]): if idx != len(key_list[tbl_name]) - 1: meta_str+=str(request.POST[key]) + '|' else: meta_str+=str(request.POST[key]) + '\n' f.write(meta_str) #Double check #os.chmod(load_tables_dir + load_tables[tbl_name], 0777) with open(load_tables_dir + load_tables[tbl_name], 'r') as f: if f.readlines()[-1] == meta_str: context['merge_successful'] = True context['form_id'] = int(request.POST['form_id']) return render_to_response('wrcc_meta/station_tables_merge.html', context, context_instance=RequestContext(request))