def post(self, *args, **kwargs): if not super(CopyFromDefault, self).post(*args, **kwargs): return group_id = kwargs.get('group_id') date_start = str(self.request.get('date_start')) date_finish = str(self.request.get('date_end')) reg = '(\d\d\d\d)-(\d\d)-(\d\d)' year_start = int(re.match(reg, date_start).group(1)) month_start = int(re.match(reg, date_start).group(2)) day_start = int(re.match(reg, date_start).group(3)) year_end = int(re.match(reg, date_finish).group(1)) month_end = int(re.match(reg, date_finish).group(2)) day_end = int(re.match(reg, date_finish).group(3)) date_begin = datetime.date(year_start, month_start, day_start) date_end = datetime.date(year_end, month_end, day_end) date_begin_new = timezone.today() date_end_new = timezone.today() + datetime.timedelta(days=13) self.render_data['date_begin'] = str(date_begin_new) self.render_data['date_end'] = str(date_end_new) template = JINJA_ENVIRONMENT.\ get_template('templates/copy_from_default.html') self.render_data['result'] = [u'Расписание успешно добавлено.'] if (date_end - date_begin) > 180*datetime.timedelta(days=1): self.render_data['result'] = [u'Ошибка: cлишком много дней для копирования.' +\ u' Пожалуйста, попробуйте с меньшим диапазоном.'] self.response.status = 422 self.response.write(template.render(self.render_data)) return memcache.delete("schedule_to_render_" + group_id) settings_qry = ScheduleSettings.query().fetch(1) if len(settings_qry) == 0: settings = ScheduleSettings(schedule_period=7, first_week_begin=DEFAULT_MONDAY) settings.put() else: settings = settings_qry[0] while date_begin <= date_end: if len(ScheduledPair.query(ScheduledPair.date == date_begin, ScheduledPair.group_id == group_id).fetch(1)) == 0: weekday = (date_begin - settings.first_week_begin).days %\ settings.schedule_period pairs_qry = DefaultPair.query(DefaultPair.week_day == weekday, DefaultPair.group_id == group_id) for pair in pairs_qry: new_pair = ScheduledPair(classname=pair.classname, date=date_begin, start_time=pair.start_time, duration=pair.duration, task='', group_id=group_id, pair_type=pair.pair_type) new_pair.put() else: self.render_data['result'] += [u'Расписание на ' + str(date_begin) +\ u' уже существует.\n'] date_begin += datetime.timedelta(days=1) memcache.delete("schedule_to_render_" + group_id) self.response.write(template.render(self.render_data))
def get(self, *args, **kwargs): if not super(CopyFromDefault, self).get(*args, **kwargs): return date_begin = timezone.today() date_end = timezone.today() + datetime.timedelta(days=13) template = JINJA_ENVIRONMENT.get_template('templates/' 'copy_from_default.html') self.render_data['date_begin'] = str(date_begin) self.render_data['date_end'] = str(date_end) self.response.write(template.render(self.render_data))
def test_show_schedule(self): simulate_login(self.testbed, '*****@*****.**', '123', True) group = Group(group_id='asgap', name='1', origin='1', admin=[u'*****@*****.**']) post_group(group) simulate_login(self.testbed) group_id = 'asgap' response = make_request('/' + group_id + '/', 'GET') self.assertEqual(response.status_int, 200) self.assertEqual(response.body.count('</tr>'), 1) if timezone.today().weekday() >= 5: today = timezone.today() + datetime.timedelta(days=2) else: today = timezone.today() pair1 = ScheduledPair(classname='Math 1', date=today, start_time=datetime.time(9, 10), duration=90, task='some task', group_id='asgap') pair2 = ScheduledPair(classname='Math 2', date=today, start_time=datetime.time(10, 40), duration=90, task='some task', group_id='asgap') pair3 = ScheduledPair(classname='Math 3', date=today + datetime.timedelta(days=1), start_time=datetime.time(9, 40), duration=120, task='some task', group_id='asgap') simulate_login(self.testbed, '*****@*****.**', '123', True) post_pair(pair2) post_pair(pair3) post_pair(pair1) simulate_login(self.testbed) response = make_request('/' + group_id + '/', 'GET') self.assertEqual(response.status_int, 200) self.assertEqual(response.body.count('<div class="pair'), 3) self.assertNotEqual(response.body.find('Math 1'), -1) self.assertNotEqual(response.body.find('Math 2'), -1) self.assertNotEqual(response.body.find('Math 3'), -1) self.assertLess(response.body.find('Math 1'), response.body.find('Math 2')) self.assertLess(response.body.find('Math 2'), response.body.find('Math 3'))
def get(self): groups = Group.query() for group in groups: pairs_qry = ScheduledPair.query( ScheduledPair.group_id == group.group_id, ScheduledPair.date == timezone.today() + datetime.timedelta(days=1), ScheduledPair.replace == True).order(ScheduledPair.start_time) text = u'' for pair in pairs_qry: if pair.pair_type == 'cancel': text += u'❌' + u'Занятие ОТМЕНЕНО:\n' else: text += u'🔀' + u'Изменение:\n' text += pair.classname + u'\nНачало в ' + pair.start_time.strftime( '%H:%M') + '.' text += '\n\n' logging.info(text) if text == u'': continue text = u'ℹ' + u' Внимание! На завтра имеются изменения в расписании!\n\n' + text + u'Полное расписание на завтра: /tomorrow.' chats = ChatSettings.query(ChatSettings.group_id == group.group_id) for chat in chats: #logging.info("send changes to " + str(chat.key.id())) reply(chat.key.id(), text)
def get(self, *args, **kwargs): if not super(NewPair, self).get(*args, **kwargs): return default_day = self.request.get('date') if default_day is None or default_day == "": default_day = timezone.today() else: default_day = timezone.datefromstr(default_day) pair = ScheduledPair(classname='', date=default_day, start_time=datetime.time(9, 10), duration=90, replace=True, task='', pair_type='') return_url = self.request.get('return_url') if return_url is None: return_url = '/' + group_id + '/pairs' template = JINJA_ENVIRONMENT.get_template('templates/edit_pair.html') subjects_qry = Subject.query( Subject.group_id == self.render_data['group_id']).order( Subject.classname) self.render_data['subjects'] = subjects_qry self.render_data['pair'] = pair self.render_data['return_url'] = return_url self.response.write(template.render(self.render_data))
def proceed_delta(chat_id, fr, text): chat_settings = ChatSettings.get_or_insert(str(chat_id)) if chat_settings.group_id == '': reply(chat_id, u'Чат не привязан ни к какой группе. Чтобы привязать, наберите /setgroup <id группы>.') else: date_delta = text if date_delta.isdigit(): delta_value = int(date_delta) if delta_value < 7 and delta_value > 0: event_list = ScheduledPair.query(ScheduledPair.group_id == chat_settings.group_id, ScheduledPair.date == timezone.today() + datetime.timedelta(days=delta_value)).order(ScheduledPair.start_time).fetch(5) if len(event_list) == 0: reply(chat_id, u'На этот день событий нет.') return text = u'Расписание на ' + str(timezone.today() + datetime.timedelta(days=delta_value)) + u' :\n\n' for event in event_list: text += event.classname + u'\nНачало в ' + event.start_time.strftime('%H:%M') + '.\n\n' reply(chat_id, text) else: reply(chat_id, u'Выбран недопустимый временной интервал.') else: reply(chat_id, u'Данные введены некорректно.')
def get(self, *args, **kwargs): if not super(NewPair, self).get(*args, **kwargs): return default_day = self.request.get('date') if default_day is None or default_day == "": default_day = timezone.today() else: default_day = timezone.datefromstr(default_day) pair = ScheduledPair(classname='', date=default_day, start_time=datetime.time(9, 10), duration=90, replace=True, task='', pair_type='') return_url = self.request.get('return_url') if return_url is None: return_url = '/' + group_id + '/pairs' template = JINJA_ENVIRONMENT.get_template('templates/edit_pair.html') subjects_qry = Subject.query(Subject.group_id == self.render_data['group_id']).order(Subject.classname) self.render_data['subjects'] = subjects_qry self.render_data['pair'] = pair self.render_data['return_url'] = return_url self.response.write(template.render(self.render_data))
def get(self, *args, **kwargs): if not super(ShowSchedule, self).get(*args, **kwargs): return group_id = kwargs.get('group_id') template = JINJA_ENVIRONMENT.get_template('templates/schedule.html') schedule_to_render = memcache.get("schedule_to_render_" + group_id) date_in_memcache = memcache.get("schedule_set_date_" + group_id) if (schedule_to_render is None) or (date_in_memcache is None)\ or (date_in_memcache != timezone.today()): schedule_to_render = [None] * 6 min_start_time = timezone.timefromstr("23:59") max_end_time = timezone.timefromstr("00:00") for day in xrange(7): today = timezone.today() thatday = today + datetime.timedelta(days=day) if thatday.weekday() == 6: continue pairs_qry = ScheduledPair.query(ScheduledPair.date == thatday, ScheduledPair.group_id == group_id).\ order(ScheduledPair.start_time) render_day = {'week_day': thatday.weekday(), 'pairs': [], 'date': thatday, 'is_current': (today == thatday), 'pair_add_link': '/' + group_id +\ '/new_pair?date=' +\ str(thatday) +\ '&return_url=/' + group_id + '/'} for pair in pairs_qry: pair_dict = pair.to_dict() pair_dict['edit_link'] = '/' + group_id +\ '/edit_pair?key=' +\ pair.key.urlsafe() +\ '&return_url=/' + group_id + '/' pair_dict['delete_link'] = '/' + group_id +\ '/delete_pair?key=' + pair.key.urlsafe() +\ '&return_url=/' + group_id + '/' subject = Subject.query(Subject.classname == pair.classname).get() if subject is None: pair_dict['subject_link'] = '' else: pair_dict['subject_link'] = '/' + group_id +\ '/subject?key=' + subject.key.urlsafe() render_day['pairs'].append(pair_dict) min_start_time = min(min_start_time, pair.start_time) max_end_time = max(max_end_time, timezone.addtime(pair.start_time, timezone.timedelta(minutes=pair.duration))) schedule_to_render[thatday.weekday()] = render_day coef = 1.2 # mins per pixel for day in schedule_to_render: for pair in day['pairs']: pair['from_up'] = 40 + int(timezone.gettimediff(pair['start_time'], min_start_time).seconds / 60 / coef) pair['height'] = int(pair['duration'] / coef) day['height'] = 40 + int(timezone.gettimediff(max_end_time, min_start_time).seconds / 60 / coef) + 40 memcache.set(key="schedule_to_render_" + group_id, value=schedule_to_render) memcache.set(key="schedule_set_date_" + group_id, value=timezone.today()) self.render_data['days'] = schedule_to_render self.response.write(template.render(self.render_data))
def post(self, *args, **kwargs): if not super(CopyFromDefault, self).post(*args, **kwargs): return group_id = kwargs.get('group_id') date_start = str(self.request.get('date_start')) date_finish = str(self.request.get('date_end')) reg = '(\d\d\d\d)-(\d\d)-(\d\d)' year_start = int(re.match(reg, date_start).group(1)) month_start = int(re.match(reg, date_start).group(2)) day_start = int(re.match(reg, date_start).group(3)) year_end = int(re.match(reg, date_finish).group(1)) month_end = int(re.match(reg, date_finish).group(2)) day_end = int(re.match(reg, date_finish).group(3)) date_begin = datetime.date(year_start, month_start, day_start) date_end = datetime.date(year_end, month_end, day_end) date_begin_new = timezone.today() date_end_new = timezone.today() + datetime.timedelta(days=13) self.render_data['date_begin'] = str(date_begin_new) self.render_data['date_end'] = str(date_end_new) template = JINJA_ENVIRONMENT.\ get_template('templates/copy_from_default.html') self.render_data['result'] = [u'Расписание успешно добавлено.'] if (date_end - date_begin) > 180 * datetime.timedelta(days=1): self.render_data['result'] = [u'Ошибка: cлишком много дней для копирования.' +\ u' Пожалуйста, попробуйте с меньшим диапазоном.'] self.response.status = 422 self.response.write(template.render(self.render_data)) return memcache.delete("schedule_to_render_" + group_id) settings_qry = ScheduleSettings.query().fetch(1) if len(settings_qry) == 0: settings = ScheduleSettings(schedule_period=7, first_week_begin=DEFAULT_MONDAY) settings.put() else: settings = settings_qry[0] while date_begin <= date_end: if len( ScheduledPair.query( ScheduledPair.date == date_begin, ScheduledPair.group_id == group_id).fetch(1)) == 0: weekday = (date_begin - settings.first_week_begin).days %\ settings.schedule_period pairs_qry = DefaultPair.query(DefaultPair.week_day == weekday, DefaultPair.group_id == group_id) for pair in pairs_qry: new_pair = ScheduledPair(classname=pair.classname, date=date_begin, start_time=pair.start_time, duration=pair.duration, task='', group_id=group_id, pair_type=pair.pair_type) new_pair.put() else: self.render_data['result'] += [u'Расписание на ' + str(date_begin) +\ u' уже существует.\n'] date_begin += datetime.timedelta(days=1) memcache.delete("schedule_to_render_" + group_id) self.response.write(template.render(self.render_data))
def get(self): pairs_qry = ScheduledPair.query(ScheduledPair.date < timezone.today()) for pair in pairs_qry: pair.key.delete()
def get(self, *args, **kwargs): if not super(ShowSchedule, self).get(*args, **kwargs): return group_id = kwargs.get('group_id') template = JINJA_ENVIRONMENT.get_template('templates/schedule.html') schedule_to_render = memcache.get("schedule_to_render_" + group_id) date_in_memcache = memcache.get("schedule_set_date_" + group_id) if (schedule_to_render is None) or (date_in_memcache is None)\ or (date_in_memcache != timezone.today()): schedule_to_render = [None] * 6 min_start_time = timezone.timefromstr("23:59") max_end_time = timezone.timefromstr("00:00") for day in xrange(7): today = timezone.today() thatday = today + datetime.timedelta(days=day) if thatday.weekday() == 6: continue pairs_qry = ScheduledPair.query(ScheduledPair.date == thatday, ScheduledPair.group_id == group_id).\ order(ScheduledPair.start_time) render_day = {'week_day': thatday.weekday(), 'pairs': [], 'date': thatday, 'is_current': (today == thatday), 'pair_add_link': '/' + group_id +\ '/new_pair?date=' +\ str(thatday) +\ '&return_url=/' + group_id + '/'} for pair in pairs_qry: pair_dict = pair.to_dict() pair_dict['edit_link'] = '/' + group_id +\ '/edit_pair?key=' +\ pair.key.urlsafe() +\ '&return_url=/' + group_id + '/' pair_dict['delete_link'] = '/' + group_id +\ '/delete_pair?key=' + pair.key.urlsafe() +\ '&return_url=/' + group_id + '/' subject = Subject.query( Subject.classname == pair.classname).get() if subject is None: pair_dict['subject_link'] = '' else: pair_dict['subject_link'] = '/' + group_id +\ '/subject?key=' + subject.key.urlsafe() render_day['pairs'].append(pair_dict) min_start_time = min(min_start_time, pair.start_time) max_end_time = max( max_end_time, timezone.addtime( pair.start_time, timezone.timedelta(minutes=pair.duration))) schedule_to_render[thatday.weekday()] = render_day coef = 1.2 # mins per pixel for day in schedule_to_render: for pair in day['pairs']: pair['from_up'] = 40 + int( timezone.gettimediff(pair['start_time'], min_start_time).seconds / 60 / coef) pair['height'] = int(pair['duration'] / coef) day['height'] = 40 + int( timezone.gettimediff(max_end_time, min_start_time).seconds / 60 / coef) + 40 memcache.set(key="schedule_to_render_" + group_id, value=schedule_to_render) memcache.set(key="schedule_set_date_" + group_id, value=timezone.today()) self.render_data['days'] = schedule_to_render self.response.write(template.render(self.render_data))
def proceed_task(chat_id, fr, text): chat_settings = ChatSettings.get_or_insert(str(chat_id)) if chat_settings.group_id == '': reply(chat_id, u'Чат не привязан ни к какой группе. Чтобы привязать, наберите /setgroup <id группы>.') else: event_list = ScheduledPair.query(ScheduledPair.group_id == chat_settings.group_id, ScheduledPair.date == timezone.today() + datetime.timedelta(days=1)).order(ScheduledPair.start_time).fetch(5) if len(event_list) == 0: reply(chat_id, u'Завтра событий нет.') return if ([''] * len(event_list) == [event.task for event in event_list]): reply(chat_id, u'Нет заданий на завтра') return text = u'Задания на завтра:\n\n' for event in event_list: if not (event.task == ''): text += event.classname + get_pair_type(event.pair_type) + u'\nЗадание:\n' + event.task + '.\n\n' reply(chat_id, text)
def proceed_tomorrow(chat_id, fr, text): chat_settings = ChatSettings.get_or_insert(str(chat_id)) if chat_settings.group_id == '': reply(chat_id, u'Чат не привязан ни к какой группе. Чтобы привязать, наберите /setgroup <id группы>.') else: event_list = ScheduledPair.query(ScheduledPair.group_id == chat_settings.group_id, ScheduledPair.date == timezone.today() + datetime.timedelta(days=1)).order(ScheduledPair.start_time).fetch(5) if len(event_list) == 0: reply(chat_id, u'Завтра событий нет.') return text = u'Расписание на завтра:\n\n' for event in event_list: text += event.classname + get_pair_type(event.pair_type) + u'\nНачало в ' + event.start_time.strftime('%H:%M') + '.\n\n' reply(chat_id, text)
def proceed_next(chat_id, fr, text): chat_settings = ChatSettings.get_or_insert(str(chat_id)) if chat_settings.group_id == '': reply(chat_id, u'Чат не привязан ни к какой группе. Чтобы привязать, наберите /setgroup <id группы>.') else: event_list = ScheduledPair.query(ScheduledPair.group_id == chat_settings.group_id, ScheduledPair.date == timezone.today(), ScheduledPair.start_time > (timezone.now() - datetime.timedelta(minutes=10)).time()).order(ScheduledPair.start_time).fetch(3) if len(event_list) == 0: reply(chat_id, u'Сегодня больше нет событий.') return text = u'Ближайшие события сегодня:\n\n' for event in event_list: text += event.classname + get_pair_type(event.pair_type) + u'\nНачало в ' + event.start_time.strftime('%H:%M') + '.\n\n' reply(chat_id, text)