Exemple #1
0
def climate(request, current_tab): 
    pn, pv = [], []

    return call_template(
        request,
        param_names = pn,
        param_vals = pv,
        current_tab=current_tab
    )
Exemple #2
0
def home(request):   
    pn, pv = [], []
    
    return call_template(
        request,
        param_names = pn,
        param_vals = pv,
        templ_path = 'base/index.html'
    )
Exemple #3
0
def events(request):
    """
    Вывод событий последних двух недель на вкладку События. При нажатии на кнопку все еще не
    ассоциированные с данной сессией браузера события добавятся в таблицу events_event_session_keys
    и будут считаться просмотренными.

    :param request: django request
    """

    return call_template(request, {'active_app_name': 'events', 'events_list': get_events(14)})
Exemple #4
0
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'
    )
Exemple #5
0
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)
Exemple #6
0
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, {})
Exemple #7
0
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'
    )
Exemple #8
0
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)
Exemple #9
0
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)
Exemple #10
0
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'
    )
Exemple #11
0
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)
Exemple #12
0
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'
    )
Exemple #13
0
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)