From e3d6613bd4a33d41489b3d85a8be2513ef49b435 Mon Sep 17 00:00:00 2001 From: cube Date: Mon, 16 Mar 2026 13:11:56 +0000 Subject: [PATCH] add members config file to enable/disable registration and other future admin settings --- README.md | 22 +++++++++++++- myriad/__init__.py | 13 ++++----- myriad/auth.py | 48 +++++++++++++++++-------------- myriad/home.py | 8 +++++- myriad/manage.py | 36 +++++++++++++++++++++++ myriad/static/icons/any.jpg | Bin 0 -> 25786 bytes myriad/static/style.css | 5 ++++ myriad/templates/base.html | 17 +++++++++-- myriad/templates/full.html | 25 ++++++++++++++++ myriad/templates/manage/new.html | 15 ++++++++++ 10 files changed, 156 insertions(+), 33 deletions(-) create mode 100644 myriad/manage.py create mode 100644 myriad/static/icons/any.jpg create mode 100644 myriad/templates/full.html create mode 100644 myriad/templates/manage/new.html diff --git a/README.md b/README.md index 268771b..8db1ed3 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,24 @@ flask app for plurals to publicly share member lists - after cloning, run `py -3 -m venv .venv` in the root directory and then `.venv\Scripts\activate` - then `pip install Flask` inside the virtual env - you might also need to init a database, so use `flask --app myriad init-db` -- to start the site use `flask --app myriad run --debug` \ No newline at end of file +- to start the site use `flask --app myriad run --debug` + +# prod set up + +- not ready yet + +# config + +- create `config.py` in the instance folder and customise the following settings to your needs +``` +REGISTRATION: False # only set to True if in a development situation, or to create your first user +``` + +# usage + +- the software here is free to use, and there's no requirement to link back +- edit the styles and functionality to suit your needs. i'm sure some of you out there are far better with CSS than I am + +# dependencies + +- Flask \ No newline at end of file diff --git a/myriad/__init__.py b/myriad/__init__.py index ad5709e..a9124d7 100644 --- a/myriad/__init__.py +++ b/myriad/__init__.py @@ -11,15 +11,11 @@ def create_app(test_config=None): DATABASE=os.path.join(app.instance_path, 'database.sqlite'), ) - if test_config is None: - # load the instance config, if it exists, when not testing - app.config.from_pyfile('config.py', silent=True) - else: - # load the test config if passed in - app.config.from_mapping(test_config) - # ensure the instance folder exists os.makedirs(app.instance_path, exist_ok=True) + + app.config.from_pyfile('config.py') + #print(app.config["REGISTRATION"]) from . import db db.init_app(app) @@ -31,4 +27,7 @@ def create_app(test_config=None): app.register_blueprint(home.bp) app.add_url_rule('/', endpoint='index') + from . import manage + app.register_blueprint(manage.bp) + return app \ No newline at end of file diff --git a/myriad/auth.py b/myriad/auth.py index 50afc49..ce13c95 100644 --- a/myriad/auth.py +++ b/myriad/auth.py @@ -1,7 +1,7 @@ import functools from flask import ( - Blueprint, flash, g, redirect, render_template, request, session, url_for + Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app ) from werkzeug.security import check_password_hash, generate_password_hash @@ -9,8 +9,34 @@ from myriad.db import get_db bp = Blueprint('auth', __name__, url_prefix='/auth') +def login_required(view): + @functools.wraps(view) + def wrapped_view(**kwargs): + if g.user is None: + return redirect(url_for('auth.login')) + + return view(**kwargs) + + return wrapped_view + + +@bp.before_app_request +def load_logged_in_user(): + user_id = session.get('user_id') + + if user_id is None: + g.user = None + else: + g.user = get_db().execute( + 'SELECT * FROM user WHERE id = ?', (user_id,) + ).fetchone() + + + @bp.route('/register', methods=('GET', 'POST')) def register(): + if current_app.config["REGISTRATION"] == False and g.user is None: + return redirect(url_for("index")) if request.method == 'POST': username = request.form['username'] password = request.form['password'] @@ -63,17 +89,6 @@ def login(): return render_template('auth/login.html') -@bp.before_app_request -def load_logged_in_user(): - user_id = session.get('user_id') - - if user_id is None: - g.user = None - else: - g.user = get_db().execute( - 'SELECT * FROM user WHERE id = ?', (user_id,) - ).fetchone() - @bp.route('/logout') def logout(): @@ -81,12 +96,3 @@ def logout(): return redirect(url_for('index')) -def login_required(view): - @functools.wraps(view) - def wrapped_view(**kwargs): - if g.user is None: - return redirect(url_for('auth.login')) - - return view(**kwargs) - - return wrapped_view \ No newline at end of file diff --git a/myriad/home.py b/myriad/home.py index 28d5beb..d7fc3ce 100644 --- a/myriad/home.py +++ b/myriad/home.py @@ -16,4 +16,10 @@ def index(): # ' FROM post p JOIN user u ON p.author_id = u.id' # ' ORDER BY created DESC' # ).fetchall() - return render_template('index.html') \ No newline at end of file + return render_template('index.html') + +@bp.route('/full') +def full_list(): + db = get_db() + members = db.execute('SELECT * FROM member ORDER BY member_name').fetchall() + return render_template('full.html', memberlist=members) \ No newline at end of file diff --git a/myriad/manage.py b/myriad/manage.py new file mode 100644 index 0000000..23c19b6 --- /dev/null +++ b/myriad/manage.py @@ -0,0 +1,36 @@ +from flask import ( + Blueprint, flash, g, redirect, render_template, request, session, url_for +) + +from myriad.auth import login_required +from myriad.db import get_db + +bp = Blueprint('manage', __name__, url_prefix='/manage') + +@bp.route('/new', methods=('GET', 'POST')) +@login_required +def new(): + if request.method == 'POST': + name = request.form['name'] + bio = request.form['bio'] + #icon = request.form['icon'] + user_id = g.user[0] + db = get_db() + error = None + + if not name: + error = 'Name is required.' + + if error is None: + db.execute( + "INSERT INTO member (user_id, member_name, bio) VALUES (?, ?, ?)", + (user_id, name, bio), + + ) + db.commit() + + flash(error) + + return redirect(url_for('home.full_list')) + + return render_template('manage/new.html') \ No newline at end of file diff --git a/myriad/static/icons/any.jpg b/myriad/static/icons/any.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34247b92cdf1980a72bac027b7652c2f7358927d GIT binary patch literal 25786 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 literal 0 HcmV?d00001 diff --git a/myriad/static/style.css b/myriad/static/style.css index 48618de..a47cddf 100644 --- a/myriad/static/style.css +++ b/myriad/static/style.css @@ -29,6 +29,11 @@ form{ label,input{ margin:10px; } +form textarea{ + height:100px; + width:300px; + vertical-align: top; +} diff --git a/myriad/templates/base.html b/myriad/templates/base.html index 1effd19..24613ee 100644 --- a/myriad/templates/base.html +++ b/myriad/templates/base.html @@ -7,14 +7,25 @@
diff --git a/myriad/templates/full.html b/myriad/templates/full.html new file mode 100644 index 0000000..a6267b0 --- /dev/null +++ b/myriad/templates/full.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} + +{% block header %} +
{% block title %}Full List{% endblock %}
+{% endblock %} + +{% block content %} + + {% for member in memberlist %} + +
+
{{ member[3] }} {{ member[4] }}
+ +
+ {{ member[5] }} +
+
+ +
+ + {% endfor %} + +{% endblock %} \ No newline at end of file diff --git a/myriad/templates/manage/new.html b/myriad/templates/manage/new.html new file mode 100644 index 0000000..8b6111b --- /dev/null +++ b/myriad/templates/manage/new.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} + +{% block header %} +
{% block title %}New{% endblock %}
+{% endblock %} + +{% block content %} +
+ +
+ +
+ +
+{% endblock %} \ No newline at end of file