Exemple #1
0
 def get_department_menu(self,
                         button_name: str,
                         faculty: models.Faculty = None):
     menu = Menu(button_name)
     for department in models.Department.all(faculty):
         menu_department = Menu(department.abbreviation if department.
                                abbreviation else department.name)
         menu_department.add_basic_item(
             'Информация о кафедре', '',
             self.get_department_lambda(department))
         menu.add_menu_item(menu_department.name, menu_department)
     return menu
Exemple #2
0
    def get_faculty_menu(self, button_name: str, over_back=None):
        menu = Menu(button_name)

        faculties = models.Faculty.get_faculties()
        if faculties:
            # limit = limit_foo([i.abbreviation if i.abbreviation else i.name for i in faculties])
            for faculty in faculties:
                menu_faculty = Menu(faculty.abbreviation if faculty.
                                    abbreviation else faculty.name)
                menu_faculty.add_basic_item('Информация о факультете', '',
                                            self.get_faculty_lambda(faculty))

                departments_of_faculty = self.get_department_menu(
                    'Кафедры факультета', faculty)
                menu_faculty.add_menu_item(departments_of_faculty.name,
                                           departments_of_faculty)

                specialties_of_faculty = self.get_specialties(faculty.name)
                menu_faculty.add_menu_item(specialties_of_faculty.name,
                                           specialties_of_faculty)

                menu.add_menu_item(menu_faculty.name, menu_faculty)
        return menu
