albertyw/albertyw.com

View on GitHub
app/routes.py

Summary

Maintainability
A
0 mins
Test Coverage
A
97%
from typing import Any
from urllib.parse import urljoin

from feedgen.feed import FeedGenerator
from flask import (
    Blueprint,
    Response,
    abort,
    redirect,
    render_template,
    request,
    url_for,
)
from varsnap import varsnap

from app import data, note_util


handlers = Blueprint('handlers', __name__)


@handlers.route("/")
def index() -> str:
    posts = note_util.get_notes_directories(
        [note_util.NOTES_DIRECTORY, note_util.REFERENCE_DIRECTORY],
    )
    return render_template("notes.htm", posts=posts)


@handlers.route("/resume")
def resume() -> str:
    return render_template("resume.htm")


@handlers.route("/projects")
def projects() -> str:
    projects = data.get_projects()
    return render_template("projects.htm", projects=projects)


@handlers.route("/notes")
@varsnap
def notes() -> Any:
    return redirect(url_for('handlers.index'))


@handlers.route("/shelf")
def shelf() -> str:
    shelf = data.get_shelf()
    return render_template("shelf.htm", shelf=shelf)


@handlers.route("/note/<slug>")
def note(slug: str = '') -> Any:
    if slug.lower() != slug:
        return redirect(url_for('handlers.note', slug=slug.lower()))
    post = note_util.get_note_from_slug(note_util.NOTES_DIRECTORY, slug)
    if not post:
        abort(404)
    return render_template("note.htm", post=post)


@handlers.route("/reference")
def references() -> Any:
    references = note_util.get_notes(note_util.REFERENCE_DIRECTORY)
    return render_template("references.htm", references=references)


@handlers.route("/reference/<slug>")
def reference(slug: str = '') -> Any:
    if slug.lower() != slug:
        return redirect(url_for('handlers.reference', slug=slug.lower()))
    post = note_util.get_note_from_slug(note_util.REFERENCE_DIRECTORY, slug)
    if not post:
        abort(404)
    return render_template("reference.htm", post=post)


@handlers.route("/about")
def about() -> str:
    return render_template("about.htm")


@handlers.route("/atom.xml")
def atom_feed() -> Any:
    fg = FeedGenerator()
    fg.title('albertyw.com')
    fg.id(request.url)
    fg.author(name='Albert Wang', email='me@albertyw.com')
    fg.link(href=request.url, rel='self')
    fg.link(href=request.url_root, rel='alternate')
    fg.language('en')
    fg.updated(note_util.get_notes(note_util.NOTES_DIRECTORY)[0].time)
    for post in list(note_util.get_notes(note_util.NOTES_DIRECTORY))[:5]:
        url = urljoin(request.url_root, post.url())

        fe = fg.add_entry()
        fe.title(post.title)
        fe.id(url)
        fe.content(post.note, type='html')
        fe.author(name='Albert Wang', email='me@albertyw.com')
        fe.source(url)
        fe.updated(post.time)
        fe.link(href=url)
    return Response(fg.atom_str(pretty=True), mimetype='application/atom+xml')


@varsnap
def sitemap_urls() -> Any:
    for post in list(note_util.get_notes(note_util.NOTES_DIRECTORY)):
        yield url_for('handlers.note', slug=post.slug, _external=True)
    for post in list(note_util.get_notes(note_util.REFERENCE_DIRECTORY)):
        yield url_for('handlers.reference', slug=post.slug, _external=True)