def __make_html_row(self, data_row): """Создает строку HTML с заданными параметрами.""" future_sign = self.config.restore_value(cfg.FUTURE_SIGN_KEY) tomorrow_sign = self.config.restore_value(cfg.TOMORROW_SIGN_KEY) today_sign = self.config.restore_value(cfg.TODAY_SIGN_KEY) yesterday_sign = self.config.restore_value(cfg.YESTERDAY_SIGN_KEY) type_id = data_row[db.EVENT_LIST_CONVERTED_TYPE_ID_FIELD] emodji = data_row[db.EVENT_LIST_CONVERTED_TYPE_EMODJI_FIELD] type_name = data_row[db.EVENT_LIST_CONVERTED_TYPE_NAME_FIELD] event_date = data_row[db.EVENT_LIST_CONVERTED_DATE_FIELD] event_name = data_row[db.EVENT_LIST_CONVERTED_NAME_FIELD] if event_date == tls.shift_date(datetime.now(), 1).date(): time_mark = tomorrow_sign elif event_date == datetime.now().date(): time_mark = today_sign elif event_date == tls.shift_date(datetime.now(), -1).date(): time_mark = yesterday_sign else: time_mark = future_sign html_row = f"<tr><td class='style_{type_id}'>{time_mark} {emodji} {type_name}{const.TYPE_SEPARATOR}{event_date:%d.%m.%Y} {event_name} " if (type_id == db.EVENT_TYPE_MEMORY_DAY) or (type_id == db.EVENT_TYPE_BIRTH_DAY) : html_row += data_row[db.EVENT_LIST_CONVERTED_MESSAGE_FIELD] html_row += "</td></tr>\n" return html_row
def cleanup(self): """Удаляет одноразовые устаревшие события.""" date_passed = tls.shift_date(dt.now(), -2) query = self.session.query(c_event.CEvent.id) query = query.filter(c_event.CEvent.fperiod==const.EVENT_ONE_SHOT, and_(c_event.CEvent.fstatus>STATUS_INACTIVE, and_(c_event.CEvent.fyear<date_passed.year))) past_year = query.all() query = self.session.query(c_event.CEvent.id) query = query.filter(c_event.CEvent.fperiod==const.EVENT_ONE_SHOT, and_(c_event.CEvent.fstatus>STATUS_INACTIVE, and_(c_event.CEvent.fyear==date_passed.year, and_(c_event.CEvent.fmonth<date_passed.month)))) past_month = query.all() query = self.session.query(c_event.CEvent.id) query = query.filter(c_event.CEvent.fperiod==const.EVENT_ONE_SHOT, and_(c_event.CEvent.fstatus>STATUS_INACTIVE, and_(c_event.CEvent.fyear==date_passed.year, and_(c_event.CEvent.fmonth==date_passed.month, and_(c_event.CEvent.fday<=date_passed.day))))) past_days = query.all() full_list = [] full_list.extend(past_year) full_list.extend(past_month) full_list.extend(past_days) for event_id in full_list: event_query = self.session.query(c_event.CEvent).filter_by(id=event_id[0]) event_query.update({c_event.CEvent.fstatus:STATUS_INACTIVE}, synchronize_session = False) self.session.commit()
def get_actual_monthly_events(self): """Возвращает список ежемесячных событий, актуальных в периоде от текущей даты до текущей + период видимости.""" # *** Дата c = текущая дата date_from = tls.shift_date(dt.now().date(), -1) # *** Дата по = Дата с + период видимости date_to = date_from + dtime.timedelta(days=int(self.config.restore_value(c_config.MONITORING_PERIOD_KEY))) # *** Если дата по в следующем месяце if date_to.month != date_from.month: # *** Разделяем период на два отрезка - от текущей даты до конца м-ца last_day = tls.get_months_last_date(date_from) this_month_date_to = dtime.datetime(date_from.year, date_from.month, last_day) # *** И от нач. м-ца до даты по next_month_date_from = this_month_date_to + dtime.timedelta(days=1) # *** Делаем выборку за текущий месяц queried_data1=self.universal_query(date_from.day, 0, 0, this_month_date_to.day, 0, 0, const.EVENT_MONTH_PERIOD) # *** Конвертируем кортеж в список и подставляем текущий месяц и год queried_data1 = self.convert_monthly_tuple(queried_data1, this_month_date_to) # *** Делаем выборку за следующий месяц queried_data2 = self.universal_query(next_month_date_from.day, 0, 0, date_to.day, 0, 0, const.EVENT_MONTH_PERIOD) # *** Конвертируем кортеж в список и подставляем следующий месяц и год queried_data2 = self.convert_monthly_tuple(queried_data2, next_month_date_from) # *** Сливаем выборки queried_data1.extend(queried_data2) return queried_data1 else: # *** Иначе делаем одну выборку queried_data = self.universal_query(date_from.day, 0, 0, date_to.day, 0, 0, const.EVENT_MONTH_PERIOD) # *** Конвертируем кортеж в список и подставляем текущий месяц и год queried_data = self.convert_monthly_tuple(queried_data, date_from) return queried_data
def convert_yearly_tuple(self, pevent_super_tuple, pnew_date): """Конвертирует кортеж в список, подставляя значения года и месяца из даты.""" event_super_list = [] # *** Перебираем события в списке for event_tuple in pevent_super_tuple: event_list = list(event_tuple) # *** Вычислим возраст события event_age = dt.now().year - event_list[EVENT_LIST_YEAR_FIELD] one_digit = event_age % 10 message = "" # *** Поменяем год в списке на текущий event_list[EVENT_LIST_YEAR_FIELD] = pnew_date.year if event_list[EVENT_LIST_TYPE_ID_FIELD] == EVENT_TYPE_MEMORY_DAY: # *** Для дня памяти всё просто... message = f"({event_age}-я годовщина)" elif event_list[EVENT_LIST_TYPE_ID_FIELD] == EVENT_TYPE_BIRTH_DAY: # *** Для дня рождения всё сложнее... if (one_digit == 0) or (one_digit >= 5): message = f"({event_age} лет)" elif one_digit == 1: message = f"({event_age} год)" elif (one_digit >= 2) or (one_digit <= 4): message = f"({event_age} года)" # *** Собираем дату события из года, месяца и дня event_date = dtime.date(event_list[EVENT_LIST_YEAR_FIELD], event_list[EVENT_LIST_MONTH_FIELD], event_list[EVENT_LIST_DAY_FIELD]) # *** Если дата совпадает с сегодняшней или вчерашней - заменяем цвет. if event_date == dt.now(): event_list[EVENT_LIST_TYPE_COLOR_FIELD] = self.config.restore_value(c_config.TODAY_COLOR_KEY) if event_date == tls.shift_date(dt.now(), -1): event_list[EVENT_LIST_TYPE_COLOR_FIELD] = self.config.restore_value(c_config.YESTERDAY_COLOR_KEY) # *** Удаляем из списка год, месяц и день event_list.pop(EVENT_LIST_YEAR_FIELD) event_list.pop(EVENT_LIST_MONTH_FIELD) event_list.pop(EVENT_LIST_DAY_FIELD) # *** Добавляем дату и сообщение event_list.append(event_date) event_list.append(message) # *** Закидываем событие в список событий event_super_list.append(event_list) return event_super_list
def get_actual_yearly_events(self): """Возвращает список ежегодных событий, актуальных в периоде от текущей даты до текущей + период видимости.""" # *** Дата с.. date_from = tls.shift_date(dt.now().date(), -1) # *** Дата по.. date_to = date_from + dtime.timedelta(days=int(self.config.restore_value(c_config.MONITORING_PERIOD_KEY))) # *** Если дата по в следующем году if date_to.year != date_from.year: # *** То разделяем период на два отрезка - от текущей даты до конца года last_day = tls.get_years_last_date(date_from) this_year_date_to = dtime.datetime(date_from.year, date_from.month, last_day) # и от нач. года до даты по next_year_date_from = this_year_date_to + dtime.timedelta(days=1) # *** делаем две выборки queried_data1=self.universal_query(date_from.day, date_from.month, 0, this_year_date_to.day, this_year_date_to.month, 0, const.EVENT_YEAR_PERIOD) # *** Конвертируем кортеж в список и подставляем текущий год queried_data1 = self.convert_yearly_tuple(queried_data1, this_year_date_to) # Вторая выборка queried_data2=self.universal_query(next_year_date_from.day, next_year_date_from.month, 0, date_to.day, date_to.month, 0, const.EVENT_YEAR_PERIOD) # *** Конвертируем кортеж в список и подставляем следующий год queried_data2 = self.convert_yearly_tuple(queried_data2, next_year_date_from) # *** Сливаем обе выборки queried_data1.extend(queried_data2) return queried_data1 # *** Если дата по в следующем месяце if date_to.month != date_from.month: # *** Разделяем период на два отрезка - от текущей даты до конца м-ца last_day = tls.get_months_last_date(date_from) this_month_date_to = dtime.datetime(date_from.year, date_from.month, last_day) # *** И от нач. м-ца до даты по next_month_date_from = this_month_date_to + dtime.timedelta(days=1) queried_data1 = self.universal_query(date_from.day, date_from.month, 0, this_month_date_to.day, this_month_date_to.month, 0, const.EVENT_YEAR_PERIOD) queried_data1 = self.convert_yearly_tuple(queried_data1, date_from) queried_data2 = self.universal_query(next_month_date_from.day, next_month_date_from.month, 0, date_to.day, date_to.month, 0, const.EVENT_YEAR_PERIOD) queried_data2 = self.convert_yearly_tuple(queried_data2, next_month_date_from) queried_data1.extend(queried_data2) return queried_data1 queried_data=self.universal_query(date_from.day, date_from.month, 0, date_to.day, date_to.month, 0, const.EVENT_YEAR_PERIOD) queried_data = self.convert_yearly_tuple(queried_data, date_from) return queried_data
def get_actual_one_shot_events(self): """Возвращает список одноразовых событий, актуальных в периоде от текущей даты до текущей + период видимости.""" # *** Дата с.. date_from = tls.shift_date(dt.now().date(), -1) # *** Дата по.. date_to = date_from + dtime.timedelta(days=int(self.config.restore_value(c_config.MONITORING_PERIOD_KEY))) # *** Если дата по в следующем году разделяем период на два отрезка - от текущей даты до конца года if date_to.year != date_from.year: last_day = tls.get_years_last_date(date_from) this_year_date_to = dtime.datetime(date_from.year, date_from.month, last_day) # *** И от нач. года до даты по next_year_date_from = this_year_date_to + dtime.timedelta(days=1) queried_data1 = self.universal_query(date_from.day, date_from.month, date_from.year, this_year_date_to.day, this_year_date_to.month, this_year_date_to.year, const.EVENT_YEAR_PERIOD) queried_data1 = self.convert_one_shot_tuple(queried_data1) # Вторая выборка queried_data2 = self.universal_query(next_year_date_from.day, next_year_date_from.month, next_year_date_from.year, date_to.day, date_to.month, date_to.year, const.EVENT_YEAR_PERIOD) queried_data2 = self.convert_one_shot_tuple(queried_data2) # *** Сливаем обе выборки queried_data1.extend(queried_data2) return queried_data1 if date_to.month != date_from.month: # *** Разделяем период на два отрезка - от текущей даты до конца м-ца last_day = tls.get_months_last_date(date_from) this_month_date_to = dtime.datetime(date_from.year, date_from.month, last_day) next_month_date_from = this_month_date_to + dtime.timedelta(days=1) queried_data1 = self.universal_query(date_from.day, date_from.month, date_from.year, this_month_date_to.day, this_month_date_to.month, this_month_date_to.year, const.EVENT_ONE_SHOT) queried_data1 = self.convert_yearly_tuple(queried_data1, date_from) # *** И от нач. м-ца до даты по queried_data2 = self.universal_query(next_month_date_from.day, next_month_date_from.month, next_month_date_from.year, date_to.day, date_to.month, date_to.year, const.EVENT_ONE_SHOT) queried_data2 = self.convert_yearly_tuple(queried_data2, next_month_date_from) queried_data1.extend(queried_data2) return queried_data1 queried_data=self.universal_query(date_from.day, date_from.month, date_from.year, date_to.day, date_to.month, date_to.year, const.EVENT_ONE_SHOT) queried_data = self.convert_yearly_tuple(queried_data, date_from) return queried_data
def convert_one_shot_tuple(self, pevent_super_tuple): """Конвертирует кортеж в список, подставляя значения года и месяца из даты.""" event_super_list = [] for event_tuple in pevent_super_tuple: event_list = list(event_tuple) event_date = dtime.date(event_list[EVENT_LIST_YEAR_FIELD], event_list[EVENT_LIST_MONTH_FIELD], event_list[EVENT_LIST_DAY_FIELD]) # *** Если дата совпадает с сегодняшней или вчерашней - заменяем цвет. if event_date == dt.now(): event_list[EVENT_LIST_TYPE_COLOR_FIELD] = self.config.restore_value(c_config.TODAY_COLOR_KEY) if event_date == tls.shift_date(dt.now(), -1): event_list[EVENT_LIST_TYPE_COLOR_FIELD] = self.config.restore_value(c_config.YESTERDAY_COLOR_KEY) event_list.pop(EVENT_LIST_YEAR_FIELD) event_list.pop(EVENT_LIST_MONTH_FIELD) event_list.pop(EVENT_LIST_DAY_FIELD) event_list.append(event_date) event_list.append("") event_super_list.append(event_list) return event_super_list