Ejemplo n.º 1
0
def category_content(id):
    """Темы в категории"""
    db_sess = db_session.create_session()
    page = request.args.get("page", 1, type=int)

    # Если был вставлен ID, то находим тему в базе данных по этому ID
    if id.isdigit():
        category = db_sess.query(Category).get(int(id))

        if not category:
            abort(404, description="Категории с таким ID не существует")

        pagination_topics = category.get_topics_pagination()

        return render("category.html",
                      title=category.title,
                      category=category,
                      topics=pagination_topics,
                      page=page)
    # Если же был введён no_category, то показываем страницу с темами без категории
    elif id == "no_category":
        # Распределяем темы по страницам
        pagination_topics = Pagination(
            sorted(
                db_sess.query(Topic).filter(Topic.category_id == None).all(),
                key=lambda t: t.created_time,
                reverse=True), 10)

        return render("category.html",
                      title="Без категории",
                      category=None,
                      topics=pagination_topics,
                      page=page)
    else:
        abort(400)
Ejemplo n.º 2
0
def edit_topic(id):
    """Редактирование темы"""
    db_sess = db_session.create_session()
    topic = db_sess.query(Topic).get(id)

    if not topic:
        abort(404, description="Темы с таким ID не существует")

    # Проверяем, что автор комментария является текущим пользователем или является администратором
    if (current_user.id != topic.author_id
            or topic.is_locked) and not current_user.is_admin():
        abort(403, "У вас нет прав на редактирование этой темы")

    form = EditTopicForm()
    # Сгенерируем список категорий, в которых пользователь может создать тему
    if current_user.is_admin():
        form.category.choices = [(None, "Без категории")] + \
                                [(c.id, c.title) for c in db_sess.query(Category).order_by("title")]
    else:
        form.category.choices = [(None, "Без категории")] + \
            [(c.id, c.title) for c in db_sess.query(Category).filter(Category.is_locked == False).order_by("title")]

    if form.validate_on_submit():
        # Если была нажата кнопка "Удалить"
        if form.delete.data:
            for comment in topic.comments:
                db_sess.delete(comment)

            db_sess.delete(topic)
            db_sess.commit()

            return redirect(url_for("index"))
        # В остальных случаях считаем, что была нажата кнопка "Сохранить"
        else:
            form.category.data = None if form.category.data == "None" else form.category.data

            if topic.title == form.title.data and topic.text == form.text.data and topic.category == \
                    form.category.data and topic.is_locked == form.category.data:
                return render(
                    "edit_topic.html",
                    title="Редактировать тему",
                    form=form,
                    error="Данные формы совпадают с исходными данными")
            else:
                topic.title = form.title.data
                topic.text = form.text.data
                topic.category_id = form.category.data
                topic.is_locked = form.locked.data
                db_sess.commit()

                return redirect(url_for("topic_content", id=id))
    else:
        # Впишем значение из базы данных, чтобы пользователю упростить редактирование
        form.title.data = topic.title
        form.text.data = topic.text
        form.locked.data = topic.is_locked
        form.category.process_data(topic.category_id)
        return render("edit_topic.html", title="Редактировать тему", form=form)
Ejemplo n.º 3
0
def create_topic():
    """Страница с формой создания темы"""
    db_sess = db_session.create_session()

    form = TopicForm()
    # Сгенерируем список категорий, в которых пользователь может создать тему
    if current_user.is_admin():
        form.category.choices = [(None, "Без категории")] + \
                                [(c.id, c.title) for c in db_sess.query(Category).order_by("title")]
    else:
        form.category.choices = [(None, "Без категории")] + \
            [(c.id, c.title) for c in db_sess.query(Category).filter(Category.is_locked == False).order_by("title")]

    if form.validate_on_submit():
        topic = Topic(author_id=current_user.id,
                      title=form.title.data,
                      text=form.text.data,
                      is_locked=form.locked.data,
                      category_id=None
                      if form.category.data == "None" else form.category.data)
        db_sess.add(topic)
        db_sess.commit()

        return redirect(url_for("topic_content", id=topic.id))
    else:
        return render("create_topic.html", title="Создать тему", form=form)
