Esempio n. 1
0
    def add_olimp_group():
        """Страницка для добавления админом групп олимпиад"""

        if not is_admin(current_user):
            return redirect('/')

        form = AddOlimpiadsGroupForm()
        if form.validate_on_submit():
            # Создаём группу олимпиад
            olimpiads_group = make_olimpiads_group_by_form(form)

            # Нужно получить id олимпиады в БД, поэтому её надо загрузить и выгрузить от туда
            db_session = create_session()
            db_session.add(olimpiads_group)
            db_session.commit()

            db_session = create_session()
            olimpiads_group = db_session.query(OlimpiadsGroup).all()[
                -1]  # Получаем строку из БД

            set_path_to_image(olimpiads_group, form['photo'].data.read(),
                              'olimpiads')  # Загружаем фотографию
            add_registration(
                olimpiads_group)  # Добавляем даты регистрации и все такое
            add_tasks(olimpiads_group)  # Добавляем файлы заданий

            db_session.commit()

            # Возвращаемся на главную страницу
            return redirect('/olimpiads')

        return render_template("add_olimpiads_group.html",
                               form=form,
                               title='Добавление олимпиад')
Esempio n. 2
0
    def add_admin(user_id):
        """Делает пользователя админом"""

        if is_admin(current_user):
            db_session = create_session()
            user = db_session.query(User).get(user_id)
            if user:
                user.is_admin = True
            db_session.commit()

        return redirect('/')
Esempio n. 3
0
    def del_news(news_id):
        """Удаляет новость"""

        if not is_admin(current_user):
            return redirect('/')

        db_session = create_session()
        news = db_session.query(OlimpiadsGroupNews).get(news_id)
        if news:
            db_session.delete(news)
            db_session.commit()

        return redirect('/')
Esempio n. 4
0
    def del_olimpiads_group(olimpiads_group_id):
        """Удаляет группу олимпиад"""

        if not is_admin(current_user):
            return redirect('/')

        db_session = create_session()
        olimpiads_group = db_session.query(OlimpiadsGroup).get(
            olimpiads_group_id)
        if olimpiads_group:
            db_session.delete(olimpiads_group)
            db_session.commit()

        return redirect('/olimpiads')
Esempio n. 5
0
    def news():
        """Главная страница для показа новостей"""

        # Выбираем все новости
        db_session = create_session()

        all_news = sorted(db_session.query(OlimpiadsGroupNews).all(),
                          key=lambda x: x.date,
                          reverse=True)
        news_in_rows = []

        # Делаем по три новости в ряду
        for i in range(0, len(all_news), 3):
            news_in_rows.append(all_news[i:min(len(all_news), i + 3)])

        return render_template("news.html", news=news_in_rows, title='Главная')
    def user_olimpiads():
        """Отображение олимпиад пользователя"""

        db_session = create_session()
        user = db_session.query(User).filter(
            User.email == current_user.email).first()
        all_olimpiads = user.olimpiads

        # По три олимпиады в ряду
        olimpiads_in_rows = []
        for i in range(0, len(all_olimpiads), 3):
            olimpiads_in_rows.append(
                all_olimpiads[i:min(len(all_olimpiads), i + 3)])

        return render_template("user_olimpiads.html",
                               olimpiads=olimpiads_in_rows)
    def olimpiads():
        """Страница, отображающая все олимпиады"""

        # Выбираем все олимпиады
        db_session = create_session()
        all_olimpiads = db_session.query(OlimpiadsGroup).all()
        db_session.close()

        # Делаем по три олимпиады в ряду
        olimpiads_in_rows = []
        for i in range(0, len(all_olimpiads), 3):
            olimpiads_in_rows.append(
                all_olimpiads[i:min(len(all_olimpiads), i + 3)])

        return render_template("olimpiads.html",
                               olimpiads=olimpiads_in_rows,
                               title='Олимпиады')
Esempio n. 8
0
def main():
    global_init('db/olimpiads_manager.sqlite')
    db_session = create_session()

    # Два потока: первый - отправка напоминаний на почту, второй - основная работа программы
    t1 = threading.Thread(target=make_mailing_work,
                          args=(db_session.query(OlimpiadsGroup).all(), ))
    t2 = threading.Thread(target=app.run, args=(
        '127.0.0.1',
        8080,
    ))

    t1.start()
    t2.start()

    t1.join()
    t2.join()
