def set_min_max_dates(initial): sd = '9999-99-99';ed = '9999-99-99' sd_fut = sd; ed_fut = ed data_type = 'station' if 'location' in initial.keys(): data_type = 'grid' if initial['app_name'] in ['monthly_spatial_summary', 'temporal_summary']: data_type = 'grid' if 'data_type' in initial.keys() and initial['data_type'] == 'grid': data_type = 'grid' if 'station_id' in initial.keys(): stn_json = settings.MEDIA_DIR + '/json/US_station_id.json' stn_id, stn_name = WRCCUtils.find_id_and_name(initial['station_id'],stn_json) els = [] if 'variable' in initial.keys(): els = [initial['variable']] if 'variables' in initial.keys(): els = initial['variables'] vd, no_vd_els = WRCCUtils.find_valid_daterange(stn_id,el_list=els,max_or_min='min') sd = vd[0];ed = vd[1] #sd_fut = sd;ed_fut = ed elif data_type == 'grid': sd = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][0] #ed = WRCCUtils.advance_date(sd,10*365,'forward') ed = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][1] #sd_fut = sd;ed_fut = ed if len(WRCCData.GRID_CHOICES[initial['grid']][3]) == 2: sd_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][0] #ed_fut = WRCCUtils.advance_date(sd,10*365,'forward') ed_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][1] else: if 'data_type' in initial.keys() and initial['data_type'] == 'station': sd = '1850-01-01' ed = today return sd, ed, sd_fut, ed_fut
def set_min_max_dates(initial): sd = '9999-99-99';ed = '9999-99-99' sd_fut = sd; ed_fut = ed if 'station_id' in initial.keys(): stn_json = settings.MEDIA_DIR + '/json/US_station_id.json' stn_id, stn_name = WRCCUtils.find_id_and_name(initial['station_id'],stn_json) els = [] if 'element' in initial.keys(): els = [initial['element']] if initial['element'] in ['dtr','pet']:els = ['maxt','mint'] if 'elements' in initial.keys(): els = initial['elements'] if 'dtr' in els and 'maxt' not in els: els.append('maxt') if 'dtr' in els and 'mint' not in els: els.append('mint') if 'dtr' in els and 'maxt' not in els: els.append('maxt') if 'dtr' in els and 'mint' not in els: els.append('mint') vd = WRCCUtils.find_valid_daterange(stn_id,el_list=els,max_or_min='min') if vd and len(vd) >=1:sd = vd[0] if vd and len(vd) >1:ed = vd[1] sd_fut = sd;ed_fut = ed if 'location' in initial.keys() or initial['app_name'] == 'monthly_spatial_summary': sd = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][0] ed = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][1] sd_fut = sd;ed_fut = ed if len(WRCCData.GRID_CHOICES[initial['grid']][3]) == 2: sd_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][0] ed_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][1] return sd, ed, sd_fut, ed_fut
def set_wrapper_params(stn_id): ''' yesterday = WRCCUtils.set_back_date(1) w_params = [stn_id, 'all','18000101',yesterday] ''' vd = WRCCUtils.find_valid_daterange(stn_id) if len(vd) == 2 and vd[0] and vd[1]: return [stn_id, 'all',vd[0],vd[1]] return []
def set_form(request, clean=True): ''' Coverts request input to usable form input: Deals with unicode issues and autofill options for identifiers NOTE: elements should always be a list (also when clean = False) If Clean == True, We also clean up some form fields for submission: date fields, convert to yyyymmdd window fields, convert to mmdd name strings are converted to ids Combine elemenst weith degree days ''' try: req_method = request.method except: if isinstance(request,dict): req_method = 'dict' else:req_method = None form= {} form['req_method'] = req_method #Convert request object to python dictionary if req_method == 'dict': form = copy.deepcopy(request) #Special case elements, always needs to be list if 'element' in request.keys() and not 'elements' in request.keys(): form['elements'] = [form['element']] if 'elements' in request.keys(): form['elements'] = WRCCUtils.convert_elements_to_list(request['elements']) elif req_method == 'POST': for key, val in request.POST.items(): form[str(key)]= val #form = dict((str(x),str(y)) for x,y in request.POST.items()) #Special case elements, always needs to be list if 'element' in request.POST.keys() and not 'elements' in request.POST.keys(): form['elements'] = [str(request.POST['element'])] if 'elements' in request.POST.keys(): #form['elements'] = WRCCUtils.convert_elements_to_list(request.POST['elements']) els = request.POST.getlist('elements',request.POST.get('elements','').split(',')) form['elements'] = [str(el) for el in els] if 'metadata_keys' in request.POST.keys(): form['metadata_keys'] = request.POST.getlist('metadata_keys',request.POST.get('metadata_keys','').split(',')) elif req_method == 'GET': #form = dict((str(x),str(y)) for x,y in request.GET.items()) for key, val in request.GET.items(): form[str(key)]= val #Special case elements, always needs to be list if 'element' in request.GET.keys() and not 'elements' in request.GET.keys(): form['elements'] = [str(request.GET['element'])] if 'elements' in request.GET.keys(): #form['elements'] = WRCCUtils.convert_elements_to_list(request.GET['elements']) form['elements'] = request.GET.get('elements','').split(',') if 'metadata_keys' in request.GET.keys(): form['metadata_keys'] = request.GET.getlist('metadata_keys',request.GET.get('metadata_keys','').split(',')) else: form = {} #set data type for single apps if 'data_type' not in form.keys(): if 'station_id' in form.keys(): form['data_type'] = 'station' if 'location' in form.keys(): form['data_type'] = 'grid' if 'app_name' in form.keys() and form['app_name'] in ['temporal_summary','monthly_spatial_summary']: form['data_type'] = 'grid' #Convert unicode to string if 'elements' in form.keys(): form['elements'] = [str(el) for el in form['elements']] if 'csrfmiddlewaretoken' in form.keys(): del form['csrfmiddlewaretoken'] if 'formData' in form.keys(): del form['formData'] if 'form_options' in form.keys(): del form['form_options'] if not clean: return form #Clean up form for submission #Clean Dates and windows vd = None for key in ['start_date', 'end_date', 'start_year', 'end_year','start_window','end_window']: if key not in form.keys(): continue if form[key].lower() == 'por': if str(key) in ['start_date']: k=key; idx = 0;sd = 'por'; ed = form['end_date'] if str(key) in ['end_date']: k=key; idx = 1;ed = 'por'; sd = form['start_date'] if str(key) in ['start_year']: k='start_date'; idx = 0;sd = 'por' if form['end_year'].lower() == 'por':ed = 'por' else:ed = str(int(form['end_year']) -1) + '-12-31' if str(key) in ['end_year']: k='end_date'; idx = 1;ed = 'por' if form['start_year'].lower() == 'por':sd = 'por' else:sd = form['start_year'] + '-01-01' if 'element' in form.keys() and not 'elements' in form.keys(): if form['element'] in ['dtr']: el_list = ['maxt','mint'] if form['element'] in ['pet']: el_list = ['maxt','mint','pcpn'] if 'elements' in form.keys() and not 'element' in form.keys(): if isinstance(form['elements'],basestring): el_list = form['elements'].replace(' ','').split(',') else: el_list = form['elements'] else: el_list = None if 'station_id' in form.keys(): if vd is None: stn_id, stn_name = WRCCUtils.find_id_and_name(str(form['station_id']),settings.MEDIA_DIR +'json/US_station_id.json') vd = WRCCUtils.find_valid_daterange(stn_id, start_date=sd, end_date=ed, el_list=el_list, max_or_min='max') form[k] = vd[idx] if key == 'start_year' and form['start_year'].lower() == 'por': form['start_year'] = vd[0][0:4] if key == 'end_year' and form['end_year'].lower() == 'por': form['end_year'] = vd[1][0:4] else: form[str(key)] = str(form[key]).replace('-','').replace(':','').replace('/','').replace(' ','') else: form[str(key)] = str(form[key]).replace('-','').replace(':','').replace('/','').replace(' ','') #Convert user input of area names to ids for key in ['station_id','county', 'basin', 'county_warning_area', 'climate_division']: if not key in form.keys(): continue ID,name = WRCCUtils.find_id_and_name(form[key],settings.MEDIA_DIR +'json/US_' + key + '.json') form[key] = ID form['user_area_id'] = str(name) + ', ' + str(ID) if not 'user_area_id' in form.keys(): try: form['user_area_id'] = form[form['area_type']] except: try: form['user_area_id'] = form[form['data_type']] except: pass #station_ids is special case if 'station_ids' in form.keys(): stn_ids = '' stn_list = form['station_ids'].rstrip(',').split(',') #Remove leading spaces from list items stn_list = [v.lstrip(' ').rstrip(' ') for v in stn_list] stn_ids, stn_names = WRCCUtils.find_ids_and_names(stn_list,settings.MEDIA_DIR +'json/US_' + 'station_id' + '.json') form['station_ids'] = stn_ids uai = '' stn_names_list = stn_names.split(',') for idx, stn_id in enumerate(stn_ids.split(',')): uai+=str(stn_names[idx]) + ', ' + str(stn_id) + ';' form['user_area_id'] = uai #set data summary if needed if 'data_summary' not in form.keys(): if 'temporal_summary' in form.keys(): form['data_summary'] = 'temporal_summary' if 'spatial_summary' in form.keys(): form['data_summary'] = 'spatial_summary' #Combine elements if 'add_degree_days' in form.keys() and form['add_degree_days'] == 'T': for dd in form['degree_days'].replace(' ','').split(','): ''' if form['units'] == 'metric': el_strip, base_temp = WRCCUtils.get_el_and_base_temp(dd) form['elements'].append(el_strip + str(WRCCUtils.convert_to_english('base_temp',base_temp))) else: form['elements'].append(dd) ''' form['elements'].append(dd) return form
def sods(request, app_name): units = {'pcpn':'Hundredths of Inches', 'snow':'Tenths of Inches', 'snwd': 'Inches', 'maxt':'Whole Degrees', 'mint':'Whole Degrees',\ 'avgt':'Whole Degrees', 'dtr':'Whole Degrees', 'hdd':'Days', 'cdd':'Days','gdd':'Days'} months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'] context = { 'title': '%s' % app_name, } #Form 1 dealing with station selection and for some apps, preliminary information form1 = set_as_form(request, 'Sod0', init={'app_name': app_name}) context['form1'] = form1 if 'stn_selection' in request.POST: #if app_name == 'Soddd': # form1 = set_as_form(request, 'Sod0', init={'app_name': app_name, 'skip_days':False}) #elif app_name == 'Sodthr': # form1 = set_as_form(request, 'Sod0', init={'app_name': app_name, 'custom_tables':False, 'number_of_threholds':1}) #else: form1 = set_as_form(request, 'Sod0', init={'app_name': app_name}) context['form1'] = form1 if form1.is_valid(): context['form_2_ready'] = '2ready' station_selection = form1.cleaned_data['station_selection'] if app_name == 'Soddd': initial = {'app_name':app_name, 'station_selection':station_selection, \ 'skip_days':form1.cleaned_data['skip_days'], 'truncate':form1.cleaned_data['truncate'] } elif app_name == 'Sodpct': initial = {'app_name':app_name, 'station_selection':station_selection,\ 'threshold':form1.cleaned_data['threshold'], 'element':form1.cleaned_data['element'], \ 'individual_averages': form1.cleaned_data['individual_averages'] } elif app_name == 'Sodthr': initial = {'app_name':app_name, 'station_selection':station_selection,\ 'custom_tables':form1.cleaned_data['custom_tables'],'number_of_thresholds': form1.cleaned_data['number_of_thresholds']} elif app_name == 'Sodxtrmts': initial = {'app_name':app_name, 'station_selection':station_selection,\ 'statistic':form1.cleaned_data['statistic'], 'element':form1.cleaned_data['element'], \ 'frequency_analysis':form1.cleaned_data['frequency_analysis'],'statistic_period':'monthly'} elif app_name == 'Sodpiii': initial = {'app_name':app_name, 'station_selection':station_selection,\ 'skew':form1.cleaned_data['skew'], 'cv':form1.cleaned_data['cv'], 'mean':form1.cleaned_data['mean'], \ 'pct_average':form1.cleaned_data['pct_average'], 'days':form1.cleaned_data['days']} else: initial = {'app_name':app_name, 'station_selection':station_selection} form2 = set_as_form2(init=initial) context['form2'] = form2 else: station_selection=None #Form2 Application parameters if 'app_form' in request.POST: form2 = set_as_form(request, 'Sod') context['form2'] = form2 #import pdb; pdb.set_trace() if form2.is_valid(): context['cleaned'] = form2.cleaned_data #Check for POR vd = None if 'station_id' in form2.cleaned_data.keys() or 'stnid' in form2.cleaned_data.keys(): if 'station_id' in form2.cleaned_data.keys(): stn_id = form2.cleaned_data['station_id'] if 'stnid' in form2.cleaned_data.keys(): stn_id = form2.cleaned_data['stn_id'] if 'start_date' in form2.cleaned_data.keys() and form2.cleaned_data['start_date'].upper() == 'POR': vd = WRCCUtils.find_valid_daterange(stn_id, max_or_min='max') if 'end_date' in form2.cleaned_data.keys() and form2.cleaned_data['end_date'].upper() == 'POR' and vd is None: vd = WRCCUtils.find_valid_daterange(stn_id, max_or_min='max') if vd is not None and len(vd) == 2: form2.cleaned_data['start_date'] = vd[0] form2.cleaned_data['end_date'] = vd[1] (data, dates, elements, station_ids, station_names) = AcisWS.get_sod_data(form2.cleaned_data, app_name) #get contexts for the different apps and run data application if app_name in ['Sodrun', 'Sodrunr']: if elements == ['maxt', 'mint']: context['el'] = 'range' else: context['el'] = str(elements[0]) if form2.cleaned_data['aeb'] == 'A': context['op'] = '>' elif form2.cleaned_data['aeb'] == 'B': context['op'] = '<' else: context['op'] = '=' context['thresh'] = form2.cleaned_data['threshold'] context['dur'] = form2.cleaned_data['minimum_run'] app_args = {'app_name': app_name, 'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names,'op':context['op'],\ 'thresh':context['thresh'], 'verbose': form2.cleaned_data['verbose'], 'minimum_run': form2.cleaned_data['minimum_run']} results = WRCCDataApps.Sodrun(**app_args) elif app_name == 'Soddynorm': app_args = {'app_name': app_name, 'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names,\ 'filter_type':form2.cleaned_data['filter_type'],\ 'filter_days':form2.cleaned_data['number_of_days']} results = WRCCDataApps.Soddynorm(**app_args) ''' results = run_data_app(app_name, data, dates, elements, station_ids, station_names, \ form2.cleaned_data['filter_type'], form2.cleaned_data['number_of_days']) ''' elif app_name == 'Soddyrec': app_args = {'app_name': app_name, 'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names} results = WRCCDataApps.Soddyrec(**app_args) #context['data'] =results elif app_name == 'Soddd': base_temp = form2.cleaned_data['base_temperature'] output_type = form2.cleaned_data['output_type'] max_miss = form2.cleaned_data['max_missing_days'] a_b = form2.cleaned_data['above_or_below'] if a_b == 'a': context['a_b'] = 'ABOVE' else: context['a_b'] = 'BELOW' max_miss = form2.cleaned_data['max_missing_days'] ncdc_round = form2.cleaned_data['ncdc_roundoff'] context['ncdc_round'] = ncdc_round app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names,\ 'base_temp':base_temp, 'a_b':a_b,'output_type':output_type, \ 'max_miss':max_miss, 'ncdc_round':ncdc_round} context['skip_max_above'] = 'NO DAYS SKIPPED' context['skip_min_below'] = 'NO DAYS SKIPPED' context['trunc_high'] = 'NONE' context['trunc_low'] = 'NONE' if form2.cleaned_data['skip_days']: skip_max_above = form2.cleaned_data['skip_days_with_max_above'] skip_min_below = form2.cleaned_data['skip_days_with_min_below'] app_args['skip_max_above'] = skip_max_above app_args['skip_min_below'] = skip_min_below context['skip_max_above'] = skip_max_above context['skip_min_below'] = skip_min_below if form2.cleaned_data['truncate']: trunc_high = form2.cleaned_data['truncation_upper_limit'] trunc_low = form2.cleaned_data['truncation_lower_limit'] app_args['trunc_high'] = trunc_high app_args['trunc_low'] = trunc_low context['trunc_high'] = trunc_high context['trunc_low'] = trunc_low context['base_temp'] = base_temp context['output_type'] = output_type context['max_miss'] = max_miss if form2.cleaned_data['output_type'] == 'm': context['monthly'] = 'yes' else: context['daily'] = 'yes' results = run_data_app(**app_args) elif app_name == 'Sodpad': app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names} results = run_data_app(**app_args) mon_dict = {} day_dict = {} for doy in range(366): mon, day = WRCCUtils.compute_mon_day(doy+1) mon_dict[doy] = mon day_dict[doy] = day context['mon'] = mon_dict context['day'] = day_dict context['durations'] ={ 1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:12,12:14,13:15,14:16,15:18,16:20,17:22,18:24,19:25,20:26,21:28,22:30} elif app_name == 'Sodsumm': el_type = form2.cleaned_data['element'] app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'ids':station_ids,'station_names':station_names,'el_type':el_type, 'max_missing_days':form2.cleaned_data['max_missing_days']} results = run_data_app(**app_args) context['max_missing_days'] = form2.cleaned_data['max_missing_days'] if el_type == 'temp': table_list = ['temp'] elif el_type == 'prsn': table_list = ['prsn'] elif el_type == 'both': table_list = ['temp', 'prsn'] elif el_type == 'hc': table_list = ['hdd', 'cdd'] elif el_type == 'g': table_list = ['gdd', 'corn'] elif el_type == 'all': table_list = ['temp', 'prsn', 'hdd', 'cdd', 'gdd', 'corn'] context['headers'] = set_sodsumm_headers(table_list) elif app_name == 'Sodpct': el_type = form2.cleaned_data['element'] if abs(form2.cleaned_data['threshold'] + 9999) < 0.05: threshold = None else: threshold = form2.cleaned_data['threshold'] ia = form2.cleaned_data['individual_averages'] number_days_ahead = form2.cleaned_data['number_days_ahead'] if 'threshold_ab' in form2.cleaned_data.keys(): threshold_ab = form2.cleaned_data['threshold_ab'] else: threshold_ab = None if el_type in ['hdd', 'cdd', 'gdd']: base_temperature = form2.cleaned_data['base_temperature'] if el_type == 'gdd': min_temperature = form2.cleaned_data['min_temperature'] max_temperature = form2.cleaned_data['max_temperature'] else: min_temperature = None max_temperature = None else: base_temperature = None min_temperature = None max_temperature = None if 'begin_month' in form2.cleaned_data.keys(): begin_month = form2.cleaned_data['begin_month'] else: begin_month = None if 'accumulate_over_season' in form2.cleaned_data.keys(): accumulate_over_season = form2.cleaned_data['accumulate_over_season'] else: accumulate_over_season = None app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names,'el_type':el_type,\ 'ia':ia, 'number_days_ahead':number_days_ahead,'threshold':threshold, 'threshold_ab':threshold_ab, \ 'base_temperature':base_temperature, 'min_temperature':min_temperature, \ 'max_temperature':max_temperature, 'begin_month':begin_month, 'accumulate_over_season':accumulate_over_season } if threshold_ab == 'A': context['op'] = 'Above' elif threshold_ab == 'B': context['op'] = 'Below' context['base_temperature'] = base_temperature context['min_temperature'] = min_temperature context['min_temperature'] = max_temperature context['begin_month'] = begin_month context['threshold'] = threshold if threshold_ab == 'a':context['op'] = 'ABOVE' if threshold_ab == 'b':context['op'] = 'BELOW' context['element'] = el_type context['units'] = units[el_type] context['individual_averages'] = ia results = run_data_app(**app_args) elif app_name == 'Sodthr': header = {} el_type = form2.cleaned_data['element'] start_year = dates[0][0:4] end_year = dates[-1][0:4] number_of_thresholds = form2.cleaned_data['number_of_thresholds'] custom_tables = form2.cleaned_data['custom_tables'] if custom_tables == 'T': time_series = [] thresholds = [] #set headers for k in range(3): header[k] = set_sodthr_headers(k, el_type, str(form2.cleaned_data['interval_start']), \ str(form2.cleaned_data['midpoint']),str(form2.cleaned_data['interval_end']), start_year, end_year, \ int(form2.cleaned_data['max_missing_days_first_and_last']), int(form2.cleaned_data['max_missing_days_differences']), \ str(form2.cleaned_data['above_or_below']), str(form2.cleaned_data['latest_or_earliest_for_period_1']), \ str(form2.cleaned_data['latest_or_earliest_for_period_2'])) #Find list of thresholds, and time_series_booleans for k in range(int(number_of_thresholds)): thresholds.append(float(form2.cleaned_data['threshold_%s' % str(k)])) time_series.append(form2.cleaned_data['time_series_%s' % str(k)]) #set application arguments app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names,'el_type':el_type, 'custom_tables':True, \ 'interval_start':form2.cleaned_data['interval_start'], 'midpoint':form2.cleaned_data['midpoint'], \ 'interval_end':form2.cleaned_data['interval_end'], 'thresholds': thresholds, 'time_series': time_series, \ 'le_1': form2.cleaned_data['latest_or_earliest_for_period_1'], \ 'le_2':form2.cleaned_data['latest_or_earliest_for_period_2'], 'ab':form2.cleaned_data['above_or_below'], \ 'miss_days_1':form2.cleaned_data['max_missing_days_first_and_last'], 'miss_days_2':form2.cleaned_data['max_missing_days_differences']} else: #set headers for k in range(3): header[k] = set_sodthr_headers(k, el_type, '0101', '0731', '1231', start_year, \ end_year, 10, 10, 'BELOW', 'latest','earliest') app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names,'el_type':el_type, 'custom_tables':False} context['header'] = header results = run_data_app(**app_args) elif app_name == 'Sodxtrmts': context['element'] = form2.cleaned_data['element'] context['max_missing_days'] = form2.cleaned_data['max_missing_days'] context['start_month'] = WRCCData.NUMBER_TO_MONTH_NAME[form2.cleaned_data['start_month']] mon_start = int(form2.cleaned_data['start_month'].lstrip('0')) month_list = [] for mon_idx in range(mon_start -1,12): month_list.append(months[mon_idx]) for mon_idx in range(mon_start-1): month_list.append(months[mon_idx]) month_list.append('ANN') context['month_list'] = month_list context['frequency_analysis'] = WRCCData.DISPLAY_PARAMS[form2.cleaned_data['frequency_analysis']] context['statistic'] = WRCCData.DISPLAY_PARAMS[form2.cleaned_data['statistic']] context['departure_from_averages'] = WRCCData.DISPLAY_PARAMS[form2.cleaned_data['departures_from_averages']] app_args = { 'app_name':app_name, 'data':data, 'dates':dates, 'elements':elements, 'station_ids':station_ids, 'station_names':station_names, 'element':form2.cleaned_data['element'], 'max_missing_days':form2.cleaned_data['max_missing_days'], 'start_month': form2.cleaned_data['start_month'], 'statistic_period':'monthly', 'statistic': form2.cleaned_data['statistic'], 'frequency_analysis': form2.cleaned_data['frequency_analysis'], 'departures_from_averages':form2.cleaned_data['departures_from_averages'] } if form2.cleaned_data['frequency_analysis'] == 'T': context['frequency_analysis_type'] = form2.cleaned_data['frequency_analysis_type'] app_args['frequency_analysis_type'] = form2.cleaned_data['frequency_analysis_type'] if form2.cleaned_data['statistic'] == 'ndays': app_args['less_greater_or_between'] = form2.cleaned_data['less_greater_or_between'] if form2.cleaned_data['less_greater_or_between'] == 'b': app_args['threshold_low_for_between'] = form2.cleaned_data['threshold_low_for_between'] app_args['threshold_high_for_between'] = form2.cleaned_data['threshold_high_for_between'] else: app_args['threshold_for_less_or_greater'] = form2.cleaned_data['threshold_for_less_or_greater'] if form2.cleaned_data['element'] in ['hdd', 'gdd', 'cdd']: app_args['base_temperature'] = form2.cleaned_data['base_temperature'] context['app_arg'] = app_args results = WRCCDataApps.Sodxtrmts(**app_args) #context['fa_results'] = dict(fa_results) elif app_name == 'Sodpiii': lisdur = [ '6 Hrs', '12 Hrs', '1 Day', '2 Days', '3 Days', \ '4 Days', '5 Days', '6 Days', '7 Days', '8 Days', '9 Days', \ '10 Days', '15 Days', '20 Days', '25 Days', '30 Days'] context['el_type'] = form2.cleaned_data['element'] context['units'] = units[form2.cleaned_data['element']] context['start_year'] = form2.cleaned_data['start_date'][0:4] context['end_year'] = str(int(form2.cleaned_data['end_date'][0:4]) - 1) context['start_month'] = form2.cleaned_data['start_date'][4:6] context['end_month'] = form2.cleaned_data['end_date'][4:6] app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\ 'station_ids':station_ids,'station_names':station_names, \ 'el_type':form2.cleaned_data['element'], 'skew':form2.cleaned_data['skew'], \ 'cv':form2.cleaned_data['cv'], 'mean': form2.cleaned_data['mean'], \ 'pct_average':form2.cleaned_data['pct_average'], \ 'value_subsequent':form2.cleaned_data['value_subsequent'], \ 'value_missing':form2.cleaned_data['value_missing'],'days':form2.cleaned_data['days']} if form2.cleaned_data['element'] == 'avgt': app_args['ab'] = form2.cleaned_data['mean_temperatures'] duration = {} if form2.cleaned_data['days'] == 'i': app_args['number_of_days'] = int(form2.cleaned_data['number_of_days']) duration[0] = '%i Days' % int(form2.cleaned_data['number_of_days']) elif form2.cleaned_data['days'] == '5': for k in range(5): duration[k] = lisdur[k + 2] elif form2.cleaned_data['days'] == 'a': for k in range(len(lisdur)): duration[k] = lisdur[k] context['duration'] = duration results_0, results, averages, stdevs, skews = WRCCDataApps.Sodpiii(**app_args) context['averages'] = averages context['stdevs'] = stdevs context['skews'] = skews context['results_0'] = dict(results_0) else: results = {} #general context try: context['results'] = dict(results) except: context['results'] = results context['dates'] = dates if app_name in ['Sodrun', 'Sodrunr', 'Soddyrec', 'Sodcnv', 'Sodlist']: context['start_year'] = dates[0] context['end_year'] = dates[-1] elif app_name in ['Soddd', 'Sodpiii', 'Sodsumm']: context['start_year'] = dates[0][0:4] context['end_year'] = str(int(dates[-1][0:4])) else: context['start_year'] = dates[0][0:4] if app_name == 'Sodxtrmts': context['end_year'] = dates[-1][0:4] else: context['end_year'] = str(int(dates[-1][0:4])+1) context['num_yrs'] = int(dates[-1][0:4]) - int(dates[0][0:4])+1 context['elements'] = dict([(k,v) for k,v in enumerate(elements)]) context['data'] = dict(data) context['station_ids'] = dict([(k,v) for k,v in enumerate(station_ids)]) context['station_names'] = dict([(k,v) for k,v in enumerate(station_names)]) #form_2 not valid or we are done with analysis form2 = set_as_form(request, 'Sod') context['form2'] = form2 context['form_2_ready'] = True station_selection = None #else: #form_2 is not valid # print "The following errors occurred:" # print form2.errors # station_selection = None return render_to_response('wrcc_apps/%s.html' % app_name, context, context_instance=RequestContext(request))
def set_wrapper_params(stn_id, table_name): vd, no_vd_els = WRCCUtils.find_valid_daterange(stn_id) if len(vd) == 2 and vd[0] != '9999-99-99' and vd[1] != '9999-99-99': return [stn_id, table_name,vd[0][0:4],vd[1][0:4],5] return []
def get_station_data(form_input, program): ''' Retrieves Station Data from ACIS. Keyword arguments: form_input -- parameter file for data request obtained from user of CSC pages program -- specifies program that is making the request. Returns python dictionary with keys: meta data ''' request = {'data':[]} s_date, e_date = WRCCUtils.start_end_date_to_eight(form_input) #Sanity check for valid date input: if (s_date.lower() == 'por' or e_date.lower() == 'por') and ('station_id' not in form_input.keys()): error = 'Parameter error. Start/End date ="por" not supported for multi station call.' resultsdict['error'] = error return resultsdict variables = WRCCUtils.get_variable_list(form_input, program) elems_list = [] elems_list_short = [] resultsdict = {} for el in variables: el_strip, base_temp = WRCCUtils.get_el_and_base_temp(el) elems_list_short.append(el_strip) if el_strip in ['gdd', 'hdd', 'cdd'] and base_temp is not None: d = dict(vX=WRCCData.ACIS_ELEMENTS_DICT[el_strip]['vX'], base=int(base_temp), add='f,t') elems_list.append(d) else: d = dict(vX=WRCCData.ACIS_ELEMENTS_DICT[el]['vX'],add='f,t') elems_list.append(d) params = { 'sdate':s_date, 'edate':e_date, 'meta':'name,state,sids,ll,elev,uid,valid_daterange', 'elems':elems_list } shape_type = None #Deal with POR input dates if 'station_id' in form_input.keys(): sid = form_input['station_id'] s = s_date.lower() e = e_date.lower() l = elems_list_short vd, no_vd_els = WRCCUtils.find_valid_daterange(sid, start_date=s, end_date=e, el_list=l, max_or_min='max') params['sdate'] = v[0]; params['edate'] = v[1] if params['sdate'] == '9999-99-99' or params['edate'] == '9999-99-99': error = 'No start/end date could be found for this station in the metadata database.' resultsdict['error'] = error return resultsdict #Set area parameter try: key = WRCCData.STN_AREA_FORM_TO_PARAM[form_input['select_stations_by']] val = form_input[form_input['select_stations_by']] except: key = WRCCData.STN_AREA_FORM_TO_PARAM[form_input['area_type']] val = form_input[form_input['area_type']] params[key] = val #Find bbox if custom shape and update params['bbox'] if 'shape' in form_input.keys(): shape_type,bbox = WRCCUtils.get_bbox(form_input['shape']) params['bbox'] = bbox #Data request try: req = MultiStnData(params) except Exception, e: request['error'] = 'StnData request failed. Error: %s. Pameters: %s.' %(str(e), params) return request
def set_wrapper_params(stn_id, table_name): vd = WRCCUtils.find_valid_daterange(stn_id) if len(vd) == 2 and vd[0] and vd[1]: return [stn_id, table_name,vd[0][0:4],vd[1][0:4],5] return []