aboutsummaryrefslogtreecommitdiffstats
path: root/views.py
blob: dd37902e3b23d7174bcc3012185e5efec4830f90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""
views.py - defines the logic that generates views that a user sees when
browsing to certain pages
"""
import os
from flask import request, send_from_directory, abort
from flask import render_template, render_template_string
from siteconfig import siteconfig
from server import app, cache
from view_functions import default_context, index_dir, is_hidden_path

# bit of a hack.
# Brackets don't play nicely with Jinja so instead of using .format,
# we just replace the special character $
CONTENT_BLOCK = (
    "{% extends 'base.html' %}{% block content %}${% endblock %}"
)


@app.route("/")
@app.route("/site")
@cache.cached()
def home():
    """
    home - renders the template `home.html` as the main index file

    If you'd like to customize your home page, that is the file you want to
    edit, though you can optionally change the title here if you wish
    """
    context = default_context()
    context.update(
        {'title': app.config['HOME_TITLE'], 'parent_dir': '/site/'}
    )
    return render_template("site/home.html", **context)


# from: https://pythonise.com/series/learning-flask/sending-files-with-flask
@app.route("/site/<path:path>")
@cache.cached()
def render_file(path):
    """
    render_file - renders an HTML document for the given `path`.

    If `path` is an HTML file it is rendered within the base template,
    otherwise, the raw file is returned. If `path` points to a directory, this
    function instead creates an index for the directory containing it's files,
    links, and other info.
    """
    if is_hidden_path(path):
        abort(404)
    abs_path = "./templates/site/" + path
    context = default_context()
    context.update(
        {
            'title': path.split('.')[0].upper(),
            'parent_dir': '/site/' + '/'.join(path.split('/')[:-1]),
        }
    )
    if os.path.isfile(abs_path):
        if abs_path.endswith('.html'):
            with open(abs_path, 'rb') as f:
                content = f.read().decode("UTF-8")
            return render_template_string(
                CONTENT_BLOCK.replace('$', content), **context
            )
        elif abs_path.endswith('.html!'):
            return render_template("site/" + path, **context)
        else:
            # not an html file, so don't render it
            return send_from_directory(
                'templates/site/',
                path,
                mimetype=siteconfig.MIMETYPES.get(
                    f".{ path.split('.')[-1] }",
                    siteconfig.DEFAULT_MIMETYPE,
                ),
            )
    elif os.path.isdir(abs_path):
        dirs, files, links, description = index_dir(abs_path)
        context.update(
            {
                'cur_path': 'site/' + path,
                'cur_dir': path.split('/')[-1] + '/',
                'dirs': dirs,
                'files': files,
                'links': links,
                'description': description,
            }
        )
        return render_template("index.html", **context)
    else:
        context.update({'errors': "404 File not found"})
        return render_template("base.html", **context)


@app.route("/raw/<path:path>")
@cache.cached()
def send_file_from_site(path):
    """
    send_file_from_site - instead of rendering a file within a template
    as with `render_file`, send the raw file to the user
    """
    return send_from_directory(
        'templates/site/',
        path,
        mimetype=siteconfig.MIMETYPES.get(
            f".{ path.split('.')[-1] }", siteconfig.DEFAULT_MIMETYPE
        ),
    )


@app.route("/static/<path:path>")
@cache.cached()
def send_file_from_static(path):
    """
    send_file_from_static - send files from the static directory
    """
    return send_from_directory(
        'static/',
        path,
        mimetype=siteconfig.MIMETYPES.get(
            f".{ path.split('.')[-1] }", siteconfig.DEFAULT_MIMETYPE
        ),
    )