basic member blogs

still trying to figure out how to maximize customisability (html & css) of member pages as much as how we have them on neocities
This commit is contained in:
cube
2026-03-18 02:36:25 +00:00
parent 5ec6a62aa7
commit 7c6aabb1aa
11 changed files with 140 additions and 16 deletions

View File

@@ -24,17 +24,15 @@ do not deploy this way, the packaged flask server is not secure. production inst
- create `config.py` in the instance folder and customise the following settings to your needs
```
REGISTRATION = True
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
ICON_UPLOAD_FOLDER = 'myriad/static/icons'
BLINKIES_UPLOAD_FOLDER = 'myriad/static/blinkies'
STAMPS_UPLOAD_FOLDER = 'myriad/static/stamps'
REGISTRATION = True # Make sure to disable in production
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} # Can be anything you want
ICON_UPLOAD_FOLDER = 'myriad/static/icons' # where member icons will be stored
BLINKIES_UPLOAD_FOLDER = 'myriad/static/blinkies' # where site assets "blinkies" will be stored
STAMPS_UPLOAD_FOLDER = 'myriad/static/stamps' # where site assets "stamps" will be stored
INLINE_UPLOAD_FOLDER = 'myriad/static/inline' # where site assets "misc inline" will be stored
MISC_UPLOAD_FOLDER = 'myriad/static/misc' # where other small images will be stored
```
- registration should only be set to True in a development situation (in production set it to False one you have set up your administration account). this would mean that anyone can make an account and edit your system
- feel free to adjust allowed file extensions however you choose
- upload folders don't need to be changed
# usage
- the software here is free to use, and there's no requirement to link back

View File

@@ -30,4 +30,7 @@ def create_app(test_config=None):
from . import manage
app.register_blueprint(manage.bp)
from . import blog
app.register_blueprint(blog.bp)
return app

41
myriad/blog.py Normal file
View File

@@ -0,0 +1,41 @@
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app
)
from werkzeug.utils import secure_filename
import os, uuid
from myriad.auth import login_required
from myriad.db import get_db
bp = Blueprint('blog', __name__, url_prefix='/blog')
@bp.route('/')
def blog():
db = get_db()
posts = db.execute("SELECT * FROM blog ORDER BY created DESC").fetchall()
members = db.execute("SELECT id,member_name FROM member").fetchall()
member_ids={}
for member in members:
member_ids[member[0]] = member[1]
return render_template('blog/blog.html', blog=posts, member_ids=member_ids)
@bp.route('/new', methods=('GET', 'POST'))
@login_required
def new():
db = get_db()
members = db.execute("SELECT id,member_name FROM member").fetchall()
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
mid = request.form["mid"]
db.execute("INSERT INTO blog (member_id, title, content) VALUES (?, ?, ?)",(mid, title, content))
db.commit()
return redirect(url_for('blog.blog'))
return render_template('blog/new.html', members=members)

View File

@@ -41,4 +41,12 @@ def full_list():
else:
icons[member[0]] = None
return render_template('full.html', memberlist=members, icons=icons)
return render_template('full.html', memberlist=members, icons=icons)
@bp.route('/member/<mid>')
def page(mid):
db = get_db()
member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone()
blog = db.execute("SELECT * FROM blog WHERE member_id=(?) ORDER BY created DESC",(mid,)).fetchall()
return render_template('page.html', member=member, blog=blog)

View File

@@ -3,7 +3,7 @@ DROP TABLE IF EXISTS member;
DROP TABLE IF EXISTS icons;
DROP TABLE IF EXISTS groups;
DROP TABLE IF EXISTS group_members;
DROP TABLE IF EXISTS pages;
DROP TABLE IF EXISTS blog;
CREATE TABLE user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -60,9 +60,11 @@ CREATE TABLE group_members (
FOREIGN KEY (member_id) REFERENCES member (id)
);
CREATE TABLE pages (
CREATE TABLE blog (
id INTEGER PRIMARY KEY AUTOINCREMENT,
member_id INTEGER NOT NULL,
page_location TEXT NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
title TEXT,
content TEXT,
FOREIGN KEY (member_id) REFERENCES member (id)
);

View File

@@ -14,8 +14,13 @@
{% if g.user %}
<div class="heading">Manage</div>
<div class="navitem">> <a href="{{ url_for('manage.new') }}">Add New Member</a></div>
<div class="navitem">> <a href="">Site Assets</a></div>
{% endif %}
<div class="heading">Blog</div>
{% if g.user %}<div class="navitem">> <a href="{{ url_for('blog.new') }}">New Post</a></div>{% endif %}
<div class="navitem">> <a href="{{ url_for('blog.blog') }}">View All Posts</a></div>
<div class="heading">Administration</div>
{% if g.user %}
<div class="navitem">> <a href="{{ url_for('auth.logout') }}">Log out</a></div>

View File

@@ -0,0 +1,19 @@
{% extends 'base.html' %}
{% block header %}
<div class="title">{% block title %}System Blog{% endblock %}</div>
{% endblock %}
{% block content %}
{% for post in blog %}
<div class="post">
<div class="title">{{post[3]}}</div>
<div class="timestamp">{{post[2]}} - <a href="{{ url_for('home.page', mid=post[1]) }}">{{member_ids[post[1]]}}</a></div>
<div class="content">
{{post[4]}}
</div>
</div>
{% endfor %}
{% endblock %}

View File

@@ -0,0 +1,24 @@
{% extends 'base.html' %}
{% block header %}
<div class="title">{% block title %}New Blog Post{% endblock %}</div>
{% endblock %}
{% block content %}
<form method="post">
<label for="title">Title</label>
<input name="title" id="title"><br>
<label for="content">Content</label>
<textarea name="content" id="content"></textarea><br>
<label for="mid">Choose a member:</label>
<select name="mid" id="mid">
{% for member in members %}
<option value="{{member[0]}}">{{member[1]}}</option>
{% endfor %}
</select>
<input type="submit" value="Submit">
</form>
{{ error }}
{% endblock %}

View File

@@ -63,7 +63,7 @@
{{ member[5]|safe }}
</div>
<br class="clear" />
{% if g.user %}<div class="heading links">{% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}</div>{% endif %}
<div class="heading links"><a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
<!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
<br class="clear" />
</div>

View File

@@ -2,9 +2,12 @@
{% block title %}Welcome{% endblock %}
{% block content %}
{% if front_list|length > 0 %}
<div id="frontbanner" class="heading">
<b>currently fronting: </b> {% for member in front_list %} {{ member[3] }} {% if front_list.index(member) != front_list|length -1 %}&{% endif %} {% endfor %}
<b>currently fronting: </b> {% for member in front_list %} <a href="{{ url_for('home.page', mid=member[0]) }}">{{ member[3] }}</a> {% if front_list.index(member) != front_list|length -1 %}&{% endif %} {% endfor %}
</div>
{% endif %}
{% for member in home_pins %}
@@ -57,7 +60,7 @@
{{ member[5]|safe }}
</div>
<br class="clear" />
{% if g.user %}<div class="heading links">{% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}</div>{% endif %}
<div class="heading links"><a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
<!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
<br class="clear" />
</div>

View File

@@ -0,0 +1,21 @@
{% extends 'base.html' %}
{% block title %}{{ member[3] }}{% endblock %}
{% block content %}
<div class="heading big">{{member[3]}}'s blog</div>
<div id="blog">
{% for post in blog %}
<div class="post">
<div class="title">{{post[3]}}</div>
<div class="timestamp">{{post[2]}}</div>
<div class="content">
{{post[4]}}
</div>
</div>
{% endfor %}
</div>
{% endblock %}