Beispiel #1
0
    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))
Beispiel #2
0
 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))
Beispiel #3
0
 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))
Beispiel #4
0
 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'))
Beispiel #5
0
 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)
Beispiel #6
0
 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))
Beispiel #7
0
 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'))
Beispiel #8
0
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'Данные введены некорректно.')
Beispiel #9
0
 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))
Beispiel #10
0
 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))
Beispiel #11
0
    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))
Beispiel #12
0
 def get(self):
     pairs_qry = ScheduledPair.query(ScheduledPair.date < timezone.today())
     for pair in pairs_qry:
         pair.key.delete()
Beispiel #13
0
 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))
Beispiel #14
0
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)
Beispiel #15
0
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)
Beispiel #16
0
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)