7 дек. 2009 г.

Мороз. Можно в школу не ходить?

Вчера сын не учился - из-за низкой температуры занятия для младших классов отменили. Я не слушаю радио, а в интернете информацию по данному вопросу мне найти не удалось. Дмитрий говорил, что ему нужна подобная функциональность на вИшиме.ру.
В итоге, из за всех этих факторов, а также нездорового любопытства, за пол часа наклепал ерунду, которой можно пользоваться для проверки сабжа.
Данные берутся из гисметео (только Тюмень), а правила отмены занятий взяты из статьи http://www.t-i.ru/article/8745/. Скрипт простой как мычание:

# -*- coding: utf-8 -*-

from django.shortcuts import render_to_response

from django.template import RequestContext

from django.utils import http

from datetime import datetime

import xml.etree.ElementTree as ET



def average(numbers):

    return sum(numbers) / len(numbers)



class Forecast(object):

    datetime = datetime(2009, 12, 7, 20)

    pressure_max = pressure_min = temperature_max = temperature_min = wind_max = \

    wind_direction = wind_min = relwet_max = relwet_min = heat_max = \

    heat_min = 0

    def avg(self):

        return average([self.temperature_max, self.temperature_min]), \

            average([self.wind_max, self.wind_min])

    def npu_1_4(self):

        '''

        Занятия для учеников 1-4-х классов отменяются, если температура воздуха

        опускается до -30 С и ниже при скорости ветра менее 2 метров в секунду.

        При скорости ветра 2 метра в секунду и более занятия отменяют уже при

        -25 градусах.

        '''


        avg_temp, avg_wind = self.avg()

        return (avg_wind >= 2 and avg_temp <= -25) or (avg_wind < 2 and avg_temp <= -30)



    def npu_1_9(self):

        '''

        Школьники 1-9-х классов могут остаться дома, если столбик термометра

        показывает -35 градусов и ниже, при этом скорость ветра должна быть

        менее 2 метров в секунду. А при большей его скорости занятия для

        учеников отменяются и при температуре -30 и ниже.

        '''


        avg_temp, avg_wind = self.avg()

        return (avg_wind >= 2 and avg_temp <= -30) or (avg_wind < 2 and avg_temp <= -35)

    def npu(self):

        '''

        Занятия отменяются по всей школе (1-11-е классы) при температуре

        наружного воздуха -40 градусов и ниже (при этом скорость ветра не должна

        превышать 2 метров в секунду).

        ??? превышать ??? - наверное, должна быть не меньше.

        '''


        avg_temp, avg_wind = self.avg()

        return (avg_wind >= 2 and avg_temp <= -40)



def index(request):

    h = http.urllib.urlopen('http://informer.gismeteo.ru/xml/28367_1.xml')

    xml = h.read()

    tree = ET.XML(xml)

    res = []

    for f in tree.getiterator('FORECAST'):

        obj = Forecast()

        obj.date = datetime(

            int(f.get('year')), int(f.get('month')), int(f.get('day')),

            int(f.get('hour'))

        )

        for x in f.getchildren():

            for y in x.items():

                setattr(obj, str(x.tag.lower())+'_'+y[0], int(y[1]))

        res.append(obj)

    output = {

        'res': res,

    }

    return render_to_response('index.html', output, context_instance=RequestContext(request))



Посмотреть результат можно тут: school.concepter.ru. Он не причесан и не информативен, но с функцией справляется – если занятий нет, он напишет.

UPD. Спасибо Земе за ликбез.

UPD2: Нужно смотреть не температуру (temperature_min и temperature_max), а температуру комфорта (heat_min и heat_max) – отменяют по ней.

6 комментариев:

  1. А вчера разве было -25 и меньше?

    ОтветитьУдалить
  2. Очевидно да, раз дети не учились.

    ОтветитьУдалить
  3. Ты был не выспавшийся когда писал эту штуку?

    Конструкции типа
    if condition: return True
    мне чем-то напоминают http://bash.org.ru/quote/66390

    return condition :)

    ОтветитьУдалить
  4. Ахаха, забавно. Да, ты прав. Щас поправлю.

    ОтветитьУдалить
  5. 08.12.2009, 23 часов.
    Занятия состоятся для всех классов.

    не хотят дети учиться так поздно, если честно.

    ОтветитьУдалить
  6. :)))). Да-да, об этом я как-то не подумал...
    Сейчас поправлю.

    ОтветитьУдалить