Browse Source

2020.07.18.1 (#6)

master 2020.07.19.1
Craig Oates 6 months ago
committed by Gitea
parent
commit
384cce92ab
40 changed files with 680 additions and 2 deletions
  1. +1
    -0
      .gitignore
  2. +2
    -2
      README.md
  3. +106
    -0
      app/app.py
  4. +0
    -0
      app/services/art_services.py
  5. +74
    -0
      app/services/chart_services.py
  6. +35
    -0
      app/services/data_services.py
  7. +1
    -0
      app/static/coblob-data
  8. BIN
      app/static/favicons/android-chrome-192x192.png
  9. BIN
      app/static/favicons/android-chrome-256x256.png
  10. BIN
      app/static/favicons/apple-touch-icon.png
  11. +12
    -0
      app/static/favicons/browserconfig.xml
  12. BIN
      app/static/favicons/favicon-16x16.png
  13. BIN
      app/static/favicons/favicon-32x32.png
  14. BIN
      app/static/favicons/favicon.ico
  15. BIN
      app/static/favicons/mstile-144x144.png
  16. BIN
      app/static/favicons/mstile-150x150.png
  17. BIN
      app/static/favicons/mstile-310x150.png
  18. BIN
      app/static/favicons/mstile-310x310.png
  19. BIN
      app/static/favicons/mstile-70x70.png
  20. +21
    -0
      app/static/favicons/safari-pinned-tab.svg
  21. +18
    -0
      app/static/favicons/site.webmanifest
  22. BIN
      app/static/fonts/avenir.otf
  23. BIN
      app/static/images/site-logo.png
  24. +1
    -0
      app/static/scripts/art.js
  25. +1
    -0
      app/static/scripts/software.js
  26. +1
    -0
      app/static/scripts/writing.js
  27. +201
    -0
      app/static/styles/main.css
  28. +6
    -0
      app/templates/about.html
  29. +53
    -0
      app/templates/art.html
  30. +9
    -0
      app/templates/error.html
  31. +12
    -0
      app/templates/favicons.html
  32. +7
    -0
      app/templates/footer.html
  33. +39
    -0
      app/templates/home.html
  34. +19
    -0
      app/templates/layout.html
  35. +15
    -0
      app/templates/nav.html
  36. +3
    -0
      app/templates/scripts.html
  37. +10
    -0
      app/templates/software.html
  38. +10
    -0
      app/templates/writing.html
  39. BIN
      attachments/co-data-logo.png
  40. +23
    -0
      requirements.txt

+ 1
- 0
.gitignore View File

@ -1,3 +1,4 @@
/app/static/coblob-data
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/


+ 2
- 2
README.md View File

@ -1,3 +1,3 @@
# co-data
# ![CO Data Logo](attachments/co-data-logo.png) CO Data
A Python based website displaying information about Craig's work.
A Python based website displaying information about Craig's work.

+ 106
- 0
app/app.py View File

@ -0,0 +1,106 @@
from bokeh.plotting import figure, output_file, show
from bokeh.embed import components
from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource
from bokeh.palettes import Blues256
from bokeh.plotting import figure
from bokeh.transform import factor_cmap
from flask import Flask, render_template
import requests
from datetime import datetime
from services import art_services, data_services, chart_services
import pdb
app = Flask(__name__)
@app.route("/")
def home():
return render_template("home.html")
@app.route("/about")
def about():
return render_template("about.html")
@app.route("/art")
def art():
try:
# directory = data_services.get_home_path()
# directory1 = data_services.get_data_file("art_creation_dates.json")
# print(f"THE DIRECTORY IS {directory1}")
ld = data_services.load_json # For brevity (load data).
# cd_totals = ld(f"{directory}/coblob-data/art_creation_dates.json")
cd_totals = ld(data_services.get_data_file("art_creation_dates.json"))
year_chart = chart_services.build_creation_date_chart(
cd_totals[0], "By Year")
month_chart = chart_services.build_creation_date_chart(
cd_totals[1], "By Month")
day_chart = chart_services.build_creation_date_chart(
cd_totals[2], "By Day")
# cat_totals = ld(f"{directory}/coblob-data/art_category.json")
cat_totals = ld(data_services.get_data_file("art_category.json"))
cat_chart = chart_services.build_sorted_chart(
cat_totals, "By Category")
# med_totals = ld(f"{directory}/coblob-data/art_medium.json")
med_totals = ld(data_services.get_data_file("art_medium.json"))
med_chart = chart_services.build_sorted_chart(med_totals, "By Medium")
# width_totals = ld(f"{directory}/coblob-data/art_width.json")
width_totals = ld(data_services.get_data_file("art_width.json"))
width_chart = chart_services.build_sorted_chart(
width_totals, "By Width")
# height_totals = ld(f"{directory}/coblob-data/art_height.json")
height_totals = ld(data_services.get_data_file("art_height.json"))
height_chart = chart_services.build_sorted_chart(
height_totals, "By Height")
# depth_totals = ld(f"{directory}/coblob-data/art_depth.json")
depth_totals = ld(data_services.get_data_file("art_depth.json"))
depth_chart = chart_services.build_sorted_chart(
depth_totals, "By Depth")
date = datetime.now().strftime('%d/%m/%Y')
time = datetime.now().strftime("%H:%M")
return render_template("art.html", date=date, time=time,
y_script=year_chart[0], y_div=year_chart[1],
m_script=month_chart[0], m_div=month_chart[1],
d_script=day_chart[0], d_div=day_chart[1],
cat_script=cat_chart[0], cat_div=cat_chart[1],
med_script=med_chart[0], med_div=med_chart[1],
wid_script=width_chart[0], wid_div=width_chart[1],
height_script=height_chart[0], height_div=height_chart[1],
depth_script=depth_chart[0], depth_div=depth_chart[1])
except Exception as arg:
print(f"ERROR: [/art] {arg}")
return render_template("error.html")
@app.route("/software")
def software():
try:
# Add request for data from API here.
return render_template("software.html")
except:
return render_template("error.html")
@app.route("/writing")
def writing():
try:
# Add request for data from API here.
return render_template("writing.html")
except:
return render_template("error.html")
if __name__ == "__main__":
app.debug = True
app.run(host="0.0.0.0")

+ 0
- 0
app/services/art_services.py View File


+ 74
- 0
app/services/chart_services.py View File

@ -0,0 +1,74 @@
from bokeh.plotting import figure, output_file, show
from bokeh.embed import components
from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource
from bokeh.palettes import Blues256, Category20c
from bokeh.plotting import figure
from bokeh.transform import factor_cmap, cumsum
def build_creation_date_chart(data, title):
units = list(data.keys())
totals = list(data.values())
if title == "By Year":
units.reverse()
totals.reverse()
source = ColumnDataSource(data=dict(units=units, totals=totals))
chart = figure(x_range=units, plot_height=350, plot_width=800,
toolbar_location=None, title=title)
chart.vbar(x='units', top='totals', width=0.9, source=source,
legend_field="units",line_color='white',
fill_color=factor_cmap('units', palette=Blues256, factors=units))
chart.title.text_font_size = '18pt'
chart.title.text_font = "intended, sans-serif"
chart.title.text_color = "#424242"
chart.outline_line_color = "#424242"
chart.xgrid.grid_line_color = None
chart.ygrid.grid_line_color = "#424242"
chart.y_range.start = 0
chart.y_range.end = (max(totals) + 10)
chart.background_fill_color = "#f5f5f6"
chart.border_fill_color = "#f5f5f6"
chart.legend.visible = False
script, div = components(chart)
return [script, div]
def build_sorted_chart(data, title):
d = sorted(data.items())
totals = list()
units = list()
for i in d:
units.append(i[0])
totals.append(i[1])
source = ColumnDataSource(data=dict(units=units, totals=totals))
chart = figure(x_range=units, plot_height=350, plot_width=800,
toolbar_location=None, title=title)
chart.vbar(x='units', top='totals', width=0.9, source=source,
legend_field="units",line_color='white',
fill_color=factor_cmap('units', palette=Blues256, factors=units))
chart.title.text_font_size = '18pt'
chart.title.text_font = "intended, sans-serif"
chart.title.text_color = "#424242"
chart.outline_line_color = "#424242"
chart.xgrid.grid_line_color = None
chart.ygrid.grid_line_color = "#424242"
chart.y_range.start = 0
chart.y_range.end = (max(totals) + 10)
chart.background_fill_color = "#f5f5f6"
chart.border_fill_color = "#f5f5f6"
chart.legend.visible = False
script, div = components(chart)
return [script, div]

+ 35
- 0
app/services/data_services.py View File

@ -0,0 +1,35 @@
import requests
import json
from pathlib import Path
import os
from flask import current_app
def get_data(url):
return requests.get(url)
def get_json(url):
return requests.get(url).json()
def load_json(path):
with open (path) as json_data:
data = json.load(json_data)
return data
def load_txt(path):
with open(path, "r") as f:
data = f.read()
return data
def form_path(string):
if os.path.isdir(string):
return string
else:
raise NotADirectoryError(string)
def get_home_path():
return str(Path.home())
def get_data_file(name):
res = current_app.open_resource(f"static/coblob-data/{name}")
#art_category.json")
return res.name

+ 1
- 0
app/static/coblob-data View File

@ -0,0 +1 @@
/home/craig/coblob-data/

BIN
app/static/favicons/android-chrome-192x192.png View File

Before After
Width: 192  |  Height: 192  |  Size: 9.2 KiB

BIN
app/static/favicons/android-chrome-256x256.png View File

Before After
Width: 256  |  Height: 256  |  Size: 12 KiB

BIN
app/static/favicons/apple-touch-icon.png View File

Before After
Width: 180  |  Height: 180  |  Size: 3.1 KiB

+ 12
- 0
app/static/favicons/browserconfig.xml View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="/favicons/mstile-70x70.png"/>
<square150x150logo src="/favicons/mstile-150x150.png"/>
<square310x310logo src="/favicons/mstile-310x310.png"/>
<wide310x150logo src="/favicons/mstile-310x150.png"/>
<TileColor>#e6e6e6</TileColor>
</tile>
</msapplication>
</browserconfig>

BIN
app/static/favicons/favicon-16x16.png View File

Before After
Width: 16  |  Height: 16  |  Size: 704 B

BIN
app/static/favicons/favicon-32x32.png View File

Before After
Width: 32  |  Height: 32  |  Size: 1.0 KiB

BIN
app/static/favicons/favicon.ico View File

Before After

BIN
app/static/favicons/mstile-144x144.png View File

Before After
Width: 144  |  Height: 144  |  Size: 6.6 KiB

BIN
app/static/favicons/mstile-150x150.png View File

Before After
Width: 270  |  Height: 270  |  Size: 3.3 KiB

BIN
app/static/favicons/mstile-310x150.png View File

Before After
Width: 558  |  Height: 270  |  Size: 3.9 KiB

BIN
app/static/favicons/mstile-310x310.png View File

Before After
Width: 558  |  Height: 558  |  Size: 14 KiB

BIN
app/static/favicons/mstile-70x70.png View File

Before After
Width: 128  |  Height: 128  |  Size: 2.3 KiB

+ 21
- 0
app/static/favicons/safari-pinned-tab.svg View File

@ -0,0 +1,21 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="260.000000pt" height="260.000000pt" viewBox="0 0 260.000000 260.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,260.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1085 2584 c-629 -110 -1085 -650 -1085 -1284 0 -718 582 -1300 1300
-1300 718 0 1300 582 1300 1300 0 562 -359 1058 -893 1235 -56 18 -144 40
-196 49 -115 19 -316 19 -426 0z m440 -402 c39 -10 98 -31 133 -45 73 -30 224
-127 219 -141 -2 -5 -58 -41 -125 -79 l-123 -70 -67 31 c-94 42 -163 57 -267
56 -176 -1 -311 -59 -440 -189 -132 -131 -188 -265 -188 -445 0 -180 56 -314
188 -445 131 -132 265 -188 445 -188 104 0 193 19 271 58 l47 24 131 -76 131
-76 -52 -39 c-203 -148 -504 -205 -748 -142 -327 85 -577 336 -666 669 -26 99
-26 331 0 430 94 354 367 612 721 681 96 19 298 12 390 -14z"/>
</g>
</svg>

+ 18
- 0
app/static/favicons/site.webmanifest View File

@ -0,0 +1,18 @@
{
"name": "CO-Data",
"short_name": "CO-Data",
"icons": [
{
"src": "/favicons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/favicons/android-chrome-256x256.png",
"sizes": "256x256",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff"
}

BIN
app/static/fonts/avenir.otf View File


BIN
app/static/images/site-logo.png View File

Before After
Width: 128  |  Height: 128  |  Size: 1.2 KiB

+ 1
- 0
app/static/scripts/art.js View File

@ -0,0 +1 @@
console.log("[Info] art.js loaded.");

+ 1
- 0
app/static/scripts/software.js View File

@ -0,0 +1 @@
console.log("[Info] software.js loaded.");

+ 1
- 0
app/static/scripts/writing.js View File

@ -0,0 +1 @@
console.log("[Info] writing.js loaded.");

+ 201
- 0
app/static/styles/main.css View File

@ -0,0 +1,201 @@
/* Default/Mobile Styles
====================================================================
This stylesheet applies a mobile-first approach to styling the
intended webpages of the co-data project. Because of this, there are
no media queries until to get to tablet/laptop screen sizes. These
style-rules are futher down this page and are used to overwrite the
rules established in this "Default" section.
*/
/* Colour Values
=================
blue: #0071bc
white: #f5f5f6
black: #424242
*/
@font-face {
font-family: intended;
src: url(../fonts/avenir.otf);
}
body {
font-family: intended;
background: #f5f5f6;
color: #424242;
}
.home_page {
padding: 0;
margin: 0;
}
.home_page header {
color: #424242;
padding: 0px;
margin: 10px;
border-bottom: 2px solid #424242;
}
.home_page header a {
position: absolute;
right: 10px;
top: 10px;
width: 40px;
height: 40px;
background-color: #424242;
border-radius: 20px;
display: flex;
justify-content: center;
align-items: center;
}
.home_page a:hover {
background: orange;
}
.home_page header a img {
width: 30px;
height: 30px;
}
.home_page header h1 {
padding: 0;
margin: 0;
}
.home_page header h1 {
font-size: 28px;
}
.home_page header h2 {
font-size: 19px;
}
.home_page .title {
color: #f5f5f6;
text-align: center;
border-bottom: 4px solid #424242;
margin: 10px 10px 0 10px;
}
.home_page section {
margin: 0 10px;
}
.section_link {
display: flex;
flex-direction: row;
align-items: flex-end;
align-content: space-between;
padding: 10px 0 10px 0;
border-bottom: 2px solid #424242;
text-decoration: none;
}
.section_link:hover {
background: orange;
}
.section_link .link_title {
font-size: 40px;
color: #f5f5f6;
min-width: 200px;
}
.section_link .link_description {
color: #424242;
flex-grow: 1;
}
.home_page .home_footer {
margin: 10px;
text-align: right;
color: #424242;
border: none;
padding: 0;
}
nav {
border-bottom: 2px solid #424242;
}
nav {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: flex-start;
padding: 0 0 10px 0;
}
nav p,
nav ul {
margin: 0;
padding: 0;
}
nav ul {
list-style: none;
}
nav ul li {
width: 75px;
/* background: orange; */
}
nav ul li a {
color: #424242;
}
footer {
border-top: 2px solid #424242;
padding: 10px 0 10px 0;
}
footer ul {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
padding: 0;
margin: 0;
}
footer ul li {
list-style: none;
margin: 0 10px 0 0;
}
footer ul li a {
color: #424242;
}
main h1 {
border-bottom: 2px solid #424242;
}
main section {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
padding: 0;
margin: 0;
}
main section ul {
padding: 0;
margin: 0;
list-style: none;
}
/* Tablet Styles
==================================================================== */
@media only screen and (min-width: 600px) {
}
/* Laptop/Desktop Styles
==================================================================== */
@media only screen and (min-width: 900px) {
}

+ 6
- 0
app/templates/about.html View File

@ -0,0 +1,6 @@
{% extends "layout.html" %}
{% block content %}
{% include "nav.html" %}
<h1>About Page</h1>
{% include "footer.html" %}
{% endblock content %}

+ 53
- 0
app/templates/art.html View File

@ -0,0 +1,53 @@
{% extends "layout.html" %}
{% block content %}
{% include "nav.html" %}
<main>
<h1>Art</h1>
<section>
<p>Data generated on {{ date }} at {{ time }}.</p>
<div>
<p>This is some text which will eventually provide a summary of this page.</p>
</div>
<div class="chart-card">
{{ y_script | safe }}
{{ y_div | safe }}
<p>This is some text which will eventually provide information about the chart above it.</p>
</div>
<!-- <div> -->
<!-- <h2>Titles</h2> -->
<!-- <ul> -->
<!-- { for item in data } -->
<!-- <li>{item.title}</li> -->
<!-- { endfor } -->
<!-- </ul> -->
<!-- </div> -->
{{ m_script | safe }}
{{ m_div | safe }}
{{ d_script | safe }}
{{ d_div | safe }}
{{ cat_script | safe }}
{{ cat_div | safe }}
{{ med_script | safe }}
{{ med_div | safe }}
{{ wid_script | safe }}
{{ wid_div | safe }}
{{ height_script | safe }}
{{ height_div | safe }}
{{ depth_script | safe }}
{{ depth_div | safe }}
</section>
</main>
{% include "footer.html" %}
{% include "scripts.html" %}
<script src="{{ url_for('static',filename='scripts/art.js') }}"></script>
{% endblock content %}

+ 9
- 0
app/templates/error.html View File

@ -0,0 +1,9 @@
{% extends "layout.html" %}
{% block content %}
{% include "nav.html" %}
<main>
<h1>Error</h1>
<p>Unable to retrieve the data to populate the graphs for the requested page. Please try again and if the problem persists, please submit an issue <a href="https://git.abbether.net/craig.oates/co-data/issues" title="This is a link to where the source code for this project is held. You will find an 'issues' section on the site which you can use to relay bugs/errors and monitor their progress whilst they are in the process of being fixed.">here</a>.
</main>
{% include "footer.html" %}
{% endblock content %}

+ 12
- 0
app/templates/favicons.html View File

@ -0,0 +1,12 @@
<link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='favicons/apple-touch-icon.png') }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicons/favicon-32x32.png') }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicons/favicon-16x16.png') }}">
<link rel="manifest" href="{{ url_for('static', filename='favicons/site.webmanifest') }}">
<link rel="mask-icon" href="/favicons/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="{{ url_for('static', filename='favicons/favicon.ico') }}">
<meta name="apple-mobile-web-app-title" content="CO-Data">
<meta name="application-name" content="CO-Data">
<meta name="msapplication-TileColor" content="#e6e6e6">
<meta name="msapplication-TileImage" content="{{ url_for('static', filename='favicons/mstile-144x144.png') }}">
<meta name="msapplication-config" content="{{ url_for('static', filename='favicons/browserconfig.xml') }}">
<meta name="theme-color" content="#ffffff">

