async def get(self, request: HTTPConnection):
        id = request.path_params["id"]

        challenge = await Challenge.get(id)

        if challenge is None:
            return abort(404, "Challenge not found")

        if not can_edit(request):
            return abort(400)

        form = ChallengeForm(
            title=challenge.title,
            content=challenge.content,
            flag_or_answer=challenge.flag or challenge.answer,
            is_flag=challenge.flag is not None,
            hidden=challenge.hidden,
            depreciated=challenge.depreciated,
            points=challenge.points,
            tags=challenge.tags,
        )

        images = await encoded_existing_images(request)
        tags = orjson.dumps(await get_all_tags(include_hidden=True))

        return templates.TemplateResponse(
            "challenge/edit.j2",
            {
                "request": request,
                "form": form,
                "challenge": challenge,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 2
0
    async def get(self, request: HTTPConnection):
        id = request.path_params["id"]

        blog = await Blog.get(id)

        if blog is None:
            return abort(404, "Blog not found")

        if not can_edit(request):
            return abort(400)

        form = PostForm(title=blog.title, tags=blog.tags, content=blog.content)

        images = await encoded_existing_images(request)
        tags = ujson.dumps(await get_all_tags())

        return templates.TemplateResponse(
            "blog/edit.j2",
            {
                "request": request,
                "form": form,
                "blog": blog,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 3
0
    async def get(self, request: HTTPConnection):
        id = request.path_params["id"]

        writeup = await Writeup.get(id)

        if writeup is None:
            return abort(404, "Writeup not found")

        if not can_edit(request, writeup.author_id):
            return abort(400)

        form = WriteupForm(
            title=writeup.title,
            tags=writeup.tags,
            content=writeup.content,
            private=writeup.private,
        )

        images = await encoded_existing_images(request)
        tags = orjson.dumps(await get_all_tags(True))

        return templates.TemplateResponse(
            "writeups/edit.j2",
            {
                "request": request,
                "form": form,
                "writeup": writeup,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 4
0
    async def post(self, request: HTTPConnection):
        id = request.path_params["id"]

        blog = await Blog.get(id)

        if blog is None:
            return abort(404, "Blog not found")

        if not can_edit(request, blog.author_id):
            return abort(400)

        form = await request.form()

        form = PostForm(form)

        is_valid = form.validate()

        if not slug(form.title.data):
            is_valid = False
            form.title.errors.append(
                "A valid url-safe name cannot be generated for this title.")

        if blog.title != blog.title.data:
            if (await Blog.query.where(
                    sa.or_(Blog.title == form.title.data,
                           Blog.slug == slug(form.title.data))).gino.first()
                    is not None):
                is_valid = False
                form.title.errors.append(
                    f"A blog with the title '{form.title.data}' already exists."
                )

        if is_valid:
            await blog.update_auto(title=form.title.data,
                                   tags=form.tags.data,
                                   content=form.content.data).apply()

            url = request.url_for("blog_view", slug=blog.slug)
            await log_edit("blog", blog.title, request.user.username, url)

            return redirect_response(url=url)

        images = await encoded_existing_images(request)
        tags = orjson.dumps(await get_all_tags())

        return templates.TemplateResponse(
            "blog/edit.j2",
            {
                "request": request,
                "form": form,
                "blog": blog,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 5
0
    async def delete(self, request: HTTPConnection):
        uuid, ext = request.path_params["file_name"]

        image = await Image.get(uuid)

        if image.filetype != ext:
            return abort(404)

        if not can_edit(request, image.author_id):
            return abort(400)

        await image.delete()

        return Response()
async def challenge_delete(request: HTTPConnection):
    id = request.path_params["id"]

    challenge = await Challenge.get(id)

    if challenge is None:
        return abort(404, "Challenge not found")

    if not can_edit(request):
        return abort(400)

    await challenge.delete()
    await log_delete("challenge", challenge.title, request.user.username)

    return redirect_response(url=request.url_for("challenge_index"))
Esempio n. 7
0
async def blog_delete(request: HTTPConnection):
    id = request.path_params["id"]

    blog = await Blog.get(id)

    if blog is None:
        return abort(404, "Blog not found")

    if not can_edit(request):
        return abort(400)

    await blog.delete()
    await log_delete("blog", blog.name, request.user.username)

    return RedirectResponse(url=request.url_for("blog_index"))
Esempio n. 8
0
async def writeups_delete(request: HTTPConnection):
    id = request.path_params["id"]

    writeup = await Writeup.get(id)

    if writeup is None:
        return abort(404, "Writeup not found")

    if not can_edit(request, writeup.author_id):
        return abort(400)

    await writeup.delete()

    await log_delete("writeup", writeup.title, request.user.username)

    return redirect_response(url=request.url_for("writeups_index"))
    async def post(self, request: HTTPConnection):
        id = request.path_params["id"]

        writeup = await Writeup.get(id)

        if writeup is None:
            return abort(404, "Writeup not found")

        if not can_edit(request, writeup.author_id):
            return abort(400)

        form = await request.form()

        form = PostForm(form)

        if form.validate():
            await writeup.update_auto(
                author_id=request.user.discord_id,
                title=form.title.data,
                tags=form.tags.data,
                content=form.content.data,
            ).apply()

            url = request.url_for("writeups_view", slug=writeup.slug)
            await log_edit("writeup", writeup.title, request.user.username,
                           url)

            return RedirectResponse(url=url)

        images = await encoded_existing_images(request)
        tags = ujson.dumps(await get_all_tags())

        return templates.TemplateResponse(
            "writeups/edit.j2",
            {
                "request": request,
                "form": form,
                "writeup": writeup,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 10
0
    async def post(self, request: HTTPConnection):
        id = request.path_params["id"]

        blog = await Blog.get(id)

        if blog is None:
            return abort(404, "Blog not found")

        if not can_edit(request):
            return abort(400)

        form = await request.form()

        form = PostForm(form)

        if form.validate():
            await blog.update_auto(
                title=form.title.data, tags=form.tags.data, content=form.content.data
            ).apply()

            url = request.url_for("blog_view", slug=blog.slug)
            await log_edit("blog", blog.name, request.user.username, url)

            return RedirectResponse(url=url)

        images = await encoded_existing_images(request)
        tags = ujson.dumps(await get_all_tags())

        return templates.TemplateResponse(
            "blog/edit.j2",
            {
                "request": request,
                "form": form,
                "blog": blog,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 11
0
    async def post(self, request: HTTPConnection):
        id = request.path_params["id"]

        challenge = await Challenge.get(id)

        if challenge is None:
            return abort(404, "Challenge not found")

        if not can_edit(request):
            return abort(400)

        form = await request.form()

        form = ChallengeForm(form)

        is_valid = form.validate()

        if not slug(form.title.data):
            is_valid = False
            form.title.errors.append(
                "A valid url-safe name cannot be generated for this title.")

        if challenge.title != form.title.data:
            if (await Challenge.query.where(
                    sa.or_(
                        Challenge.title == form.title.data,
                        Challenge.slug == slug(form.title.data),
                    )).gino.first() is not None):
                is_valid = False
                form.title.errors.append(
                    f"A challenge with the title conflicting with '{form.title.data}' already exists."
                )

        if is_valid:
            f_a = form.flag_or_answer.data
            flag, answer = (f_a, None) if form.is_flag.data else (None, f_a)

            await challenge.update_auto(
                title=form.title.data,
                content=form.content.data,
                flag=flag,
                answer=answer,
                hidden=form.hidden.data,
                depreciated=form.depreciated.data,
                points=form.points.data,
                tags=form.tags.data,
            ).apply()

            url = request.url_for("challenge_view", slug=challenge.slug)
            if not challenge.hidden:
                await log_edit("challenge", challenge.title,
                               request.user.username, url)

            return redirect_response(url=url)

        images = await encoded_existing_images(request)
        tags = orjson.dumps(await get_all_tags(include_hidden=True))

        return templates.TemplateResponse(
            "challenge/edit.j2",
            {
                "request": request,
                "form": form,
                "challenge": challenge,
                "existing_images": images,
                "existing_tags": tags,
            },
        )
Esempio n. 12
0
    async def post(self, request: HTTPConnection):
        id = request.path_params["id"]

        writeup = await Writeup.get(id)

        if writeup is None:
            return abort(404, "Writeup not found")

        if not can_edit(request, writeup.author_id):
            return abort(400)

        form = await request.form()

        form = WriteupForm(form)

        is_valid = form.validate()

        if not slug(form.title.data):
            is_valid = False
            form.title.errors.append(
                "A valid url-safe name cannot be generated for this title."
            )

        if writeup.title != form.title.data:
            if (
                await Writeup.query.where(
                    sa.or_(
                        Writeup.title == form.title.data,
                        Writeup.slug == slug(form.title.data),
                    )
                ).gino.first()
                is not None
            ):
                is_valid = False
                form.title.errors.append(
                    f"A writeup with the title conflicting with '{form.title.data}' already exists."
                )

        if is_valid:
            await writeup.update_auto(
                title=form.title.data,
                tags=form.tags.data,
                content=form.content.data,
                private=form.private.data,
            ).apply()

            url = request.url_for("writeups_view", slug=writeup.slug)
            await log_edit("writeup", writeup.title, request.user.username, url)

            return redirect_response(url=url)

        images = await encoded_existing_images(request)
        tags = orjson.dumps(await get_all_tags(True))

        return templates.TemplateResponse(
            "writeups/edit.j2",
            {
                "request": request,
                "form": form,
                "writeup": writeup,
                "existing_images": images,
                "existing_tags": tags,
            },
        )