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='Добавление олимпиад')
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('/')
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('/')
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')
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='Олимпиады')
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()
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='Изменение профиля')
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')
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}')
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)
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)
def get_olimpiads_group_by_name(name): db_session = create_session() return db_session.query(OlimpiadsGroup).filter( OlimpiadsGroup.name == name).first()
def load_user(user): """Просто загрузка пользователя""" db_session = create_session() return db_session.query(User).get(user)