+ 7
- 0
app/templates/footer.html View File

@ -0,0 +1,7 @@
<footer>
<ul>
<li><a href="https://www.craigoates.net" title="Click here to go to Craig's main site and view the actual content this site provides statistics on.">Main Site</a></li>
<li><a href="https://git.abbether.net/craig.oates/co-data" title="Click here for access to this site's source code.">Source Code</a></li>
<li><a href="https://api.craigoates.net" title="Click here for access to the data presented here as a REST A.P.I.">REST A.P.I.</a></li>
</ul>
</footer>

+ 39
- 0
app/templates/home.html View File

@ -0,0 +1,39 @@
{% extends "layout.html" %}
{% block content %}
<style>
body {background: #0071bc;}
</style>
<section class="home_page">
<header>
<h1>data.</h1>
<h1>craigoates</h1>
<h1>.net</h1>
<a href="https://www.craigoates.net" title="Click this to go to Craig's main website: craigoates.net">
<img src="{{ url_for("static", filename="images/site-logo.png") }}" alt"craigoates.net logo"/>
</a>
</header>
<div class="title">
<h1>CO-Data Project</h1>
</div>
<section>
<a class="section_link" href="{{ url_for("about") }}" title="Click this to go to the about section of this site.">
<div class="link_title">About</div>
<div class="link_description">For information about this website and Craig.</div>
</a>
<a class="section_link" href="{{ url_for("art") }}" title="Click this to view data on Craig's artwork.">
<div class="link_title">Art</div>
<div class="link_description">Provides information about Craig's artwork.</div>
</a>
<a class="section_link" href="{{ url_for("software") }}" title="Click this to view data on Craig's software projects.">
<div class="link_title">Software</div>
<div class="link_description">For information on the various software projects Craig has made.</div>
</a><a class="section_link" href="{{ url_for("writing") }}" title="Click this to view data on the various blog posts written by Craig.">
<div class="link_title">Writing</div>
<div class="link_description">For information on the various blog posts/articles written by Craig.</div>
</a>
</section>
<footer class="home_footer">
<p>Version: 0.0.1-alpha</p>
</footer>
</section>
{% endblock content %}

+ 19
- 0
app/templates/layout.html View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% if title %}
<title>CO-Data: {{ title }}</title>
{% else %}
<title>CO-Data</title>
{% endif %}
<meta name="description" content="Explore the meta-data of the work by Craig Oates. See which month in the year he produces the most artwork, what type of artwork he has produced the most of or which platform he has written the most software for. All of this data is presented in beautiful charts and free for you to play around with.">
<meta name="author" content="Craig Oates">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type= "text/css" href="{{ url_for('static',filename='styles/main.css') }}">
{% include "favicons.html" %}
</head>
<body>
{% block content%}{% endblock %}
</body>
</html>

