# HG changeset patch # User paulo # Date 1599634377 25200 # Node ID 476cb019ad9fd10f26ad912967875e464a308b3f # Parent cb963b1875f7d6dc63811d32019875a52c18ba06 add laterlinks3 diff -r cb963b1875f7 -r 476cb019ad9f laterlinks3/laterlinks_flask_app.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/laterlinks3/laterlinks_flask_app.py Tue Sep 08 23:52:57 2020 -0700 @@ -0,0 +1,127 @@ +import csv +import datetime +import os + +import flask + +from html3.html3 import HTML + +app = flask.Flask(__name__) + +PIN = os.environ.get('LLPIN') +STRTIME_FMT = "%Y-%m-%d %H:%M:%S" + + +class LLDialect(csv.Dialect): + delimiter = '\t' + quoting = csv.QUOTE_NONE + lineterminator = '\n' + + +LLDIALECT = LLDialect() +LLDB_FN = "lldb.tsv" +LLDB_UNREAD_FN = "lldb_unread.tsv" + + +class LLError(Exception): + pass + +class PinFailError(LLError): + def __str__(self): + return "PIN FAIL!" + +class PinSetupError(LLError): + def __str__(self): + return "PIN SETUP ERROR!" + +class MissingFieldsError(LLError): + def __str__(self): + return "MISSING FIELD(s)!" + + +def lldb_unread_load(): + return csv.reader(open(LLDB_UNREAD_FN), LLDIALECT) + + +def lldb_add(inp): + title = inp.get("title") + url = inp.get("url") + if not (title and url): + raise MissingFieldsError() + + dt_str = datetime.datetime.now().strftime(STRTIME_FMT) + with open(LLDB_FN, 'a') as lldb_f: + csv.writer(lldb_f, LLDIALECT).writerow([title, url, dt_str]) + with open(LLDB_UNREAD_FN, 'a') as lldb_f: + csv.writer(lldb_f, LLDIALECT).writerow([title, url, dt_str]) + + +def lldb_unread_delete(inp): + delete = inp.getlist("delete") + if not delete: + raise MissingFieldsError() + + lldb_unread = [i for i in lldb_unread_load()] + lldb_unread_f = open(LLDB_UNREAD_FN, 'w') + + try: + for i in delete: + for j in lldb_unread: + dt_str = j[2] + if i == dt_str: + lldb_unread.remove(j) + finally: + csv.writer(lldb_unread_f, LLDIALECT).writerows(lldb_unread) + lldb_unread_f.close() + + + +@app.route("/", methods=["GET", "POST"]) +def index(): + is_post = (flask.request.method == "POST") + inp = flask.request.form + cookies = flask.request.cookies + + if is_post: + if not PIN: + raise PinSetupError + elif cookies.get("llpin") != PIN: + raise PinFailError + + if inp["submit"] == "Add": + lldb_add(inp) + elif inp["submit"] == "Delete": + lldb_unread_delete(inp) + + title = "later links..." + root = HTML("html") + + header = root.head + header.link(rel="stylesheet", type="text/css", href=flask.url_for("static", filename="index.css")) + header.title(title) + + body = root.body + body.h1(title) + + form = body.form(action="/", method="post") + + table = form.table + hrow = table.tr + hrow.th("Link") + hrow.th("Created") + hrow.th.input(type="submit", name="submit", value="Delete") + + for (title, url, dt_str) in lldb_unread_load(): + row = table.tr + row.td.a(title, href=url) + row.td(dt_str) + row.td.input(type="checkbox", name="delete", value=dt_str) + + p1 = form.p + p1.label("Title").input(type="text", name="title", size="64") + p1.br + p1.label("URL").input(type="text", name="url", size="64") + p1.br + p1.input(type="submit", name="submit", value="Add") + + return str(root).encode("utf-8") diff -r cb963b1875f7 -r 476cb019ad9f laterlinks3/lldb.tsv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/laterlinks3/lldb.tsv Tue Sep 08 23:52:57 2020 -0700 @@ -0,0 +1,1 @@ +title0 url0 2020-09-08 23:50:23 diff -r cb963b1875f7 -r 476cb019ad9f laterlinks3/lldb_unread.tsv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/laterlinks3/lldb_unread.tsv Tue Sep 08 23:52:57 2020 -0700 @@ -0,0 +1,1 @@ +title0 url0 2020-09-08 23:50:23 diff -r cb963b1875f7 -r 476cb019ad9f laterlinks3/requirements.pip --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/laterlinks3/requirements.pip Tue Sep 08 23:52:57 2020 -0700 @@ -0,0 +1,8 @@ +click==7.1.2 +Flask==1.1.2 +gunicorn==20.0.4 +html3==1.18 +itsdangerous==1.1.0 +Jinja2==2.11.2 +MarkupSafe==1.1.1 +Werkzeug==1.0.1 diff -r cb963b1875f7 -r 476cb019ad9f laterlinks3/static/index.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/laterlinks3/static/index.css Tue Sep 08 23:52:57 2020 -0700 @@ -0,0 +1,21 @@ +body +{ + background-color: #111; + color: #ccc; +} + +a:link +{ + color: #831; +} + +a:visited +{ + color: gray; +} + +div { + text-align: center; + line-height: 2; + font-size: 500%; +}