Exemple #3
0
class MenuTree:
    def __init__(self):
        self.max_items_per_slide = 7 * 4

        self.root = Menu("Главное меню")

        # ДГТУ и АСА
        self.places_menu = Menu('Места и объекты')
        self.dstu_menu = Menu('ДГТУ')
        self.asa_menu = Menu('АСА')

        self.dstu_housings_menu = self.get_place_menu('Корпуса', 'Корпус')
        self.dstu_cafe_menu = self.get_place_menu('Кафе', 'Кафе')
        self.dstu_hostels_menu = self.get_place_menu('Общежития', 'Общежитие')
        self.dstu_sport_menu = self.get_place_menu('Спортивные комплексы',
                                                   'Спортивные комплексы')
        self.dstu_other_places_menu = self.get_place_menu('Другое', 'Другое')

        self.dstu_menu.add_menu_item(self.dstu_housings_menu.name,
                                     self.dstu_housings_menu)
        self.dstu_menu.add_menu_item(self.dstu_cafe_menu.name,
                                     self.dstu_cafe_menu)
        self.dstu_menu.add_menu_item(self.dstu_hostels_menu.name,
                                     self.dstu_hostels_menu)
        self.dstu_menu.add_menu_item(self.dstu_sport_menu.name,
                                     self.dstu_sport_menu)
        self.dstu_menu.add_menu_item(self.dstu_other_places_menu.name,
                                     self.dstu_other_places_menu)

        self.places_menu.add_menu_item('ДГТУ', self.dstu_menu)

        self.asa_housings_menu = self.get_place_menu('Корпуса', 'Корпус')
        self.asa_cafe_menu = self.get_place_menu('Кафе', 'Кафе')
        self.asa_hostels_menu = self.get_place_menu('Общежития', 'Общежитие')
        self.asa_sport_menu = self.get_place_menu('Спортивные комплексы',
                                                  'Спортивные комплексы')
        self.asa_other_places_menu = self.get_place_menu('Другое', 'Другое')

        self.dstu_menu.add_menu_item(self.dstu_housings_menu.name,
                                     self.asa_housings_menu)
        self.dstu_menu.add_menu_item(self.dstu_cafe_menu.name,
                                     self.asa_cafe_menu)
        self.dstu_menu.add_menu_item(self.dstu_hostels_menu.name,
                                     self.asa_hostels_menu)
        self.dstu_menu.add_menu_item(self.dstu_sport_menu.name,
                                     self.asa_sport_menu)
        self.dstu_menu.add_menu_item(self.dstu_other_places_menu.name,
                                     self.asa_other_places_menu)

        self.places_menu.add_menu_item('АСА', self.asa_menu)

        # Стипендии
        self.grants_menu = Menu('Стипендии')

        self.grants_mag = Menu('Магистратура')
        self.grants_bak = Menu('Бакалавриат')
        self.grants_college = Menu('Колледж')
        self.grants_asp = Menu('Аспирантура')

        self.grants_bak.add_basic_item('Академическая стипендия', "",
                                       spec_foo.get_grant_bak_academ)
        self.grants_bak.add_basic_item('Повыш. академ. стипендия', "",
                                       spec_foo.get_grant_bak_up_academ)
        self.grants_bak.add_basic_item('Стипендия Л.В. Красниченко', "",
                                       spec_foo.get_grant_bak_krasnichenko)
        self.grants_bak.add_basic_item('Стипендия Ученого совета', "",
                                       spec_foo.get_grant_bak_uchony_sovet)
        self.grants_bak.add_basic_item('Соц. стипендия', "",
                                       spec_foo.get_grant_bak_soc)
        self.grants_bak.add_basic_item('Повыш. соц. стипендия', "",
                                       spec_foo.get_grant_bak_up_soc)

        self.grants_mag.add_basic_item('Академическая стипендия', "",
                                       spec_foo.get_grant_mag_academ)
        self.grants_mag.add_basic_item('Соц. стипендия', "",
                                       spec_foo.get_grant_mag_up_academ)
        self.grants_mag.add_basic_item('Стипендия Л.В. Красниченко', "",
                                       spec_foo.get_grant_mag_krasnichenko)
        self.grants_mag.add_basic_item('Стипендия Ученого совета', "",
                                       spec_foo.get_grant_mag_uchony_sovet)

        self.grants_college.add_basic_item('Академическая стипендия', "",
                                           spec_foo.get_grant_college_academ)
        self.grants_college.add_basic_item('Соц. стипендия', "",
                                           spec_foo.get_grant_college_soc)

        self.grants_asp.add_basic_item('Стипендия аспирантам', "",
                                       spec_foo.get_grant_asp_asp)

        self.grants_menu.add_menu_item(self.grants_mag.name, self.grants_mag)
        self.grants_menu.add_menu_item(self.grants_bak.name, self.grants_bak)
        self.grants_menu.add_menu_item(self.grants_college.name,
                                       self.grants_college)
        self.grants_menu.add_menu_item(self.grants_asp.name, self.grants_asp)
        self.grants_menu.add_basic_item('Материальная помощь', '',
                                        spec_foo.get_grant_material_support)

        # Узнать расписание

        self.schedule_menu = Menu('Узнать расписание')

        self.schedule_menu.add_special_item('Мое расписание', "Мое расписание", [('Я не знаю вашу группу\n' \
                                                                                  'Введите название чтобы я запомнил\n' \
                                                                                  'Например ВПР41 или вПр-41, как угодно :)',
                                                                                  None)],
                                            self.save_group,
                                            prepare={'condition': lambda *args, **kwargs: models.User.get_user(
                                                kwargs['vk_id']).group.name,
                                                     'method': lambda *args, **kwargs: self.get_schedule_of_group(
                                                         list_answers=[models.User.get_user(
                                                             kwargs['vk_id']).group.name])})

        self.schedule_menu.add_special_item(
            'Расписание группы', "Расписание группы",
            [('Введите название группы', None)], self.get_schedule_of_group)

        # Факультеты и кафедры

        self.faculties_and_departments_menu = Menu('Факультеты и кафедры')
        self.faculties_menu = self.get_faculty_menu('Факультеты',
                                                    over_back=self.root)
        self.departments_menu = self.get_department_menu('Кафедры')
        self.specialty = Menu('Направления')

        self.faculties_and_departments_menu.add_menu_item(
            self.faculties_menu.name, self.faculties_menu)
        self.faculties_and_departments_menu.add_menu_item(
            self.departments_menu.name, self.departments_menu)

        # Настройки
        self.settings_menu = Menu('Настройки')
        self.settings_menu.add_special_item('Изменить название моей группы', "Изменить название моей группы",
                                            [('Введите название вашей группы\n' \
                                              'Например ВПР41 или вПр-41, как угодно :)',
                                              None)],
                                            self.save_group)

        self.settings_menu.add_basic_item(
            'Отключить напоминания о парах',
            'Отключить напоминания о парах',
            method=self.notify_change,
            call_name=lambda *args, **kwargs:
            ('Отключить' if models.User.get_user(kwargs['user_id']).remind else
             'Включить') + ' напоминания о парах')

        self.root.add_menu_item(self.places_menu.name, self.places_menu)
        self.root.add_menu_item(self.schedule_menu.name, self.schedule_menu)
        self.root.add_menu_item(self.faculties_and_departments_menu.name,
                                self.faculties_and_departments_menu)
        self.root.add_menu_item(self.grants_menu.name, self.grants_menu)
        self.root.add_menu_item(self.settings_menu.name, self.settings_menu)
        self.root.add_special_item("Оставить отзыв или предложение",
                                   "Оставить отзыв или предложение",
                                   [('Введите ваше предложение:', None)],
                                   self.add_sentence)
        self.root.add_basic_item("О Боте", "", spec_foo.about_me)

    @staticmethod
    def distribution_menu_items(items):
        row_len = 0
        result = 0
        results = []
        count_items_in_row = 0
        count_rows = 1
        limit_row_len = 30
        limit_items_in_row = 4
        limit_rows = 5
        for item in items:
            row_len += len(item)
            count_items_in_row += 1
            result += 1
            if not ((count_items_in_row == 0) or
                    (row_len + len(item) < limit_row_len
                     and count_items_in_row < limit_items_in_row)):
                count_items_in_row = 0
                row_len = 0
                count_rows += 1
                if count_rows == limit_rows:
                    count_rows = 1
                    results.append(result)
        return results

    def pagination(foo):
        def wrapper(*args, **kwargs):
            menu = foo(*args, **kwargs)
            slices = MenuTree.distribution_menu_items(menu.items)
            count = 0
            next_menu = root = Menu(menu.name)
            over_back = kwargs.get('over_back')
            for i, item in enumerate(menu.items.items()):
                if count < len(slices) and i == slices[count]:
                    count += 1
                    a = Menu('Далее')
                    if over_back:
                        next_menu.add_menu_item(over_back.name,
                                                over_back,
                                                type_item=TypeItem.GATE,
                                                is_heir=False)
                    next_menu.add_menu_item(a.name, a, type_item=TypeItem.GATE)
                    next_menu = a
                next_menu.add_menu_item(index=item[0],
                                        menu=item[1][0],
                                        is_heir=item[1][1])
            next_menu.add_menu_item(over_back.name,
                                    over_back,
                                    type_item=TypeItem.GATE,
                                    is_heir=False)
            return root

        return wrapper

    def notify_change(self, *args, **kwargs):
        new_remind = not models.User.get_user(kwargs['vk_id']).remind
        models.User.get_user(kwargs['vk_id']).set_remind(new_remind)
        return 'Напоминания %s' % ('включены'
                                   if new_remind else 'отключены'), None

    def save_group(self, *args, **kwargs):
        if len(kwargs['list_answers']) > 0 and models.Group.get_group(
                kwargs['list_answers'][0]):
            models.User.get_user(
                kwargs['vk_id']).update(group_name=kwargs['list_answers'][0])
            return 'Я запомнил вашу группу. Поменять ее можно в настройках.', None
        return 'Я не знаю такую группу', None

    def get_schedule_of_group(self, *args, **kwargs):
        group = models.Group.get_group(kwargs['list_answers'][0])
        days = {
            'Понедельник': 'пн',
            'Вторник': 'вт',
            'Среда': 'ср',
            'Четверг': 'чт',
            'Пятница': 'пт',
            'Суббота': 'сб',
            'Воскресенье': 'вс'
        }
        if group:
            answer = '▫ Номер пары ▫ Название ▫ Кабинет ▫'
            answer += '\n⬆Верхняя неделя'
            for long, short in days.items():
                schedule = sorted(group.get_schedule(day=short, week=2),
                                  key=lambda x: x.number)
                if len(schedule) == 0:
                    continue
                answer += '\n➖' + long + '\n' + '\n'.join('№%i: %s' %
                                                          (i.number, i.name)
                                                          for i in schedule)
            answer += '\n⬇Нижняя неделя'
            for long, short in days.items():
                schedule = sorted(group.get_schedule(day=short, week=1),
                                  key=lambda x: x.number)
                if len(schedule) == 0:
                    continue
                answer += '\n➖' + long + '\n' + '\n'.join('№%i: %s' %
                                                          (i.number, i.name)
                                                          for i in schedule)
            return answer, None
        return 'Группа не найдена', None

    def add_sentence(self, *args, **kwargs):
        models.User.get_user(kwargs['vk_id']).add_review(
            kwargs['list_answers'][0])
        return 'Спасибо за отзыв😊', None

    ## формат вывода
    def get_format_place(self, name):
        place = models.Place.get_place(name)
        if not place:
            return 'Извините, запрашевоемое место еще не добавлено'
        result = "Название: " + place.name + "\n"
        if place.adress:
            result += "📍Адрес: " + place.adress + "\n"
        if place.managers:
            result += "👤Управляющие: " + ''.join(
                i.first_name for i in place.managers) + "\n"
        if place.phones:
            result += "📞Телефоны: " + ', '.join(i.phone
                                                for i in place.phones) + "\n"
        if place.schedules:
            result += "🕗Расписание: \n" + '\n'.join(
                '%s: %s - %s' % (i.day_of_week, i.start_time.strftime("%H:%M"),
                                 i.end_time.strftime("%H:%M"))
                for i in place.schedules) + "\n"
        if place.map_url:
            result += "Карта: " + place.map_url + "\n"
        return result, place.img_name

    def get_format_faculty(self, name=None, abbreviation=None):
        faculty = models.Faculty.get_faculty(name, abbreviation)
        if not faculty:
            return 'Извините, запрашевоемое место еще не добавлено', None
        result = "Название: " + faculty.name + "\n"
        if faculty.abbreviation:
            result += "Аббревиатура: %s\n" % faculty.abbreviation
        if faculty.phones:
            result += "📞Телефон: %s\n" % faculty.phones
        if faculty.dean:
            result += "👤Декан: %s %s %s\n" % (faculty.dean.last_name,
                                              faculty.dean.first_name,
                                              faculty.dean.patronymic)
        if faculty.cabinet_dean:
            result += "📍Кабинет декана: %s\n" % ', '.join(faculty.cabinet_dean)
        if faculty.cabinet_dean_office:
            result += "📍Кабинет деканата: %s\n" % ', '.join(
                faculty.cabinet_dean_office)
        if faculty.schedules:
            result += "🕗Расписание деканата: \n" + '\n'.join(
                '%s: %s - %s' % (i.day_of_week, i.start_time.strftime("%H:%M"),
                                 i.end_time.strftime("%H:%M"))
                for i in faculty.schedules) + "\n"
        return result, None

    def get_format_department(self, name=None, abbreviation=None):
        department = models.Department.get_department(name, abbreviation)
        if not department:
            return 'Извините, запрашевоемое место еще не добавлено', None
        result = "Название: " + department.name + "\n"
        if department.abbreviation:
            result += "Аббревиатура: %s\n" % department.abbreviation
        if department.phones:
            result += "📞Телефон: %s\n" % ', '.join(department.phones)
        if department.manager:
            result += "👤Заведующий: %s %s %s\n" % (
                department.manager.last_name, department.manager.first_name,
                department.manager.patronymic)
        if department.cabinets:
            result += "📍Кабинет: %s\n" % ', '.join(department.cabinets)
        if department.schedules:
            result += "🕗Расписание кафедры: \n" + '\n'.join(
                '%s: %s - %s' % (i.day_of_week, i.start_time.strftime("%H:%M"),
                                 i.end_time.strftime("%H:%M"))
                for i in department.schedules) + "\n"
        return result, None

    # генераторы меню
    def get_place_menu(self, button_name: str, place_type: str):
        menu = Menu(button_name)
        for place in models.Place.get_places_by_type(place_type):
            menu.add_basic_item(
                place.name, "",
                lambda **kwargs: self.get_format_place(kwargs['request']))
        return menu

    @pagination
    def get_faculty_menu(self, button_name: str, over_back=None):
        menu = Menu(button_name)

        faculties = models.Faculty.get_faculties()
        if faculties:
            # limit = limit_foo([i.abbreviation if i.abbreviation else i.name for i in faculties])
            for faculty in faculties:
                menu_faculty = Menu(faculty.abbreviation if faculty.
                                    abbreviation else faculty.name)
                menu_faculty.add_basic_item('Информация о факультете', '',
                                            self.get_faculty_lambda(faculty))

                departments_of_faculty = self.get_department_menu(
                    'Кафедры факультета', faculty)
                menu_faculty.add_menu_item(departments_of_faculty.name,
                                           departments_of_faculty)

                specialties_of_faculty = self.get_specialties(faculty.name)
                menu_faculty.add_menu_item(specialties_of_faculty.name,
                                           specialties_of_faculty)

                menu.add_menu_item(menu_faculty.name, menu_faculty)
        return menu

    def get_department_menu(self,
                            button_name: str,
                            faculty: models.Faculty = None):
        menu = Menu(button_name)
        for department in models.Department.all(faculty):
            menu_department = Menu(department.abbreviation if department.
                                   abbreviation else department.name)
            menu_department.add_basic_item(
                'Информация о кафедре', '',
                self.get_department_lambda(department))
            menu.add_menu_item(menu_department.name, menu_department)
        return menu

    ## остальное
    def get_specialties(self, faculty_name):
        menu = Menu('Специальности факультета')
        menu.add_basic_item('Какая-то специальность', "", lambda **kwargs:
                            ('инфа', None))
        return menu

    def get_faculty_lambda(self, faculty):
        return lambda **kwargs: self.get_format_faculty(name=faculty.name)

    def get_department_lambda(self, department):
        return lambda **kwargs: self.get_format_department(name=department.name
                                                           )