+ 15
- 0
app/templates/nav.html View File

@ -0,0 +1,15 @@
<nav>
<p>data.
<br>
craigoates.
<br>
.net
</p>
<ul>
<li><a href="{{ url_for("home") }}" title="Click here to return to the home screen.">Home</a></li>
<li><a href="{{ url_for("about") }}" title="Click here for information about this site.">About</a></li>
<li><a href="{{ url_for("art") }}" title="Click here for information about Craig's artwork.">Art</a></li>
<li><a href="{{ url_for("software") }}" title="Click here for information about Craig's software.">Software</a></li>
<li><a href="{{ url_for("writing") }}" title="Click here for information on Craig's blog posts/articles">Writing</a></li>
</ul>
</nav>

+ 3
- 0
app/templates/scripts.html View File

@ -0,0 +1,3 @@
<script src="{{ url_for('static',filename='scripts/d3.js') }}"></script>
<link rel="stylesheet" href="http://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.css" type="text/css" />
<script type="text/javascript" src="http://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js"></script>

+ 10
- 0
app/templates/software.html View File

@ -0,0 +1,10 @@
{% extends "layout.html" %}
{% block content %}
{% include "nav.html" %}
<main>
<h1>Software</h1>
</main>
{% include "footer.html" %}
{% include "scripts.html" %}
<script src="{{ url_for('static',filename='scripts/software.js') }}"></script>
{% endblock content %}

+ 10
- 0
app/templates/writing.html View File

@ -0,0 +1,10 @@
{% extends "layout.html" %}
{% block content %}
{% include "nav.html" %}
<main>
<h1>Writing</h1>
</main>
{% include "footer.html" %}
{% include "scripts.html" %}
<script src="{{ url_for('static',filename='scripts/writing.js') }}"></script>
{% endblock content %}

BIN
attachments/co-data-logo.png View File

Before After
Width: 48  |  Height: 48  |  Size: 1.6 KiB

+ 23
- 0
requirements.txt View File

@ -0,0 +1,23 @@
bokeh==1.4.0
certifi==2019.11.28
chardet==3.0.4
Click==7.0
Flask==1.1.1
gunicorn==20.0.4
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
numpy==1.18.1
packaging==20.0
Pillow==7.0.0
pkg-resources==0.0.0
pyparsing==2.4.6
python-dateutil==2.8.1
PyYAML==5.3
requests==2.22.0
six==1.13.0
supervisor==4.1.0
tornado==6.0.3
urllib3==1.25.7
Werkzeug==0.16.0

Loading…
Cancel
Save