#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
from datetime import datetime
from time import strftime
import calendar
import smtplib
from email.MIMEText import MIMEText
import sqlite3
from_letter = 'workcontrol@yandex.ru' #от кого (учетная запись должна существовать

)
to_letter = 'nachalnic@gmail.com' #кому (учетная запись должна существовать

)
subject_letter = 'Я (Петя Опоздалкин) к вам пишу – чего же боле? Что я могу еще сказать? Теперь, я знаю, в вашей воле меня презреньем наказать.' #тема
server = "213.180.204.38" #smtp-сервер (этот для яндекса)
port = 25
user_name = "workcontrol" #логин
user_passwd = "************" #пароль
'Выборка из базы для отображения данных'
conn = sqlite3.connect('work_control_database')
cur = conn.cursor()
year = strftime("%Y")
month = strftime("%m")
reason = False
cur.execute("select time_delay from workcontroltable where year=? and month=? and valid_reason=?", (year, month, reason))
reason_value = 0
number_delays = 0
for row in cur:
number_delays += 1
reason_value += row[0]
reason_value_h = reason_value/60
reason_value_m = reason_value - (reason_value_h*60)
reason_value = str(reason_value_h) + ':' + str(reason_value_m)
'Проверка включался ли компьютер сегодня'
day = strftime("%d")
cur.execute("select time_delay from workcontroltable where year=? and month=? and day=?", (year, month, day))
for row in cur:
quit()
conn.close()
'Запись в базу если НЕ опоздал (для перезагрузки в любое время)'
def log_in_database():
valid_reason_data = None
conn = sqlite3.connect('work_control_database')
cur = conn.cursor()
data = [(strftime("%Y"), strftime("%m"), strftime("%d"), None, None, valid_reason_data)]
conn.executemany("insert into workcontroltable (year, month, day, time_delay, reason_delays, valid_reason) values(?, ?, ?, ?, ?, ?)", data)
conn.commit()
conn.close()
quit()
'Проверка и отправка сообщения (объяснительной), запись в базу'
def wakeup(widget, event):
if event.state & gtk.gdk.CONTROL_MASK and event.keyval == 115 or event.state & gtk.gdk.CONTROL_MASK and event.keyval == 1753:
clipboard = gtk.Clipboard(display=gtk.gdk.display_get_default(), selection="CLIPBOARD") #копируем введённые данные в буфер
start, end = buffer_data.get_bounds()
buffer_data.select_range(start, end)
ptext=text_data.get_buffer().copy_clipboard(clipboard)
ptext=clipboard.wait_for_text()
clipboard.store()
ptext = ptext.decode('utf-8')
chars = len(ptext) #получаем количество символов
space = ptext.count(' ') #ищем все пробелы
chars = chars - space #текст без пробелов
if chars >= 150: #если символов больше или равно 150
time_delay_data = ((int(strftime("%H")) - 9)*60) + int(strftime("%M")) #время на которое опоздали (отсчет от 9:00)
if chbutton.get_active():
valid_reason_data = True
else:
valid_reason_data = False
conn = sqlite3.connect('work_control_database')
cur = conn.cursor()
data = [(strftime("%Y"), strftime("%m"), strftime("%d"), time_delay_data, ptext, valid_reason_data)]
conn.executemany("insert into workcontroltable (year, month, day, time_delay, reason_delays, valid_reason) values(?, ?, ?, ?, ?, ?)", data)
conn.commit()
conn.close()
try:
message = MIMEText(ptext, "", "utf-8")
message['Subject'] = subject_letter
message['From'] = from_letter
message['To'] = to_letter
s = smtplib.SMTP(server, port,timeout = 5)
s.starttls()
s.login(user_name, user_passwd)
s.sendmail(from_letter, to_letter, message.as_string()) #отправляем
s.quit()
except:
pass
quit()
else: #иначе показываем пользователю сообщение
dialog = gtk.MessageDialog(parent=None, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_NONE, message_format='\n\nСлишком мало букв. \nПиши ещё. \nНажми Esc.')
dialog.show()
'Ежемесячный отчёт. Выполняется в последний день месяца.'
def report_month():
report = 'Отчёт за месяц\n'+'--------------------------------------------------'+'\n'
for i in range(2):
if i==0:
reason = False
decl = ' (не уваж. причина)\n'
else:
reason = True
decl = ' (уваж. причина)\n'
conn = sqlite3.connect('work_control_database')
cur = conn.cursor()
report_year = strftime("%Y")
report_month = strftime("%m")
cur.execute("select * from workcontroltable where year=? and month=? and valid_reason=?", (report_year, report_month, reason))
report_reason_value_summ = 0
report_number_delays = 0
report_string_reason = 'Дата: На сколько опоздал:\n'
for row in cur:
report_number_delays += 1
report_reason_value_summ += row[3]
report_reason_value = row[3]
report_reason_value_h = report_reason_value/60
report_reason_value_m = report_reason_value - (report_reason_value_h*60)
report_reason_value = str(report_reason_value_h) + ':' + str(report_reason_value_m)
report_string_reason += str(row[0])+ '.' + str(row[1])+ '.' + str(row[2])+ ' ' + str(report_reason_value) + ' чч.мм\n'
report_string_reason += 'Опозданий в этом месяце: ' + str(report_number_delays) + decl
report_reason_value_h_summ = report_reason_value_summ/60
report_reason_value_m_summ = report_reason_value_summ - (report_reason_value_h_summ*60)
report_reason_value_summ = str(report_reason_value_h_summ) + ':' + str(report_reason_value_m_summ)
report_string_reason += '\nСуммарное время опозданий в этом месяце: ' + str(report_reason_value_summ) + decl
report = report + report_string_reason +'\n'+ '--------------------------------------------------'+'\n'
conn.close()
report_month_mail(report)
def report_month_mail(report):
try:
subject_letter = 'Отчёт по опозданиям за месяц'
message = MIMEText(report, "", "utf-8")
message['Subject'] = subject_letter
message['From'] = from_letter
message['To'] = to_letter
s = smtplib.SMTP(server, port,timeout = 5)
s.starttls()
s.login(user_name, user_passwd)
s.sendmail(from_letter, to_letter, message.as_string()) #отправляем
s.quit()
except:
pass
quit()
w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.set_position(gtk.WIN_POS_CENTER)
w.fullscreen()
w.set_size_request(800, 600)
w.set_border_width(5)
w.add_events(gtk.gdk.KEY_PRESS_MASK)
w.connect("key-press-event", wakeup)
w.connect("destroy", quit)
w.set_title('')
time = '<span font_desc="Sans 20"> <b>' + strftime("%H") + ':' + strftime("%M") + '</b> </span>' #время входа
label_time = gtk.Label()
label_time.set_markup(time)
label_time.show()
label_why = gtk.Label('Вы видите данное окно из-за опоздания на работу.\n\
Пожалуйста заполните форму ниже и нажмите Ctrl+S. Спасибо.\n'\
+ 'Опозданий в этом месяце: ' + str(number_delays) + '\n'\
+ 'Суммарное время опозданий в этом месяце: ' + str(reason_value) + ' (чч.мм)')
label_why.show()
text_data = gtk.TextView()
buffer_data = text_data.get_buffer()
text_data.set_editable(True)
text_data.set_justification(gtk.JUSTIFY_LEFT)
text_data.set_wrap_mode(gtk.WRAP_WORD_CHAR)
text_data.show()
chbutton = gtk.CheckButton('Уважительная причина')
chbutton.show()
t = gtk.Table(10, 10, homogeneous=True)
t.attach(label_why, 0, 9, 0, 1)
t.attach(label_time, 9, 10, 0, 1)
t.attach(chbutton, 2, 10, 1, 2)
t.attach(text_data, 0, 10, 2, 10)
t.show()
w.add(t)
w.show()
'запуск месячной отчётности в последний день месяца'
number_days_month = calendar.monthrange(int(strftime("%Y")), int(strftime("%m")))
if number_days_month[1] == int(strftime("%d")):
report_month()
#условие запуска скрипта (если днём надо перезагрузиться скрипт не будет работать)
if 11 >= int(strftime("%H")) >= 9 and int(strftime("%M")) >= 5: #если час прихода 9-11 и минуты больше или равны 5 (9:05-11:05)
gtk.main() #запускаем скрипт
else:
log_in_database()
#gtk.main()