def check_end_date(form):
    err = None
    s_date = form['start_date']
    e_date = form['end_date']
    #Check valid daterange error
    if e_date.lower() == 'por':
        if 'station_id' in form.keys():
            return err
        else:
            return '%s is not a valid Start Date for a multi-station or grid request!' %str(form['end_date'])
    s_date = WRCCUtils.date_to_eight(s_date)
    e_date = WRCCUtils.date_to_eight(e_date)
    if len(e_date)!=8:
        return '%s is not a valid date.' %str(form['end_date'])

    try:
        int(e_date)
    except:
        return '%s is not a valid date.' %str(form['end_date'])

    #Check month
    if int(e_date[4:6]) < 1 or int(e_date[4:6]) > 12:
        return '%s is not a valid date.' %str(form['end_date'])
    #Check day
    if int(e_date[6:8]) < 1 or int(e_date[4:6]) > 31:
        return '%s is not a valid date.' %str(form['end_date'])


    #Ceck for month length
    ml = WRCCData.MONTH_LENGTHS[int(e_date[4:6]) - 1]
    if int(e_date[6:8]) > ml:
        if str(e_date[4:6]) == '02' or str(e_date[4:6]) == '2':
            if int(e_date[6:8]) == 29 and  WRCCUtils.is_leap_year(e_date[0:4]):
                return None
                #return '%s only has %s days. You entered: %s' %(WRCCData.NUMBER_TO_MONTH_NAME[str(e_date[4:6])],'29',str(e_date[6:8]))
            else:
                return '%s only has %s days. You entered: %s' %(WRCCData.NUMBER_TO_MONTH_NAME[str(e_date[4:6])],str(ml),str(e_date[6:8]))
        else:
            return '%s only has %s days. You entered: %s' %(WRCCData.NUMBER_TO_MONTH_NAME[str(e_date[4:6])],str(ml),str(e_date[6:8]))

    #Check that start date is ealier than end date
    if s_date.lower() == 'por':
        return err
    try:
        sd = datetime.datetime(int(s_date[0:4]), int(s_date[4:6].lstrip('0')), int(s_date[6:8].lstrip('0')))
    except:
        pass
    try:
        ed = datetime.datetime(int(e_date[0:4]), int(e_date[4:6].lstrip('0')), int(e_date[6:8].lstrip('0')))
    except:
        return '%s is not a valid date.' %form['end_date']
    try:
        if ed < sd:
            return 'Start Date is later then End Year.'
    except:pass

    #Check grid data dates
    if 'location' in form.keys() or ('data_type' in form.keys() and form['data_type'] == 'grid'):
        flag = False
        #Set grid date range
        #Set grid date range
        if int(form['grid']) in range(22,42):
            grid_dr = [['19500101','20991231']]
        else:
            grid_dr = WRCCData.GRID_CHOICES[str(form['grid'])][3]
        #For Prism we need to check if monthy/yearly resolution
        #and pick proper daterange
        if 'temporal_resolution' in form.keys() and form['temporal_resolution'] in ['mly','yly'] and str(form['grid']) == '21':
            grid_dr = WRCCData.PRISM_MLY_YLY[str(form['grid'])][3]
        for dr in grid_dr:
            grid_s = WRCCUtils.date_to_datetime(dr[0])
            grid_e = WRCCUtils.date_to_datetime(dr[1])
            if grid_s <= sd and ed <= grid_e:
                flag = False
                break
            else:
                if str(dr[1]) == str(grid_dr[-1][1]):
                    flag = True
                continue
        if flag:
            grid_s = WRCCUtils.datetime_to_date(grid_s,'-')
            grid_e = WRCCUtils.datetime_to_date(grid_e,'-')
            return 'Valid date range for this grid is: ' + grid_s + ' - ' + grid_e
        '''
        #Limit grid requests to max 10 years for multi point requests
        if not 'location' in form.keys() and (ed - sd).days > 10 * 366:
            err = 'Request for more than one grid point are limited to ten years or less! ' +\
            'Please adjust your dates accordingly.'
            return err
        '''
    #Check for unreasonable start and end dates
    #for station data requests
    data_type = WRCCUtils.get_data_type(form)
    unreasonable = False
    if data_type == 'station' and form['app_name'] == 'multi_lister':
        #Limit multi station requests to 75 years
        if not 'station_id' in form.keys() and (ed - sd).days > 75 * 366:
            err = 'Request for more than one station are limited to 75 years or less! ' +\
            'Please adjust your dates accordingly.'
    #Check that station data end date is today or earlier
    if 'station_id' in form.keys() or ('data_type' in form.keys() and form['data_type'] == 'station'):
        if e_date.lower() != 'por':
            today = WRCCUtils.format_date_string(WRCCUtils.set_back_date(0),'-')
            if WRCCUtils.date_to_datetime(e_date) >  WRCCUtils.date_to_datetime(today):
                return 'Not a valid End Date. Date should be ' + today +' or ealier.'

    return err