Esempio n. 9
0
    def edit_profile():
        """Обработчик страницы для изменения пользователя"""

        form = EditProfileForm()

        if form.validate_on_submit():

            # Изменяем текущего пользователя
            db_session = create_session()
            current_user.name = form['name'].data
            current_user.surname = form['surname'].data
            current_user.fatherhood = form['fatherhood'].data
            current_user.grade = form['grade'].data
            current_user.set_password(form['password'].data)

            # Удаляем старую фотографию
            if current_user.photo != '../static/img/avatars/default.jpg':
                try:
                    remove(current_user.photo.lstrip('../'))
                except FileNotFoundError:
                    pass

            # Загружаем фотку
            data = form['photo'].data.read()
            if data:
                number = randint(0, 2 ** 64)  # Для изменения фотки (чтобы она не кэшировалась)
                current_user.photo = f'../static/img/avatars/{current_user.id}-{number}.jpg'
                with open(f'static/img/avatars/{current_user.id}-{number}.jpg', 'wb') as file:
                    file.write(data)
            else:
                current_user.photo = '../static/img/avatars/default.jpg'

            db_session.merge(current_user)
            db_session.commit()

            return redirect("/")

        if request.method == "GET":
            # Задаём параметры формы
            form.name.data = current_user.name
            form.surname.data = current_user.surname
            form.fatherhood.data = current_user.fatherhood
            form.grade.data = current_user.grade
            form.email.data = current_user.email

        return render_template("edit_profile.html", form=form, title='Изменение профиля')
Esempio n. 10
0
    def add_news():
        """Страничка для добавления админом новостей. Пока админ - пользователь с id = 1,
        но это легко исправляется."""

        if not is_admin(current_user):
            return redirect('/')

        form = AddNewsForm()

        if form.validate_on_submit():

            # Создаём новость
            db_session = create_session()
            news_to_add = make_news_by_form(form)

            # Если новость связана с группой олимпиад, то добавляем искомую новость в группу олимпиад
            # Новость может быть не только об олимпиадах. Например, обновление работы сайта
            if form['is_group_news'].data:
                olimpiads_group = get_olimpiads_group_by_name(
                    form['group_name'].data)
                if not olimpiads_group:  # Если нет такой олимпиады
                    return render_template(
                        "add_news.html",
                        form=form,
                        message="Группа олимпиад не найдена")
                olimpiads_group.news.append(news_to_add)

                db_session.merge(olimpiads_group)

            else:
                db_session.add(news_to_add)
                db_session.commit()

            # Получаем новость (нам нужен её id) и загружаем фотку
            news_to_add = db_session.query(OlimpiadsGroupNews).all()[-1]
            set_path_to_image(news_to_add, form['photo'].data.read(), 'news')

            db_session.commit()

            # Возвращаемся на главную страницу
            return redirect('/')

        return render_template("add_news.html",
                               form=form,
                               title='Добавление новости')
    def delete_olimp(olimp_id):
        """Страница для удаления олимпиад у пользователя"""

        db_session = create_session()

        # Выбираем пользователя и олимпиаду
        user = db_session.query(User).filter(
            User.email == current_user.email).first()
        olimp = db_session.query(Olimpiad).filter(
            Olimpiad.id == olimp_id).first()

        if not olimp:
            abort(404)

        user.olimpiads.remove(olimp)
        db_session.commit()

        return redirect('/user_olimpiads')
Esempio n. 12
0
    def particular_news(news_id):
        """Страница для отображения конкретной новости"""

        # Выбираем новость
        db_session = create_session()
        item = db_session.query(OlimpiadsGroupNews).filter(
            OlimpiadsGroupNews.id == news_id).first()

        if not item:
            abort(404)

        # Разбиваем её на параграфы
        paragraphs = item.text.split('\n\n')

        return render_template("particular_news.html",
                               news=item,
                               paragraphs=paragraphs,
                               title=f'Новость: {item.title}')
Esempio n. 13
0
    def register():
        """Обработчик для регистрации"""

        form = RegisterForm()

        if form.validate_on_submit():

            # Создаём пользователя
            db_session = create_session()
            user = User()

            user.name = form['name'].data
            user.surname = form['surname'].data
            user.fatherhood = form['fatherhood'].data
            user.grade = form['grade'].data
            user.email = form['email'].data
            user.set_password(form['password'].data)

            # Проверка на наличие пользователя с таким же адресом почты
            if db_session.query(User).filter(User.email == user.email).first():
                return render_template("register.html", form=form, message_email="Этот логин уже занят")

            db_session.add(user)
            db_session.commit()

            # Загружаем только что созданного пользователя для загрузки фото
            user = db_session.query(User).filter(User.email == user.email).first()

            # Загрузка фото
            data = form['photo'].data.read()

            if data:
                user.photo = f'../static/img/avatars/{user.id}-v1.jpg'
                with open(f'static/img/avatars/{user.id}-v1.jpg', 'wb') as file:
                    file.write(data)
            else:
                user.photo = f'../static/img/avatars/default.jpg'

            login_user(user)
            db_session.commit()

            return redirect("/")
        else:
            return render_template("register.html", form=form, title='Регистрация')
    def add_olimp(olimpiads_group_id):
        """Страница для добавления олимпиад у пользователя"""

        # Выбираем олимпиаду
        db_session = create_session()
        olimpiads_group = db_session.query(OlimpiadsGroup).filter(
            OlimpiadsGroup.id == olimpiads_group_id).first()

        if not olimpiads_group:
            abort(404)

        # Создаём форму с конкретными предметами, классами и городами
        form = data.forms.register_olimp_form.make_form(
            olimpiads_group.subjects, olimpiads_group.grades,
            olimpiads_group.cities)

        if form.validate_on_submit():
            subject = form['subject'].data
            grade = form['grade'].data

            # Получаем олимпиаду и пользователя (почему-то через current_user не работало)
            res_olimp = db_session.query(Olimpiad).filter(
                Olimpiad.olimpiads_group_id == olimpiads_group.id,
                Olimpiad.subject == subject, Olimpiad.grade == grade).first()
            user = db_session.query(User).filter(
                User.email == current_user.email).first()

            # Если мы нашли олимпиаду
            if res_olimp:
                user.olimpiads.append(res_olimp)
                db_session.commit()
                return redirect("/olimpiads")
            else:
                return render_template(
                    "register_olimp.html",
                    form=form,
                    olimpiad=olimpiads_group,
                    message="Олимпиады по выбранным параметрам не найдено")

        return render_template("register_olimp.html",
                               form=form,
                               olimpiad=olimpiads_group)
