First prototype
commit
3752d4cc55
@ -0,0 +1 @@
|
|||||||
|
.ipynb_checkpoints
|
@ -0,0 +1,33 @@
|
|||||||
|
# WORKINON
|
||||||
|
A small and shared archive to keep track of how ideas change during work, research and development
|
||||||
|
A call to share what we are doing with others, while we are doing it.
|
||||||
|
In a way that doesn't focus on results, but on process and sharing.
|
||||||
|
|
||||||
|
## How does it work
|
||||||
|
The core of Workinon is a small API that read and write updates to a JSON file.
|
||||||
|
The inputs can be received through a form from the application page.
|
||||||
|
|
||||||
|
## Structure of the JSON:
|
||||||
|
a list of projects, and each update has a codename and a list of steps
|
||||||
|
(since this is a first prototype this could change anytime)
|
||||||
|
(it's already changed 3 times while writing this initial documentation ah ah)
|
||||||
|
|
||||||
|
`JSON
|
||||||
|
{
|
||||||
|
"Workin title of the project or idea": [
|
||||||
|
{
|
||||||
|
"when": "13.05.2022",
|
||||||
|
"what": "First idea of the project"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
To insert a new project just send in the first step and a name
|
||||||
|
to update with a new step just refer to the name you used the first time and add the new step
|
||||||
|
|
||||||
|
this structure is not super robust.
|
||||||
|
if two different project use the same codename, this could lead to interferences between the two
|
||||||
|
so one suggestion for the usage of the Workinon could be to choose a really really really personal title
|
||||||
|
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
{"workinon": [{"when": "13.05.2022", "what": "First prototype for a small and shared archive to keep track of how ideas change during work, research and development"}, {"when": "13.05.2022", "what": "Little API to read and write new updates for projects"}, {"when": "13.05.2022", "what": "JSON test"}, {"when": "13.05.2022", "what": "JSON test and redirect"}], "k-pub": [{"when": "21.10.2021", "what": "Using karaoke as a form of republishing"}, {"when": "13.05.2022", "what": "test test it;'s a est"}], "mod cms": [{"when": "13.05.2022", "what": "store synth configurations to build a workbook"}]}
|
@ -0,0 +1,100 @@
|
|||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
max-width: 60ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: #3D9970;
|
||||||
|
max-width: 100%;
|
||||||
|
|
||||||
|
margin: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2, h3 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 40ch;
|
||||||
|
display: inline-block;
|
||||||
|
margin: 64px 0;
|
||||||
|
padding: 16px;
|
||||||
|
border: 1px dashed currentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
form > * + * {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input, textarea {
|
||||||
|
display: block;
|
||||||
|
border: 1px solid currentColor;
|
||||||
|
color: currentColor;
|
||||||
|
padding: 8px;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="submit"]{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
input[type="submit"]:hover{
|
||||||
|
color: white;
|
||||||
|
background-color: #3D9970;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 10em;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl {
|
||||||
|
max-width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl > * {
|
||||||
|
flex-grow: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
flex-basis: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
flex-basis: 70%;
|
||||||
|
margin-bottom: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 991.98px) {
|
||||||
|
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
margin: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dl {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
margin: 6px 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<link rel="stylesheet" href="{{url_for('static', filename='style.css')}}">
|
||||||
|
<title>Workinon</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>What's new?</h1>
|
||||||
|
<form action="" method="POST">
|
||||||
|
<input type="text" name="name" placeholder="Project" />
|
||||||
|
<textarea type="text" name="update" placeholder="What's new?"></textarea>
|
||||||
|
<input type="submit" value="Archive" />
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,42 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<link rel="stylesheet" href="{{url_for('static', filename='style.css')}}">
|
||||||
|
<title>Workinon</title>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Workinon</h1>
|
||||||
|
<div>
|
||||||
|
A small and shared archive to keep track of how ideas change during work, research and development. <br/>
|
||||||
|
A call to share what we are doing with others, while we are doing it. <br/>
|
||||||
|
In a way that doesn't focus on results, but on process and sharing.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="add" method="POST">
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
What's new?
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<input type="text" name="name" placeholder="Project" />
|
||||||
|
<textarea name="update" placeholder="Tell us more" ></textarea>
|
||||||
|
<input type="submit" value="Archive" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<h2>Current archive</h2>
|
||||||
|
<dl>
|
||||||
|
{% for key, value in projects | dictsort %}
|
||||||
|
<dt>{{key}}</dt>
|
||||||
|
<dd>
|
||||||
|
{%for step in value%}
|
||||||
|
{{step['when']}}, {{step['what']}} <br/>
|
||||||
|
{%endfor%}
|
||||||
|
</dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,115 @@
|
|||||||
|
# WORKINON
|
||||||
|
# A small and shared archive to keep track of how ideas change during work, research and development
|
||||||
|
# A call to share what we are doing with others, while we are doing it.
|
||||||
|
# In a way that doesn't focus on results, but on process and sharing.
|
||||||
|
|
||||||
|
# How does it work
|
||||||
|
# The core of Workinon is a small API that read and write updates to a JSON file.
|
||||||
|
# The inputs can be received through a form from the application page.
|
||||||
|
|
||||||
|
# Structure of the JSON:
|
||||||
|
# a list of projects, and each update has a codename and a list of steps
|
||||||
|
# (since this is a first prototype this could change anytime)
|
||||||
|
# (it's already changed 3 times while writing this initial documentation ah ah)
|
||||||
|
# {
|
||||||
|
# 'Workin title of the project or idea': [
|
||||||
|
# {'13.05.2022', 'First idea of the project'},
|
||||||
|
# {'14.05.2022', 'Second thoughts'},
|
||||||
|
# {'15.05.2022', 'Something new and now everything makes sense'}
|
||||||
|
# ]
|
||||||
|
# }
|
||||||
|
|
||||||
|
# To insert a new project just send in the first step and a name
|
||||||
|
# to update with a new step just refer to the name you used the first time and add the new step
|
||||||
|
|
||||||
|
# this structure is not super robust.
|
||||||
|
# if two different project use the same codename, this could lead to interferences between the two
|
||||||
|
# so one suggestion for the usage of the Workinon could be to choose a really really really personal title
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from glob import glob
|
||||||
|
from flask import Flask, render_template, request, redirect, url_for
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
# prefix to add /SOUPBOAT/ATLAS-API to all the routes
|
||||||
|
# and to leave the @app.route() decorator more clean
|
||||||
|
|
||||||
|
class PrefixMiddleware(object):
|
||||||
|
def __init__(self, app, prefix=""):
|
||||||
|
self.app = app
|
||||||
|
self.prefix = prefix
|
||||||
|
|
||||||
|
def __call__(self, environ, start_response):
|
||||||
|
|
||||||
|
if environ["PATH_INFO"].startswith(self.prefix):
|
||||||
|
environ["PATH_INFO"] = environ["PATH_INFO"][len(self.prefix):]
|
||||||
|
environ["SCRIPT_NAME"] = self.prefix
|
||||||
|
return self.app(environ, start_response)
|
||||||
|
else:
|
||||||
|
start_response("404", [("Content-Type", "text/plain")])
|
||||||
|
return ["This url does not belong to the app.".encode()]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
base_url = '/soupboat/workinon'
|
||||||
|
|
||||||
|
# create flask application
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# register the middleware to prefix all the requests with our base_url
|
||||||
|
app.wsgi_app = PrefixMiddleware(
|
||||||
|
app.wsgi_app, prefix=base_url
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# definition of the routes
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def home():
|
||||||
|
with open('archive.json', 'r') as f:
|
||||||
|
projects = json.load(f)
|
||||||
|
|
||||||
|
return render_template('home.html', projects=projects)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/add', methods=['GET', 'POST'])
|
||||||
|
def add():
|
||||||
|
if request.method == 'POST':
|
||||||
|
name = request.form.get('name')
|
||||||
|
update = request.form.get('update')
|
||||||
|
|
||||||
|
if name != '' and update != '':
|
||||||
|
with open('archive.json', 'r') as f:
|
||||||
|
projects = json.load(f)
|
||||||
|
|
||||||
|
date = datetime.date.today().strftime('%d.%m.%Y')
|
||||||
|
step = {'when': date, 'what': update}
|
||||||
|
if name in projects:
|
||||||
|
projects[name].append(step)
|
||||||
|
else:
|
||||||
|
projects[name] = [step]
|
||||||
|
|
||||||
|
with open('archive.json', 'w') as f:
|
||||||
|
f.write(json.dumps(projects))
|
||||||
|
|
||||||
|
return redirect(url_for('home'))
|
||||||
|
return render_template('add.html')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.run(port=3144)
|
Loading…
Reference in New Issue