Exemple #2
0
def set_initial(request,app_name):
    '''
    Set html form
    Args:
        request: django request object
        app_name: application, one of
            single_lister, multi_lister, station_finder
            map_overlay,
            sf_download
            spatial_summary, temporal_summary
            monthly_summary, climatology
            data_comparison, liklihood,
            data_download
    Returns:
        two dictionaries
        initial: form input
    '''
    initial = {}
    initial['app_name'] = app_name
    Get = set_GET(request)
    Getlist = set_GET_list(request)
    #Set area type: station_id(s), location, basin,...
    area_type = None
    if app_name in ['single_lister','climatology','monthly_summary', 'seasonal_summary','intraannual']:
        initial['area_type'] = Get('area_type','station_id')
    elif app_name in ['data_comparison']:
        initial['area_type'] = 'location'
    else:
        initial['area_type'] = Get('area_type','state')
    #Set todays date parameters
    initial['today_year'] = today_year
    initial['today_month'] = today_month
    initial['today_day'] = today_day
    #Set area depending on area_type
    if app_name == 'data_comparison':
        location = Get('location',None)
        station_id = Get('station_id',None)
        if location is None and station_id is not None:
            #Link from station finder,
            #set location to station lon, lat if we are
            stn_id, stn_name = WRCCUtils.find_id_and_name(station_id,settings.MEDIA_DIR + '/json/US_station_id.json')
            meta = AcisWS.StnMeta({'sids':stn_id,'meta':'ll'})
            ll = None
            ll = str(meta['meta'][0]['ll'][0]) + ',' + str(meta['meta'][0]['ll'][1])
            initial['location'] = ll
        else:
            initial[str(initial['area_type'])] = Get(str(initial['area_type']), WRCCData.AREA_DEFAULTS[str(initial['area_type'])])
    else:
        initial[str(initial['area_type'])] = Get(str(initial['area_type']), WRCCData.AREA_DEFAULTS[str(initial['area_type'])])
    initial['area_type_label'] = WRCCData.DISPLAY_PARAMS[initial['area_type']]
    initial['area_type_value'] = initial[str(initial['area_type'])]

    #Set data type and map parameters
    if initial['area_type'] in ['station_id','station_ids']:
        initial['autofill_list'] = 'US_' + initial['area_type']
        initial['data_type'] = 'station'
    elif initial['area_type'] in ['location','locations']:
        initial['data_type'] = 'grid'
    elif initial['area_type'] in ['basin','county_warning_area','county','climate_division','state','shape']:
        initial['autofill_list'] = 'US_' + initial['area_type']
        initial['data_type'] = Get('data_type','station')
    if app_name in  ['temporal_summary','monthly_spatial_summary']:
        initial['data_type'] = 'grid'
    if app_name in ['station_finder','sf_download']:
        initial['data_type'] = 'station'
    #Grid
    if app_name not in ['station_finder', 'sf_download']:
        initial['grid'] = Get('grid','1')
    #Set up map parameters
    initial['overlay_state'] = Get('overlay_state','nv').lower()
    initial['host'] = settings.HOST
    #Create kml files for oerlay state
    for at in ['basin', 'county', 'county_warning_area', 'climate_division']:
        kml_file_path = create_kml_file(at, initial['overlay_state'])
        if initial['area_type'] == at:
            initial['kml_file_path'] = kml_file_path
    #If station_finder download, we need to set the station_ids
    #and override the original area type fields
    if app_name == 'sf_download':
        #delete old are type
        del initial[str(initial['area_type'])]
        #set new area params
        initial['station_ids'] = str(Get('station_ids_string',''))
        initial['station_ids_string'] = initial['station_ids']
        initial['area_type'] = 'station_ids'
        initial['area_type_label'] = 'Station IDs'
        initial['area_type_value'] = initial['station_ids']
        initial['station_json'] = Get('station_json','')

    #If station finder set hidden var station_ids_string for results
    if app_name == 'station_finder':
        initial['station_ids_string'] = str(Get('station_ids_string',''))
    #Set element(s)--> always as list if multiple
    if app_name == 'map_overlay':
        initial['elements'] = Get('elements','maxt,mint,pcpn').split(',')
        initial['elements_str'] = ','.join(initial['elements'])
    elif app_name in ['monthly_spatial_summary','monthly_summary','data_comparison', 'seasonal_summary','intraannual']:
            initial['element'] = Get('element',None)
            if initial['element'] is not None and len(initial['element'].split(',')) > 1:
                initial['element'] =  str(initial['element'].split(',')[0])
            if initial['element'] is None:
                #Link from station finder
                initial['element'] = Get('elements','pcpn')
                if len(initial['element'].split(',')) > 1:
                    initial['element'] = str(initial['element'].split(',')[0])
    else:
        els = Getlist('elements',None)
        if not els:
            els = Get('elements',None)
            if not els:
                els = ['maxt','mint','pcpn']
            elif isinstance(els, basestring):
                els = els.replace(' ','').split(',')
        elif isinstance(els, list) and  len(els) == 1 and len(els[0].split(',')) > 1:
            els = els[0].replace(' ','').split(',')
        elif isinstance(els, basestring):
            els = els.replace(' ','').split(',')
        initial['elements'] = [str(el) for el in els]
        initial['elements_str'] = ','.join(initial['elements'])
    #Set units
    initial['units'] = Get('units','english')

    #Set degree days
    if app_name not in ['station_finder', 'monthly_summary', 'climatology', 'data_comparison']:
        initial['add_degree_days'] = Get('add_degree_days', 'F')
        if initial['units'] == 'metric':
            initial['degree_days'] = Get('degree_days', 'gdd13,hdd21').replace(', ', ',')
        else:
            initial['degree_days'] = Get('degree_days', 'gdd55,hdd70').replace(', ',',')

    #Set dates
    #if 'grid' in initial.keys():
    sd, ed, sd_fut, ed_fut = set_min_max_dates(initial)
    if app_name in ['monthly_summary','climatology']:
        initial['start_year'] = Get('start_year', None)
        if initial['start_year'] is None:
            #Link from station finder
            initial['start_year'] = Get('start_date', '9999')[0:4]
            if initial['start_year'] == '9999':
                if 'location' in initial.keys():initial['start_year'] =  sd[0:4]
                else:initial['start_year'] = 'POR'
        initial['end_year']  = Get('end_year', None)
        if initial['end_year'] is None:
            #Link from station finder
            initial['end_year'] = Get('end_date', '9999')[0:4]
            if initial['end_year'] == '9999':
                if 'location' in initial.keys():initial['end_year'] =  ed[0:4]
                else:initial['end_year'] = 'POR'
        initial['min_year'] = Get('min_year',sd[0:4])
        initial['max_year'] = Get('max_year', ed[0:4])
        initial['min_year_fut'] = sd_fut[0:4]
        initial['max_year_fut'] = ed_fut[0:4]
    elif app_name == 'monthly_spatial_summary':
        initial['year'] = Get('year',str(int(ed[0:4]) - 1))
        initial['min_year'] = Get('min_year',sd[0:4])
        initial['max_year'] = Get('max_year', ed[0:4])
        initial['min_year_fut'] = sd_fut[0:4]
        initial['max_year_fut'] = ed_fut[0:4]
        initial['season'] = Get('season','1')
    elif app_name in ['seasonal_summary', 'intraannual']:
        initial['start_year'] = Get('start_year','POR')
        initial['end_year'] = Get('end_year','POR')
        initial['start_month']  = Get('start_month', '1')
        initial['start_day']  = Get('start_day', '1')
        initial['min_year_fut'] = sd_fut[0:4]
        initial['max_year_fut'] = ed_fut[0:4]
        if app_name == 'seasonal_summary':
            initial['min_year'] = Get('min_year',sd[0:4])
            initial['max_year'] = Get('max_year', ed[0:4])
            initial['end_month']  = Get('end_month', '1')
            initial['end_day']  = Get('end_day', '31')
        if app_name in ['intraannual']:
            if initial['start_year'].lower() != 'por':
                initial['min_year'] = initial['start_year']
            else:
                initial['min_year'] = Get('min_year',sd[0:4])
            if initial['end_year'].lower() != 'por':
                initial['max_year'] = initial['end_year']
            else:
                initial['max_year'] = Get('max_year', ed[0:4])
            #Plotting vars
            initial['show_climatology'] = Get('show_climatology','F')
            initial['show_percentile_5'] = Get('show_percentile_5','F')
            initial['show_percentile_10'] = Get('show_percentile_10','F')
            initial['show_percentile_25'] = Get('show_percentile_25','F')
            initial['target_year'] = Get('target_year_figure', None)
            if initial['target_year'] is None:
                initial['target_year'] = Get('target_year_form',initial['min_year'])
            if initial['element'] in ['pcpn','snow','evap','pet']:
                initial['calculation'] = Get('calculation','cumulative')
            else:
                initial['calculation'] = Get('calculation','values')
    else:
        initial['start_date']  = Get('start_date', WRCCUtils.format_date_string(fourtnight,'-'))
        initial['end_date']  = Get('end_date', WRCCUtils.format_date_string(yesterday,'-'))
    #data windows and flags
    sw = '01-01'; ew = '01-31'
    if 'start_date' in initial.keys() and 'end_date' in initial.keys():
        if initial['start_date'] and initial['end_date']:
            sw, ew = WRCCUtils.set_start_end_window(initial['start_date'],initial['end_date'])
    if app_name in ['single_lister', 'multi_lister','map_overlay']:
        initial['start_window'] = Get('start_window', sw)
        initial['end_window'] = Get('end_window',ew)
        initial['temporal_resolution'] = Get('temporal_resolution','dly')
        initial['show_flags'] = Get('show_flags', 'F')
        initial['show_observation_time'] = Get('show_observation_time', 'F')
    if app_name in ['station_finder']:
        initial['start_window'] = Get('start_window', sw)
        initial['end_window'] = Get('end_window',ew)
    #data summaries
    if app_name in  ['monthly_spatial_summary','temporal_summary', 'seasonal_summary']:
        initial['data_summary'] = Get('data_summary', 'temporal_summary')
    elif app_name in ['spatial_summary','multi_lister','map_overlay']:
        initial['data_summary'] = Get('data_summary', 'spatial_summary')
    else:
        initial['data_summary'] = Get('data_summary', 'none')

    if app_name in ['temporal_summary', 'monthly_spatial_summary','seasonal_summary', 'sf_download']:
        if 'element' in initial.keys() and initial['element'] in ['pcpn','snow','evap','pet']:
            initial['temporal_summary'] = Get('temporal_summary', 'sum')
        else:
            initial['temporal_summary'] = Get('temporal_summary', 'mean')
    else:
        initial['temporal_summary'] = Get('temporal_summary', 'mean')
    if app_name in ['single_lister', 'multi_lister','spatial_summary','sf_download','map_overlay']:
        initial['spatial_summary'] = Get('spatial_summary', 'mean')

    #download options
    if app_name in ['single_lister','multi_lister']:
        initial['data_format'] = Get('data_format', 'html')
    else:
        initial['data_format'] = Get('data_format', 'xl')


    if app_name in ['single_lister','multi_lister','station_finder','sf_download','map_overlay']:
        initial['output_format'] = Get('output_format', 'verbose')
    initial['delimiter'] = Get('delimiter', 'space')
    initial['output_file_name'] = Get('output_file_name', 'Output')
    initial['user_name'] = Get('user_name', 'Your Name')
    initial['user_email'] = Get('user_email', 'Your Email')

    #Set app specific params
    if app_name == 'monthly_spatial_summary':
        initial['area_reduce'] = Get('area_reduce','climate_division')
        initial['area_statistic'] = Get('area_statistic','mean')
    if app_name in ['multi_lister','spatial_summary','station_finder']:
        initial['feature_id'] = 1
    if app_name in ['monthly_summary','climatology','sf_link']:
        initial['max_missing_days']  = Get('max_missing_days', '5')
    if app_name in ['station_finder','map_overlay','sf_download']:
        initial['elements_constraints'] = Get('elements_constraints', 'all')
        initial['dates_constraints']  = Get('dates_constraints', 'all')
        initial['display'] = Get('display', 'map')
        all_meta = ['name','state','ll','elev','ids','networks','valid_daterange']
        initial['metadata_keys'] = Getlist('metadata_keys',all_meta)
        initial['metadata_keys_str'] = ','.join(initial['metadata_keys'])
        initial['metadata_names'] = [WRCCData.DISPLAY_PARAMS[meta] for meta in initial['metadata_keys']]
        initial['metadata_names_str'] = ','.join(initial['metadata_names'])
    if app_name in  ['monthly_summary','sf_link']:
        initial['start_month'] = Get('start_month','01')
        if initial['element'] in ['pcpn','snow','evap','pet']:
            initial['statistic'] = Get('statistic','msum')
        else:
            initial['statistic'] = Get('statistic','mave')
        initial['less_greater_or_between'] = Get('less_greater_or_between','b')
        initial['threshold_low_for_between'] = Get('threshold_low_for_between',0.01)
        initial['threshold_high_for_between'] = Get('threshold_high_for_between',0.1)
        initial['threshold_for_less_than'] = Get('threshold_for_less_than',1)
        initial['threshold_for_greater_than'] = Get('threshold_for_greater_than',1)
        initial['departures_from_averages'] = Get('departures_from_averages','F')
        initial['frequency_analysis'] = Get('frequency_analysis','F')
        #Set initial plot options
        initial['chart_summary'] = Get('chart_summary','individual')
        #initial['plot_months'] = Get('plot_months','0,1')
    if app_name == 'monthly_summary':
        initial['base_temperature'] = Get('base_temperature','65')
        initial['statistic_period'] = Get('statistic_period','monthly')
    if app_name in ['climatology','sf_link']:
        initial['summary_type'] = Get('summary_type', 'all')
    if app_name == 'temporal_summary':
        initial['show_plot_opts'] = Get('show_plot_opts','T')
        initial['image_size'] = Get('image_size', 'medium')
        initial['level_number'] = Get('level_number', '5')
        initial['cmap'] = Get('cmap', 'rainbow')
        initial['cmaps'] = WRCCData.CMAPS
        initial['map_ol'] = Get('map_ol', 'state')
        initial['interpolation'] = Get('interpolation', 'cspline')
        initial['projection'] = Get('projection', 'lcc')
    #Ploting options for all pages that have charts
    if app_name in ['monthly_summary', 'spatial_summary','seasonal_summary', 'intraannual','data_comparison','map_overlay']:
        if app_name in ['spatial_summary','monthly_summary','intraannual','map_overlay']:
            if app_name in ['spatial_summary','monthly_spatial_summary','map_overlay']:
                shown_indices = ','.join([str(idx) for idx in range(len(initial['elements']))])
            elif app_name == 'intraannual':
                shown_indices = str(int(initial['target_year']) - int(initial['min_year']))
            else:
                shown_indices = '0'
            initial['chart_indices_string'] = Get('chart_indices_string',shown_indices)
        initial['chart_type'] = Get('chart_type','spline')
        initial['show_running_mean'] = Get('show_running_mean','F')
        if app_name in ['monthly_summary', 'seasonal_summary']:
            initial['running_mean_years'] = Get('running_mean_years',5)
        else:
            initial['running_mean_days'] = Get('running_mean_days',9)
        initial['show_average'] = Get('show_average','F')
        if app_name in ['monthly_summary']:
            initial['show_range'] = Get('show_range','F')
    initial['form_options'] = WRCCData.SCENIC_FORM_OPTIONS[app_name]
    return initial