Module app.api.templates
View Source
import asyncio
from contextlib import suppress
from sanic import Blueprint, response
from sanic.exceptions import abort
from sanic_openapi import doc
from .. import helpers
from ..models import Template
blueprint = Blueprint("templates", url_prefix="/templates")
@blueprint.get("/")
@doc.summary("List all templates")
@doc.produces(
# Can't use doc.List(Template) because the jsonify method is slightly different
doc.List(
{
"name": str,
"key": str,
"styles": doc.List(str),
"blank": str,
"sample": str,
"source": str,
"_self": str,
}
),
description="Successfully returned a list of all templates",
content_type="application/json",
)
async def index(request):
data = await asyncio.to_thread(helpers.get_valid_templates, request)
return response.json(data)
@blueprint.get("/<key>")
@doc.summary("View a specific template")
@doc.operation("templates.detail")
@doc.produces(
{
"name": str,
"key": str,
"styles": doc.List(str),
"blank": str,
"sample": str,
"source": str,
"_self": str,
},
description="Successfully returned a specific templates",
content_type="application/json",
)
@doc.response(404, str, description="Template not found")
async def detail(request, key):
template = Template.objects.get_or_none(key)
if template:
return response.json(template.jsonify(request.app))
abort(404)
@blueprint.post("/custom")
@doc.summary("Create a meme from any image")
@doc.consumes(
doc.JsonBody(
{"image_url": str, "text_lines": [str], "extension": str, "redirect": bool}
),
content_type="application/json",
location="body",
)
@doc.response(
201, {"url": str}, description="Successfully created a meme from a custom image"
)
async def custom(request):
if request.form:
payload = dict(request.form)
with suppress(KeyError):
payload["text_lines"] = payload.pop("text_lines[]")
else:
payload = request.json
url = Template("_custom").build_custom_url(
request.app,
payload.get("text_lines") or [],
background=payload.get("image_url", ""),
extension=payload.get("extension", ""),
)
if payload.get("redirect", False):
return response.redirect(url)
return response.json({"url": url}, status=201)
@blueprint.post("/<key>")
@doc.summary("Create a meme from a template")
@doc.operation("templates.create")
@doc.consumes(
doc.JsonBody({"text_lines": [str], "extension": str, "redirect": bool}),
content_type="application/json",
location="body",
)
@doc.response(
201, {"url": str}, description="Successfully created a meme from a template"
)
async def build(request, key):
if request.form:
payload = dict(request.form)
with suppress(KeyError):
payload["text_lines"] = payload.pop("text_lines[]")
else:
payload = request.json
template = Template.objects.get(key)
url = template.build_custom_url(
request.app,
payload.get("text_lines") or [],
extension=payload.get("extension"),
)
if payload.get("redirect", False):
return response.redirect(url)
return response.json({"url": url}, status=201)
Variables
blueprint
Functions
build
def build(
request,
key
)
View Source
@blueprint.post("/<key>")
@doc.summary("Create a meme from a template")
@doc.operation("templates.create")
@doc.consumes(
doc.JsonBody({"text_lines": [str], "extension": str, "redirect": bool}),
content_type="application/json",
location="body",
)
@doc.response(
201, {"url": str}, description="Successfully created a meme from a template"
)
async def build(request, key):
if request.form:
payload = dict(request.form)
with suppress(KeyError):
payload["text_lines"] = payload.pop("text_lines[]")
else:
payload = request.json
template = Template.objects.get(key)
url = template.build_custom_url(
request.app,
payload.get("text_lines") or [],
extension=payload.get("extension"),
)
if payload.get("redirect", False):
return response.redirect(url)
return response.json({"url": url}, status=201)
custom
def custom(
request
)
View Source
@blueprint.post("/custom")
@doc.summary("Create a meme from any image")
@doc.consumes(
doc.JsonBody(
{"image_url": str, "text_lines": [str], "extension": str, "redirect": bool}
),
content_type="application/json",
location="body",
)
@doc.response(
201, {"url": str}, description="Successfully created a meme from a custom image"
)
async def custom(request):
if request.form:
payload = dict(request.form)
with suppress(KeyError):
payload["text_lines"] = payload.pop("text_lines[]")
else:
payload = request.json
url = Template("_custom").build_custom_url(
request.app,
payload.get("text_lines") or [],
background=payload.get("image_url", ""),
extension=payload.get("extension", ""),
)
if payload.get("redirect", False):
return response.redirect(url)
return response.json({"url": url}, status=201)
detail
def detail(
request,
key
)
View Source
@blueprint.get("/<key>")
@doc.summary("View a specific template")
@doc.operation("templates.detail")
@doc.produces(
{
"name": str,
"key": str,
"styles": doc.List(str),
"blank": str,
"sample": str,
"source": str,
"_self": str,
},
description="Successfully returned a specific templates",
content_type="application/json",
)
@doc.response(404, str, description="Template not found")
async def detail(request, key):
template = Template.objects.get_or_none(key)
if template:
return response.json(template.jsonify(request.app))
abort(404)
index
def index(
request
)
View Source
@blueprint.get("/")
@doc.summary("List all templates")
@doc.produces(
# Can't use doc.List(Template) because the jsonify method is slightly different
doc.List(
{
"name": str,
"key": str,
"styles": doc.List(str),
"blank": str,
"sample": str,
"source": str,
"_self": str,
}
),
description="Successfully returned a list of all templates",
content_type="application/json",
)
async def index(request):
data = await asyncio.to_thread(helpers.get_valid_templates, request)
return response.json(data)