Esempio n. 15
0
    def login():
        """Обработчик для авторизации"""

        form = LoginForm()

        if form.validate_on_submit():

            # Загружаем пользователя
            db_session = create_session()
            user = db_session.query(User).filter(User.email == form.email.data).first()

            # Проверяем пароль
            if user and user.check_password(form.password.data):
                login_user(user, remember=form.remember_me.data)
                return redirect('/')

            # В противном случае возвращяем сообщение об ошибке
            return render_template("login.html", message="Неправильный логин или пароль", form=form, title='Вход')

        return render_template("login.html", form=form, title='Вход')
    def tasks(olimpiads_group_id):
        """Страница для получения заданий конкретной олимпиады"""

        # Загружаем группу олимпиад
        db_session = create_session()
        olimpiads_group = db_session.query(OlimpiadsGroup).filter(
            OlimpiadsGroup.id == olimpiads_group_id).first()

        if not olimpiads_group:
            abort(404)

        # Создаём форму с указанными предметами и классами
        form = data.forms.task_form.make_form(olimpiads_group.subjects,
                                              olimpiads_group.grades)

        if form.validate_on_submit():
            # Проверка на существование олимпиады

            res_olimp = db_session.query(Olimpiad).filter(
                Olimpiad.subject == form["subject"].data,
                Olimpiad.grade == form["grade"].data,
                Olimpiad.olimpiads_group_id == olimpiads_group_id).first()

            if res_olimp:
                return render_template("tasks.html",
                                       form=form,
                                       olimpiad=olimpiads_group,
                                       file=res_olimp.tasks)
            else:
                return render_template(
                    "tasks.html",
                    form=form,
                    olimpiad=olimpiads_group,
                    message="Задания для такого предмета или класса не найдены"
                )
        else:
            return render_template("tasks.html",
                                   form=form,
                                   olimpiad=olimpiads_group)
    def particular_olimpiad(olimpiads_group_id):
        """Страница для конкретной олимпиады"""

        # Получаем группу олимпиад
        db_session = create_session()
        item = db_session.query(OlimpiadsGroup).filter(
            OlimpiadsGroup.id == olimpiads_group_id).first()

        if not item:
            abort(404)

        # Получаем список предметов
        subjects = item.subjects.split(', ')

        # Получаем все новости
        all_news = sorted(db_session.query(OlimpiadsGroupNews).filter(
            OlimpiadsGroupNews.olimpiad_group_id == olimpiads_group_id).all(),
                          key=lambda x: x.date)

        # Выбираем две последние новости
        news_in_rows = [all_news[:(min(len(all_news), 2))]]

        # Получаем расписание и заполняем его
        timetable = TimeTable(item.grades, item.subjects)
        for olimpiad in item.olimpiads:
            timetable.add(olimpiad.subject, olimpiad.grade,
                          olimpiad.registration_data.date)

        # Получаем абзацы
        paragraphs = item.description.split('\n\n')
        return render_template("particular_olimpiad.html",
                               olimpiad=item,
                               subjects=subjects,
                               news=news_in_rows,
                               timetable=timetable,
                               paragraphs=paragraphs)
Esempio n. 18
0
def get_olimpiads_group_by_name(name):
    db_session = create_session()
    return db_session.query(OlimpiadsGroup).filter(
        OlimpiadsGroup.name == name).first()
Esempio n. 19
0
    def load_user(user):
        """Просто загрузка пользователя"""

        db_session = create_session()
        return db_session.query(User).get(user)