def climate(request, current_tab): pn, pv = [], [] return call_template( request, param_names = pn, param_vals = pv, current_tab=current_tab )
def home(request): pn, pv = [], [] return call_template( request, param_names = pn, param_vals = pv, templ_path = 'base/index.html' )
def events(request): """ Вывод событий последних двух недель на вкладку События. При нажатии на кнопку все еще не ассоциированные с данной сессией браузера события добавятся в таблицу events_event_session_keys и будут считаться просмотренными. :param request: django request """ return call_template(request, {'active_app_name': 'events', 'events_list': get_events(14)})
def sidebar(request): pn, pv = [], [] pn.append('forecast_sidebar') pv.append(position_nearest_forecast()) return call_template( request, param_names = pn, param_vals = pv, templ_path = 'base/sidebar.html' )
def home(request): """ Контроллер для вывода Главной страницы :param request: django request """ plans = [(p.id, p.image, p.description) for p in Plan.objects.filter(is_shown=True)] params = {'active_app_name': 'home', 'house_plans': plans, } if len(plans): params['width_plans'] = 100 / len(plans) return call_template(request, params)
def set_viewed_events(request): two_week_events = get_events(14) request.session.save() current_session = request.session.session_key if two_week_events.count(): new_events = two_week_events.exclude(session_keys__session_key=current_session) if new_events.count(): so = Session.objects.get(pk=current_session) for event in new_events: try: event.session_keys.add(so) except IntegrityError: continue return call_template(request, {})
def positioned(request, plan_id=1): """ Контроллер для ajax-запроса обновления информации на Главной странице. Получаем список приложений, для которых создан позиционный виджет (т.е. поле is_widget=True). :param request: django request """ # Получаем данные с виджетов приложений widget_apps = get_widget_plugin_names('positioned') params = widgets_data(request, widget_apps, widget_type='positioned', plan_id=int(plan_id)) return call_template( request, params, templ_path='home/positioned.html' )
def weather(request): global bg_styles params = {} forecast = [] # Получаем все модели плагинов типа 'Forecast' forecasts = get_used_plugins_by(plugin_type='Forecast') # Если хотябы один прогнозный API добавлен, собираем список данных для передачи в шаблон. if forecasts: fields = WeatherValue._meta.fields for wp in forecasts: # wp - от Weather Provider forecast_times = list_field_values(wp, 'datetime') if not forecast_times: # Если нет ни одной записи о времени прогноза погоды, считаем, continue # что нет данных для данного прогнозного API и пропускаем данную итерацию. bg_styles = get_bg_styles(forecast_times) # Получаем кортеж названий классов css values = [] for field_i in fields[3:-3]: field_values = [field_i.name, field_i.verbose_name, field_i.help_text] if field_i.name == 'datetime': field_values.append(zip(forecast_times, bg_styles)) elif field_i.name == 'clouds': field_values.append(get_clouds(wp)) elif field_i.name == 'precipitation': field_values.append(get_precipitation(wp)) elif field_i.name == 'wind_speed': field_values.append(get_wind(wp)) else: field_values.append(zip(list_field_values(wp, field_i.name), bg_styles)) values.append(field_values) site = wp.get_url().split('/')[2].split('.') forecast.append((site[-2] + '.' + site[-1], values, wp.city)) params = {'active_app_name': 'weather', 'forecast': forecast} return call_template(request, params)
def climate(request): """ Функция вывода необходимых вкладке Климат данных с климатических датчиков, названий единиц измерения, название вкладки и пр. :param request: django request """ charts = [] # Данные для графиков температуры и влажности th_sensors = get_used_plugins_by(plugin_type='TempHumidSensor') if th_sensors: temps = get_climate_data(th_sensors, TempHumidValue, 'temperature') humids = get_climate_data(th_sensors, TempHumidValue, 'humidity') if temps: charts.append(('temp_div', 'температуры', '°C', temps)) if humids: charts.append(('hum_div', 'влажности', '%', humids)) # Данные для графика атмосферного давления p_sensors = get_used_plugins_by(plugin_type='PressureSensor') if p_sensors: pressures = get_climate_data(p_sensors, PressureValue, 'pressure') if pressures: charts.append(('press_div', 'атмосферного давления', 'мм рт.ст.', pressures)) # Данные для графиков освещенности al_sensors = get_used_plugins_by(plugin_type='AmbientLightSensor') if al_sensors: ambient_lights = get_climate_data(al_sensors, AmbientLightValue, 'ambient_light') if ambient_lights: charts.append(('ambl_div', 'освещенности', 'лк', ambient_lights)) # Данные для графиков выпадения осадков rd_sensors = get_used_plugins_by(plugin_type='RaindropSensor') if rd_sensors: raindrops = get_climate_data(rd_sensors, RaindropValue, 'raindrop') if raindrops: charts.append(('rd_div', 'выпадения осадков', 'ед', raindrops)) params = {'active_app_name': 'climate', 'charts': charts} return call_template(request, params)
def tiled(request): """ Контроллер для ajax-запроса обновления информации на Главной странице. Получаем список приложений, для которых создан плиточный виджет (т.е. поле is_widget=True). :param request: django request """ # Получаем данные с виджетов приложений apps = Application.objects.filter(is_widget=1).values_list('name', flat=True) plugins = get_widget_plugin_names('tiled') widget_apps = list(apps) + plugins params = widgets_data(request, widget_apps, widget_type='tiled') return call_template( request, params, templ_path='home/tiled.html' )
def events(request): """ Вывод событий последних days дней на вкладку События. При нажатии на кнопку все еще не ассоциированные с данной сессией браузера события добавятся в таблицу events_event_session_keys и будут считаться просмотренными. :param request: django request """ days = 14 params = {"active_app_name": "events", "events_list": get_events(days), "alerts": ALERTS} request.session.save() current_session = request.session.session_key new_events = Event.objects.all().exclude(session_keys__session_key=current_session) for event in new_events: event.session_keys.add(Session.objects.get(pk=current_session)) return call_template(request, params)
def slideshow(request): pn, pv = [], [] pn.append('album') pn.append('slide') pn.append('slide_width') pn.append('slide_height') path_to_imgs = '%s%simg/slideshow' % (BASE_DIR.replace('\\', '/'), STATIC_URL) try: latest_id = Slideshow.objects.latest('id').id try: rnd_id = randint(1, latest_id) rnd_album = unicode(Slideshow.objects.get(id=rnd_id).album_path) for root, dirs, files in walk(rnd_album): rnd_file = randint(0, len(files) - 1) slide = '%s/%s' % (rnd_album.replace(path_to_imgs, ''), files[rnd_file]) img_file = Image.open('%s\%s' % (rnd_album.replace('/', '\\'), files[rnd_file])) slide_width, slide_height = img_file.size pv.append(rnd_album.split('/')[-1]) pv.append(slide) pv.append(slide_width) pv.append(slide_height) except IndexError: print 'rnd_id:', rnd_id print 'rnd_file:', rnd_file except Slideshow.DoesNotExist: pv.append('n/a') pv.append('n/a') return call_template( request, param_names = pn, param_vals = pv, templ_path = 'home/slideshow.html' )
def weather(request, current_tab): pn, pv = [], [] def list_field_values(wp, field): """ Функция получения данных из базы для определенного прогнозного API и указанного поля На входе: - название прогнозного api из Servus.Servus, например 'rp5' - поле таблицы базы данных, например 'clouds' На выходе: список даанных указанного поля """ return Weather.objects.filter(weather_provider=wp).values_list(field, flat=True) def get_field_data(wp, field, measure): """ Базовая функция, возвращающая набор данных в определенном порядке для шаблона weather/tab.html На входе: - название прогнозного api из Servus.Servus, например 'rp5' - поле таблицы базы данных, например 'temperature' - еденица измерения На выходе: кортеж, вида (<имя поля>, <описание>, <ед. измерения>, [(список значений поля])) """ return (field.name, field.verbose_name, measure, list_field_values(wp, field.name)) def get_forecast_time(wp): """ Функция, возвращающая кортеж с данными о времени для определенного погодного API. На входе: название прогнозного api из Servus.Servus, например 'owm' На выходе: кортеж, вида (<день недели>, <день> <месяц>, <час:00>) """ forecast_times = [] for forecast_time in list_field_values(wp, "datetime"): forecast_times.append( ( get_weekday(forecast_time.weekday()), "%s %s" % ((forecast_time.day), get_month(forecast_time.month)), "%s:00" % str(forecast_time.hour), ) ) return forecast_times def get_clouds(wp): """ Функция, возвращающая кортеж с данными об обланчости, включая название соответствующего облачности файл PNG. На входе: название прогнозного api из Servus.Servus, например 'ya' На выходе: кортеж, вида (<файл png>, <облачность в %> <описание>, <время суток>) , где <время суток> - 'd' или 'n' (соответсвенно день, или ночь), используется для затемнения "ночных" ячеек таблицы. """ clouds_data = [] clouds = list_field_values(wp, "clouds") for num, clouds_img in enumerate(list_field_values(wp, "clouds_img")): if clouds_img != "na": clouds_data.append((clouds_img + ".png", clouds[num], CLOUDS_RANGE[clouds_img[2]], clouds_img[1])) else: clouds_data.append((clouds_img + ".png", clouds[num], CLOUDS_RANGE[clouds_img], "d")) return clouds_data def get_precipitation(wp): """ Функция, возвращающая кортеж с данными об осадках, включая название соответствующего количеству осадков файл PNG. На входе: название прогнозного api из Servus.Servus, например 'wua' На выходе: кортеж, вида (<файл png>, <количество выпавших осадков в мм>, <описание>, <время суток>) , где <время суток> - 'd' или 'n' (соответсвенно день, или ночь), используется для затемнения "ночных" ячеек таблицы. """ precipitation_data = [] precipitation = list_field_values(wp, "precipitation") clouds_img = list_field_values(wp, "clouds_img") for num, falls_img in enumerate(list_field_values(wp, "falls_img")): if falls_img != "na": precipitation_data.append( (falls_img + ".png", precipitation[num], FALLS_RANGE[falls_img], clouds_img[num][1]) ) else: precipitation_data.append((falls_img + ".png", precipitation[num], FALLS_RANGE[falls_img], "d")) return precipitation_data def get_wind(wp): """ Функция, возвращающая кортеж с данными о ветре для определенного погодного API. На входе: название прогнозного api из Servus.Servus, например 'owm' На выходе: кортеж, вида (<скорость ветра>, <направление ветра в градусах>) """ wind_data = [] wind_speed = list_field_values(wp, "wind_speed") for num, wind_direction in enumerate(list_field_values(wp, "wind_direction")): wind_data.append((wind_speed[num], wind_direction)) return wind_data forecast = [] fields = Weather._meta.fields if WEATHER_PROVIDERS: # Если хотябы один прогнозный API активирован, собираем список данных для передачи в шаблон. for wp in WEATHER_PROVIDERS: value_set = [] for field in fields[2:-3]: if field.name == "datetime": value_set.append((field.name, field.verbose_name, "", get_forecast_time(wp))) elif field.name == "clouds": value_set.append((field.name, field.verbose_name, "", get_clouds(wp))) elif field.name == "precipitation": value_set.append((field.name, field.verbose_name, "", get_precipitation(wp))) elif field.name == "temperature": value_set.append(get_field_data(wp, field, "°C")) elif field.name == "pressure": value_set.append(get_field_data(wp, field, "мм рт. ст.")) elif field.name == "humidity": value_set.append(get_field_data(wp, field, "%")) elif field.name == "wind_speed": value_set.append((field.name, field.verbose_name, "м/c", get_wind(wp))) forecast.append((WEATHER_PROVIDERS[wp], value_set)) pn.append("forecast") pv.append(forecast) return call_template(request, param_names=pn, param_vals=pv, current_tab=current_tab)