Ejemplo n.º 4
0
def edit_profile():
    """Страница для изменения логина и эл. почты пользователем"""
    db_sess = db_session.create_session()
    user = db_sess.query(User).get(current_user.id)

    form = EditUserInfoForm()

    render_params = {
        "template_name_or_list": "edit_profile.html",
        "title": "Редактирование профиля",
        "form": form
    }

    if user.username == "admin":
        form.username.data = user.username

    if form.validate_on_submit():
        # Делаем проверку данных
        if db_sess.query(User).filter(
                User.id != user.id, User.username == form.username.data).all():
            return render(**render_params,
                          error="Пользователь с таким логином уже существует")
        elif db_sess.query(User).filter(User.id != user.id,
                                        User.email == form.email.data).all():
            return render(
                **render_params,
                error="Пользователь с такой эл. почтой уже существует")
        elif form.username.data == user.username and form.email.data == user.email:
            return render(**render_params,
                          error="Данные формы совпадают с исходными данными")

        # Если администратор не имеет какого-либо понятия
        if not user.username == "admin":
            user.username = form.username.data

        user.email = form.email.data
        db_sess.commit()

        return redirect(url_for("edit_profile"))
    else:
        form.username.data = user.username
        form.email.data = user.email

        return render(**render_params)
Ejemplo n.º 5
0
def edit_category(id):
    """Страница с формой редактирования категории"""
    # Проверяем, что автор комментария является текущим пользователем или является администратором
    if not current_user.is_admin():
        abort(403, "У вас нет доступа к редактированию категорий")

    db_sess = db_session.create_session()
    category = db_sess.query(Category).get(id)

    if not category:
        abort(404, "Категории с таким ID не существует")

    form = EditCategoryForm()

    if form.validate_on_submit():
        # Если была нажата кнопка "Удалить"
        if form.delete.data:
            db_sess.delete(category)
            db_sess.commit()

            return redirect(url_for("categories_list"))
        # В остальных случаях считаем, что была нажата кнопка "Сохранить"
        else:
            if category.title == form.title.data and category.is_locked == form.locked.data:
                return render(
                    "edit_category.html",
                    title="Редактировать категорию",
                    form=form,
                    error="Данные формы совпадают с исходными данными")
            else:
                category.title = form.title.data
                category.is_locked = form.locked.data
                db_sess.commit()

                return redirect(url_for("categories_list"))
    else:
        # Впишем значение из базы данных, чтобы пользователю упростить редактирование
        form.title.data = category.title
        form.locked.data = category.is_locked
        return render("edit_category.html",
                      title="Редактировать категорию",
                      form=form)
Ejemplo n.º 6
0
def edit_comment(id):
    """Редактирование комментария"""
    db_sess = db_session.create_session()
    comment = db_sess.query(Comment).get(id)

    if not comment:
        abort(404, description="Комментария с таким ID не существует")

    # Проверяем, что автор комментария является текущим пользователем или является администратором
    if (current_user.id != comment.author_id
            or comment.topic.is_locked) and not current_user.is_admin():
        abort(403,
              description="У вас нет прав на редактирование этого комментария")

    form = EditCommentForm()

    if form.validate_on_submit():
        # Если была нажата кнопка "Удалить"
        if form.delete.data:
            db_sess.delete(comment)
            db_sess.commit()

            return redirect(url_for("topic_content", id=comment.topic_id))
        # В остальных случаях считаем, что была нажата кнопка "Сохранить"
        else:
            if comment.text == form.text.data:
                return render(
                    "edit_comment.html",
                    title="Редактировать комментарий",
                    form=form,
                    error="Данные формы совпадают с исходными данными")
            else:
                comment.text = form.text.data
                db_sess.commit()

                return redirect(url_for("redirect_to_comment", id=comment.id))
    else:
        # Впишем значение из базы данных, чтобы пользователю упростить редактирование
        form.text.data = comment.text
        return render("edit_comment.html",
                      title="Редактировать комментарий",
                      form=form)
Ejemplo n.º 7
0
def login():
    """Страница с формой входа на форум"""
    form = LoginForm()

    render_data = {
        "template_name_or_list": "login.html",
        "title": "Авторизация",
        "form": form
    }

    if form.validate_on_submit():
        db_sess = db_session.create_session()
        user = db_sess.query(User).filter(
            User.username == form.username.data).first()

        # Если пользователь существует под этим логином и пароль правильный, то авторизируем его
        if user and user.check_password(form.password.data):
            login_user(user, remember=True)
            return redirect("/")
        else:
            return render(**render_data, error="Неправильный логин или пароль")

    else:
        return render(**render_data)
Ejemplo n.º 8
0
def edit_password():
    """Страница для изменения пароля от аккаунта пользователем"""
    db_sess = db_session.create_session()
    user = db_sess.query(User).get(current_user.id)

    form = EditUserPassword()

    render_params = {
        "template_name_or_list": "edit_password.html",
        "title": "Редактирование пароля",
        "form": form
    }

    if form.validate_on_submit():
        if not user.check_password(form.old_password.data):
            return render(**render_params, error="Неправильный пароль")

        # Изменяем пароль
        user.set_password(form.password.data)
        db_sess.commit()

        return redirect(url_for("index"))
    else:
        return render(**render_params)
