30 банковских дней

Делал жене программу, чтобы отсчитывать от введёной даты 30 банковских дней в текущем году, может пригодится кому (в запускаемый файл преобразовал при помощи PyInstaller, получается один файл, очень удобно). При первом запуске программа скачивает календарь с сайта Calend.Ru и сохраняет рядом, потом берёт из него выходные и праздничные дни.
# coding: utf-8
import re
import httplib
import pickle
import ctypes
from datetime import date, datetime, timedelta

MB_OKCANCEL = 1
MB_SYSTEMMODAL = 4096
IDOK = 1
IDCANCEL = 2

def getCalend():
    h = httplib.HTTPConnection('www.calend.ru')
    h.request('GET', '/work/')
    return h.getresponse().read()

def getHolidays():
    table = re.findall(r'<table\s.+?time_of_death(.+)</table>', getCalend(), re.DOTALL)[0]
    return re.findall(r'<td\s+class="\S+\s+col5"\s+day="(\d+)"\s+month="(\d+)"', table, re.DOTALL)

def readHolidays():
    year = str(date.today().year)
    try:
        with open(year + '.cache', 'r') as f:
            holidays = pickle.load(f)
    except IOError:
        with open(year + '.cache', 'w') as f:
            holidays = tuple(getHolidays())
            pickle.dump(holidays, f)

    return [datetime(day=int(d[0]), month=int(d[1]), year=int(year)) for d in holidays]

def getStartDate():
    while 1:
        input = re.split(r'\D', raw_input("Enter start date (dd.mm): "))
        try:
            input = [int(x) for x in input]
            if len(input) == 2:
                break
        except ValueError:
            pass

    return (date.today().year, input[1], input[0])

delta = timedelta(days = 1)

holidays = readHolidays()
msgbox = ctypes.windll.user32.MessageBoxW

while 1:
    try:
        date = datetime(*getStartDate())

        for i in xrange(0, 30):
            while 1:
                date += delta

                if date not in holidays: break

	if msgbox(
            0,
            u'Получилась следующая дата: %02d.%02d.%04d' % (date.day, date.month, date.year),
            u'Ответ',
            MB_OKCANCEL | MB_SYSTEMMODAL
        ) == IDCANCEL:
		raise StopIteration
    except (KeyboardInterrupt, StopIteration):
        break
Программу написал быстро, а сложнее всего было её отправить — ГМэйл упорно не принимает запускаемые файлы, даже в архивах.
2 апреля 2013 10:51

Игорь (инкогнито)
2 апреля 2013, 11:28

Сжатые rar вроде бы gmail пропускает.

Евгений Степанищев (bolknote.ru)
2 апреля 2013, 11:29, ответ предназначен Игорь

Да? Я с паролем сжал просто.

Михаил Калашник (splurov.livejournal.com)
2 апреля 2013, 11:41

А вы с женой дропбоксом с зашареной папкой не пользуетесь? Очень удобно :)

librarian (инкогнито)
2 апреля 2013, 11:42, ответ предназначен Евгений Степанищев (bolknote.ru):

Я делал zip.7z

Евгений Степанищев (bolknote.ru)
2 апреля 2013, 11:50, ответ предназначен Михаил Калашник (splurov.livejournal.com):

А вы с женой дропбоксом с зашареной папкой не пользуетесь? Очень удобно :)
Да кто ей на работе позволит дропбокс подключить к рабочему компу?

Алексей (инкогнито)
2 апреля 2013, 13:31

gitHub :)

Евгений Степанищев (bolknote.ru)
2 апреля 2013, 13:38, ответ предназначен Алексей

Т.е. дропбокс нельзя, а гит ставить можно? :)

hshhhhh (hshhhhh.name)
2 апреля 2013, 15:36, ответ предназначен Евгений Степанищев (bolknote.ru):

Т.е. дропбокс нельзя, а гит ставить можно? :)
Ну с гитхаба можно было и просто так скачать через браузер :)

Евгений Степанищев (bolknote.ru)
2 апреля 2013, 15:38, ответ предназначен hshhhhh (hshhhhh.name):

У неё там странно всё, никогда не знаешь какой ресурс доступен, а почта точно доступна :)

nazikus (инкогнито)
2 апреля 2013, 18:13, ответ предназначен Евгений Степанищев (bolknote.ru):

а сложнее всего было её отправить — ГМэйл упорно не принимает запускаемые файлы, даже в архивах.
Поменяйте расширение на .txt

Евгений Степанищев (bolknote.ru)
2 апреля 2013, 19:07, ответ предназначен nazikus

Я уже плохо помню Винду, но, кажется, она сопротивляется теперь, когда пытаешься файл в exe переименовать. Может, путаю, конечно.

Евгений Степанищев (bolknote.ru)
2 апреля 2013, 19:08, ответ предназначен nazikus

Я давно отправил уже, архив с паролем сделал.

Vlad528 (инкогнито)
2 апреля 2013, 23:39

win7 в стоке не сопротивляется переименованию.
ранние версии думаю тем более.

vladon (vladon.ru)
3 апреля 2013, 09:17

Я отправлю гуглом в 7z.

А как решил вопрос с татарстанскими праздниками? Которые в РТ не банковские дни, а в РФ - банковские?

Евгений Степанищев (bolknote.ru)
3 апреля 2013, 10:19, ответ предназначен vladon (vladon.ru):

А я что-то про них и не подумал, надо у жены спросить :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)