Ejemplo n.º 9
0
def index():
    """Главная страница форума. Показываются доступные темы"""
    db_sess = db_session.create_session()
    # Группируем темы по категориям
    topics = db_sess.query(Topic).all()

    if topics:
        categories = itertools.groupby(
            sorted(topics,
                   key=lambda t: ("" if t.category is None else t.category.
                                  title, t.is_pinned, t.created_time),
                   reverse=True), lambda t: t.category)
    else:
        categories = None

    return render("index.html", categories=categories, title="Темы")
Ejemplo n.º 10
0
def categories_list():
    """Страница со списком всех категорий на форуме"""
    # Проверяем, что автор комментария является текущим пользователем или является администратором
    if not current_user.is_admin():
        abort(403, "У вас нет доступа к редактированию категорий")

    db_sess = db_session.create_session()
    categories = db_sess.query(Category).order_by("title").all()
    # Для показа кол-ва тем без категории
    no_category_length = len(
        db_sess.query(Topic).filter(Topic.category == None).all())

    return render("categories_list.html",
                  categories=categories,
                  no_category_length=no_category_length,
                  title="Категории")
Ejemplo n.º 11
0
def register():
    """Страница с формой регистрации на форуме"""
    form = RegistrationForm()

    if form.validate_on_submit():
        db_sess = db_session.create_session()

        # Записываем пользователя в базу данных
        user = User(username=form.username.data, email=form.email.data)
        user.set_password(form.password.data)
        db_sess.add(user)
        db_sess.commit()

        # Делаем авторизацию под пользователем, которого только что добавили
        login_user(user, remember=True)
        return redirect("/")
    else:
        return render("registration.html", title="Регистрация", form=form)
Ejemplo n.º 12
0
def topic_content(id):
    """Страница с комментариями из определённой темы"""
    form = CommentForm()

    db_sess = db_session.create_session()
    topic = db_sess.query(Topic).get(id)

    if form.validate_on_submit():
        # Добавляем комментарий в базу данных
        comment = Comment(author_id=current_user.id,
                          topic_id=topic.id,
                          text=form.text.data)

        db_sess.add(comment)
        db_sess.commit()

        # Переводим на последнию страницу с комментариями и ссылаемся на комментарий, оставленный пользователем
        return redirect(url_for("redirect_to_comment", id=comment.id))
    else:
        # Зарос на закрепление темы в категории
        if request.method == "POST":
            if request.form["button"] == "pin":
                topic.is_pinned = not topic.is_pinned
            elif request.form["button"] == "lock":
                topic.is_locked = not topic.is_locked
            db_sess.commit()

            return redirect(url_for("topic_content", id=topic.id))
        else:
            # Если такой ID в базе данных имеется, то выдаёт страницу с комментариями из темы
            if topic:
                # Распределение комментариев по страницам
                page = request.args.get("page", 1, type=int)
                pagination_comments = topic.get_comments_pagination()

                return render("topic.html",
                              title=topic.title,
                              topic=topic,
                              comments=pagination_comments,
                              page=page,
                              form=form)
            else:
                abort(404, description="Темы с таким ID не существует")
Ejemplo n.º 13
0
def create_category():
    """Страница с формой создания категории"""
    # Проверяем, что автор комментария является текущим пользователем или является администратором
    if not current_user.is_admin():
        abort(403, "У вас нет доступа к редактированию категорий")

    db_sess = db_session.create_session()

    form = CategoryForm()

    if form.validate_on_submit():
        category = Category(title=form.title.data, is_locked=form.locked.data)
        db_sess.add(category)
        db_sess.commit()

        return redirect(url_for("categories_list"))
    else:
        return render("create_category.html",
                      title="Создать категорию",
                      form=form)
Ejemplo n.º 14
0
def users_list():
    if not current_user.is_admin():
        abort(403, "У вас нет доступа к списку пользователей")

    db_sess = db_session.create_session()
    users = db_sess.query(User).order_by("role").all()

    if request.method == "POST":
        if request.form["button"].startswith("admin"):
            user = db_sess.query(User).get(
                int(request.form["button"].split("-")[-1]))
            user.role = Role.admin if user.role == Role.user else Role.user
        elif request.form["button"].startswith("delete"):
            user = db_sess.query(User).get(
                int(request.form["button"].split("-")[-1]))
            db_sess.delete(user)

        db_sess.commit()

        return redirect(url_for("users_list"))
    else:
        return render("users_list.html", title="Пользователи", users=users)