Compare commits

..

18 Commits

Author SHA1 Message Date
cube
19efec79d6 fix #16 2026-06-12 19:32:53 +01:00
cube
213a9659b2 custom url fix on front banner also front banner ampersand fix 2026-05-30 02:27:25 +01:00
cube
f7cede9033 custom url and also asset import fix 2026-05-30 02:19:36 +01:00
cube
15ee5ec622 nav bar custom urls 2026-05-30 02:13:17 +01:00
cube
bfbe54df03 custom urls 2026-05-30 01:50:56 +01:00
cube
4c3279ef29 fix import issues and start work on custom urls for member pages 2026-05-30 00:43:23 +01:00
cube
c70c4f2922 import and export assets with zip folders 2026-05-28 12:52:29 +01:00
cube
c973e4b83a delete individual misc assets from filesystem in site assets 2026-05-28 12:40:14 +01:00
609f84f878 Update README.md 2026-05-28 02:17:16 +00:00
cube
3aa3780aef fix any.jpg on homepage 2026-05-28 02:36:42 +01:00
cube
e7a7a90c89 fix any.jpg 2026-05-28 02:35:21 +01:00
cube
7022614d2e homepage text dont render p tags if empty 2026-05-28 02:21:34 +01:00
cube
35af9dd6b7 Merge branch 'master' of https://tea.cubes.link/cube/myriad 2026-05-28 02:20:49 +01:00
cube
9ca401c2cb homepage text in config 2026-05-28 02:20:48 +01:00
d73107453b Update README.md 2026-05-28 01:20:39 +00:00
cube
3f03525e8e minor assets html edit 2026-05-28 02:03:55 +01:00
cube
71cc1d0357 Merge branch 'master' of https://tea.cubes.link/cube/myriad 2026-05-28 01:49:47 +01:00
cube
2fcce4cbbe we think we have export and import of pages and sections. there is definitely groups on member pages 2026-05-28 01:49:45 +01:00
15 changed files with 440 additions and 114 deletions

View File

@@ -31,6 +31,9 @@ THEMES_FOLDER = 'myriad/static/themes' # all the theme css files are here
TMP_FOLDER = 'myriad/static/tmp' # required for exports
SYSTEM_NAME = 'Myriad' # will be shown in the title bar
PAGES_NAME = 'Read More...' # will be shown in the nav bar if using custom pages
HOMEPAGE = """
<marquee>Welcome to the demo of Myriad!</marquee>
"""
SECRET_KEY = "dev" # CHANGE THIS - see wiki for details
```
@@ -76,3 +79,7 @@ the other option is to export the entire system to json or zip file. **importing
- 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 us
# Preview
Check out the [sample instance](https://myriad.cubes.link/) (it is bare bones at the moment but gives a general idea of how things look)

View File

@@ -39,48 +39,51 @@ def create_app():
app.register_blueprint(blog.bp)
@app.context_processor
def utility_processor():
def utility_processor():
def get_themes():
themes = os.listdir(app.config["THEMES_FOLDER"])
return themes
def w_server_time():
return server_time()
def w_get_datetime_str(dt_obj):
return get_datetime_str(dt_obj)
def get_member(mid):
db = get_db()
member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone()
return member
def get_member_icon(mid):
db = get_db()
member = get_member(mid)
try:
icon_id = member[6]
icon_name = db.execute("SELECT * FROM icons WHERE id=(?)",(icon_id,)).fetchone()
return icon_name[2]
except TypeError:
return 'any.jpg'
return icon_name[2]
return None
def get_member_icons(members):
def get_member_icons(mid):
db = get_db()
icons={}
for member in members:
icon_id = member[6]
if icon_id:
icon = db.execute("SELECT icon_location FROM icons WHERE id=(?)",(icon_id,)).fetchone()
if icon:
icons[member[0]] = icon[0]
else:
icons[member[0]] = None
icons = db.execute("SELECT * FROM icons WHERE member_id=(?)",(mid,)).fetchall()
return icons
def get_group(gid):
db = get_db()
group = db.execute("SELECT * FROM groups WHERE id=(?)",(gid,)).fetchone()
return group
def get_system_name():
return app.config["SYSTEM_NAME"]
def get_pages_name():
return app.config["PAGES_NAME"]
def check_favicon():
if os.path.isfile(os.path.join(app.config["STATIC_FOLDER"], "favicon.ico")):
return True
return False
def get_pins_public():
db = get_db()
pins = db.execute("SELECT * FROM member WHERE homepage=(?) AND public=(?) ORDER BY member_name",(1, 1)).fetchall()
@@ -96,6 +99,7 @@ def create_app():
get_member=get_member,
get_member_icon=get_member_icon,
get_member_icons=get_member_icons,
get_group=get_group,
remove_html=remove_html,
get_pages=get_pages,
get_system_name=get_system_name,

View File

@@ -5,14 +5,19 @@ from werkzeug.exceptions import abort
from myriad.auth import login_required
from myriad.db import get_db
from myriad.utilities import get_pages
from myriad.utilities import get_pages, error404
bp = Blueprint('home', __name__)
@bp.route('/')
def index():
db = get_db()
fronters = db.execute("SELECT * FROM member WHERE front=(?) ORDER BY member_name",(1,)).fetchall()
if g.user:
fronters = db.execute("SELECT * FROM member WHERE front=(?) ORDER BY member_name",(1,)).fetchall()
else:
fronters = db.execute("SELECT * FROM member WHERE front=(?) AND public=(?) ORDER BY member_name",(1,1)).fetchall()
homepage = db.execute("SELECT * FROM member WHERE homepage=(?) ORDER BY member_name COLLATE NOCASE",(1,)).fetchall()
latest_start = db.execute("SELECT start_time FROM front_log ORDER BY start_time DESC").fetchone()
@@ -32,7 +37,9 @@ def index():
elif latest_start and not latest_end:
latest = latest_start[0]
return render_template('index.html', front_list=fronters, home_pins=homepage, last_updated=latest)
homepage_text = current_app.config["HOMEPAGE"]
return render_template('index.html', front_list=fronters, home_pins=homepage, last_updated=latest, homepage_text=homepage_text)
@bp.route('/full')
def full_list():
@@ -44,23 +51,39 @@ def full_list():
@bp.route('/member/<mid>')
def page(mid):
db = get_db()
try:
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()
icon = db.execute("SELECT icon_location FROM icons WHERE id=(?)",(member[6],)).fetchone()
all_icons = db.execute("SELECT icon_location FROM icons WHERE member_id=(?)",(mid,)).fetchall()
blinkies = db.execute("SELECT blinkie_location FROM blinkies WHERE member_id=(?)",(mid,)).fetchall()
stamps = db.execute("SELECT stamp_location FROM stamps WHERE member_id=(?)",(mid,)).fetchall()
blog_public = db.execute("SELECT * FROM blog WHERE member_id=(?) AND public=(?)",(mid,1)).fetchall()
sections = db.execute("SELECT * FROM sections WHERE member_id=(?) ORDER BY position ASC",(mid,)).fetchall()
except TypeError:
return "Not Found <br> <a href='/'>Go Home</a>", 404
member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone()
if not member:
member = db.execute("SELECT * FROM member WHERE custom_url=(?)",(mid,)).fetchone()
mid = member[0]
if not member:
return error404()
blog = db.execute("SELECT * FROM blog WHERE member_id=(?) ORDER BY created DESC",(mid,)).fetchall()
icon = db.execute("SELECT icon_location FROM icons WHERE id=(?)",(member[6],)).fetchone()
all_icons = db.execute("SELECT icon_location FROM icons WHERE member_id=(?)",(mid,)).fetchall()
blinkies = db.execute("SELECT blinkie_location FROM blinkies WHERE member_id=(?)",(mid,)).fetchall()
stamps = db.execute("SELECT stamp_location FROM stamps WHERE member_id=(?)",(mid,)).fetchall()
blog_public = db.execute("SELECT * FROM blog WHERE member_id=(?) AND public=(?)",(mid,1)).fetchall()
sections = db.execute("SELECT * FROM sections WHERE member_id=(?) ORDER BY position ASC",(mid,)).fetchall()
groups = db.execute("SELECT * FROM group_members WHERE member_id=(?)",(mid,)).fetchall()
blog_public_show = False
if len(blog_public) > 0:
blog_public_show = True
return render_template('page.html', member=member, blog=blog, icon=icon, all_icons=all_icons, blinkies=blinkies, stamps=stamps, blog_public_show=blog_public_show, sections=sections)
profile_public = member[9]
if not g.user and profile_public == 0:
return error404()
page_public = member[21]
if page_public == 2:
return error404()
elif not g.user and page_public == 0:
return error404()
return render_template('page.html', member=member, blog=blog, icon=icon, all_icons=all_icons, blinkies=blinkies, stamps=stamps, blog_public_show=blog_public_show, sections=sections, groups=groups)
@bp.route("/groups")
def groups():
@@ -90,7 +113,7 @@ def group_page(gid):
m = db.execute("SELECT * FROM member WHERE id=(?)",(member[2],)).fetchone()
members.append(m)
except TypeError:
return "Not Found <br> <a href='/'>Go Home</a>", 404
return error404()
return render_template('group_page.html', group=group, members=members)
@bp.route("/page/<pid>")
@@ -99,7 +122,7 @@ def custom_page(pid):
try:
page = db.execute("SELECT * FROM pages WHERE id=(?)",(pid,)).fetchone()
except TypeError:
return "Not Found <br> <a href='/'>Go Home</a>", 404
return error404()
return render_template('custom_page.html', page=page)
@bp.route("/page")

View File

@@ -1,7 +1,7 @@
from flask import Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app, send_file, send_from_directory
from werkzeug.utils import secure_filename
import os, uuid, json, zipfile, datetime
import os, uuid, json, zipfile, datetime, sqlite3
from myriad.utilities import server_time, get_datetime_obj, server_time_obj
from myriad.auth import login_required
@@ -82,6 +82,25 @@ def edit(mid):
edit_location = "details"
if "enable_page" in request.form:
page_public = request.form["enable_page"]
db.execute("UPDATE member SET public_page=(?) WHERE id=(?)",(page_public, mid))
db.commit()
edit_location="enable_page"
if "custom_url" in request.form:
custom_url = request.form["custom_url"].strip()
try:
db.execute("UPDATE member SET custom_url=(?) WHERE id=(?)",(custom_url, mid))
db.commit()
except sqlite3.IntegrityError:
pass
edit_location="custom_url"
if "page_settings" in request.form:
show_groups = "show_groups" in request.form
show_blog = "show_blog" in request.form
@@ -171,7 +190,15 @@ def edit(mid):
edit_location = "sections"
member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone()
try:
member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone()
except:
try:
member = db.execute("SELECT * FROM member WHERE custom_url=(?)",(mid,)).fetchone()
except:
return "Not Found <br> <a href='/'>Go Home</a>", 404
icons = db.execute("SELECT * FROM icons WHERE member_id=(?)",(mid,)).fetchall()
blinkies = db.execute("SELECT * FROM blinkies WHERE member_id=(?)",(mid,)).fetchall()
stamps = db.execute("SELECT * FROM stamps WHERE member_id=(?)",(mid,)).fetchall()
@@ -338,8 +365,43 @@ def import_groups(groups):
else:
privacy = 0
db.execute("INSERT INTO groups (id, group_name, group_description, public) VALUES (?, ?, ?, ?)", (gid, name, description, privacy))
db.commit()
try:
db.execute("INSERT INTO groups (id, group_name, group_description, public) VALUES (?, ?, ?, ?)",
(gid, name, description, privacy))
db.commit()
except sqlite3.IntegrityError:
pass
def import_sections(sections):
db = get_db()
for section in sections:
sid = section["id"]
mid = section["member_id"]
title = section["title"]
content = section["content"]
position = section["position"]
try:
db.execute("INSERT INTO sections (id, member_id, title, content, position) VALUES (?, ?, ?, ?, ?)",
(sid, mid, title, content, position))
db.commit()
except sqlite3.IntegrityError:
pass
def import_pages(pages):
db = get_db()
for page in pages:
pid = page["id"]
title = page["title"]
content = page["content"]
position = page["position"]
try:
db.execute("INSERT INTO pages (id, title, content, position) VALUES (?, ?, ?, ?)",
(pid, title, content, position))
db.commit()
except sqlite3.IntegrityError:
pass
def import_member(member):
db = get_db()
@@ -353,9 +415,9 @@ def import_member(member):
description = member["description"]
if member["privacy"] == "public":
privacy = 1
m_privacy = 1
else:
privacy = 0
m_privacy = 0
theme = member["theme"]
homepage = member["homepage-pin"]
@@ -413,9 +475,37 @@ def import_member(member):
stamps_title = member["stamps-title"]
groups_title = member["groups-title"]
db.execute("INSERT INTO member (id,created,user_id, member_name,subtitle, bio,public,theme,homepage,main_icon,show_blog,show_icons,show_blinkies,show_stamps,show_groups,blog_title,icons_title,blinkies_title,stamps_title,groups_title) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(mid, date_created_obj, user_id, name, subtitle, description,privacy, theme, homepage, main_icon_id, show_blog, show_icons, show_blinkies, show_stamps, show_groups, blog_title, icons_title, blinkies_title, stamps_title, groups_title))
db.commit()
try:
db.execute("""
INSERT INTO member
(id,created,user_id, member_name,subtitle,
bio,public,theme,homepage,main_icon,show_blog,
show_icons,show_blinkies,show_stamps,show_groups,
blog_title,icons_title,blinkies_title,stamps_title,groups_title)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
(mid,
date_created_obj,
user_id,
name,
subtitle,
description,
m_privacy,
theme,
homepage,
main_icon_id,
show_blog,
show_icons,
show_blinkies,
show_stamps,
show_groups,
blog_title,
icons_title,
blinkies_title,
stamps_title,
groups_title))
db.commit()
except sqlite3.IntegrityError:
pass
@@ -451,8 +541,13 @@ def admin():
system_content = zipf.read(f)
system_json = json.loads(system_content.decode())
groups = system_json["groups"]
import_groups(groups)
groups_i = system_json["groups"]
sections = system_json["sections"]
pages_i = system_json["pages"]
import_groups(groups_i)
import_sections(sections)
import_pages(pages_i)
for m in system_json["members"]:
import_member(m)
@@ -600,6 +695,64 @@ def generate_json_groups():
groups.append(g)
return groups
def generate_json_frontlog():
db = get_db()
front_log_r = db.execute("SELECT * FROM front_log ORDER BY start_time DESC").fetchall()
front_log = []
for front in front_log_r:
start_d_c = get_datetime_str(front[2])
if front[3]:
end_d_c = get_datetime_str(front[3])
else:
end_d_c = "(no end time)"
f = {
"id":front[0],
"member_id":front[1],
"start_time":start_d_c,
"end_time":end_d_c
}
front_log.append(f)
return front_log
def generate_json_sections():
db = get_db()
sections_r = db.execute("SELECT * FROM sections").fetchall()
sections = []
for section in sections_r:
s = {
"id":section[0],
"member_id":section[1],
"title":section[2],
"content":section[3],
"position":section[4]
}
sections.append(s)
return sections
def generate_json_pages():
db=get_db()
pages_r = db.execute("SELECT * FROM pages").fetchall()
pages=[]
for page in pages_r:
p = {
"id":page[0],
"title":page[1],
"content":page[2],
"position":page[3]
}
pages.append(p)
return pages
@bp.route("/export_fields/<mid>")
@login_required
@@ -707,7 +860,6 @@ def export_member(mid):
def export_system():
db = get_db()
members = db.execute("SELECT * FROM member").fetchall()
groups_r = db.execute("SELECT * FROM groups").fetchall()
data = {}
data["members"] = []
@@ -718,6 +870,15 @@ def export_system():
groups = generate_json_groups()
data["groups"] = groups
front_log = generate_json_frontlog()
data["front_log"] = front_log
sections = generate_json_sections()
data["sections"] = sections
pages = generate_json_pages()
data["pages"] = pages
filename = "myriad_system_textonly.json"
file_full_path = current_app.config["TMP_FOLDER"] + "/" + filename
with open(file_full_path, 'w') as f:
@@ -743,6 +904,15 @@ def export_system_full():
groups = generate_json_groups()
data["groups"] = groups
front_log = generate_json_frontlog()
data["front_log"] = front_log
sections = generate_json_sections()
data["sections"] = sections
pages = generate_json_pages()
data["pages"] = pages
filename = "myriad_system.json"
file_full_path = current_app.config["TMP_FOLDER"] + "/" + filename
with open(file_full_path, 'w') as f:
@@ -801,8 +971,19 @@ def assets():
else:
file.save(os.path.join(current_app.config["MISC_UPLOAD_FOLDER"], fname+str(i)+"."+ftype))
if "images_zip" in request.files:
images_file = request.files["images_zip"]
with zipfile.ZipFile(images_file, "r") as zipf:
for f in zipf.namelist():
zipf.extract(f)
# Get icon names from the database and icon files from the disk
icons = db.execute("SELECT * FROM icons").fetchall()
icon_storage = os.listdir(current_app.config["ICON_UPLOAD_FOLDER"])
# Do the same for stamps and blinkies now that I'm organizing these too
blinkies = db.execute("SELECT * FROM blinkies").fetchall()
blinkie_storage = os.listdir(current_app.config["BLINKIES_UPLOAD_FOLDER"])
i_storage = []
for icon in icon_storage:
@@ -821,11 +1002,11 @@ def assets():
if not in_storage:
unlinked_icons.append(i)
blinkies = os.listdir(current_app.config["BLINKIES_UPLOAD_FOLDER"])
stamps = os.listdir(current_app.config["STAMPS_UPLOAD_FOLDER"])
#blinkies = os.listdir(current_app.config["BLINKIES_UPLOAD_FOLDER"])
#stamps = os.listdir(current_app.config["STAMPS_UPLOAD_FOLDER"])
images = os.listdir(current_app.config["MISC_UPLOAD_FOLDER"])
return render_template("manage/assets.html", icons=unlinked_icons, icon_storage=i_storage, blinkies=blinkies, stamps=stamps, images=images)
return render_template("manage/assets.html", icons=unlinked_icons, icon_storage=i_storage, images=images)
@bp.route("/delete_idb")
@login_required
@@ -863,6 +1044,23 @@ def delete_ifiles():
@bp.route("/delete/misc/<filename>")
@login_required
def delete_misc(filename):
os.remove(os.path.join(current_app.config["MISC_UPLOAD_FOLDER"], filename))
return redirect(url_for("manage.assets"))
@bp.route("/export/misc")
@login_required
def export_misc():
misc = os.listdir(current_app.config["MISC_UPLOAD_FOLDER"])
zip_name = "myriad_assets.zip"
zip_path = current_app.config["TMP_FOLDER"] + "/" + zip_name
with zipfile.ZipFile(zip_path, "w") as zipf:
for misc_file in misc:
zipf.write(current_app.config["MISC_UPLOAD_FOLDER"] + "/" + misc_file)
return send_file("static/tmp/"+zip_name, as_attachment=True)
# GROUPS

View File

@@ -9,6 +9,7 @@ DROP TABLE IF EXISTS stamps;
DROP TABLE IF EXISTS front_log;
DROP TABLE IF EXISTS sections;
DROP TABLE IF EXISTS pages;
DROP TABLE IF EXISTS custom_urls;
CREATE TABLE user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -38,6 +39,8 @@ CREATE TABLE member (
blinkies_title TEXT DEFAULT "Blinkies",
stamps_title TEXT DEFAULT "Stamps",
groups_title TEXT DEFAULT "Groups",
public_page BOOLEAN NOT NULL DEFAULT 1,
custom_url TEXT UNIQUE,
FOREIGN KEY (user_id) REFERENCES user (id),
FOREIGN KEY (main_icon) REFERENCES icons (id)
);
@@ -109,5 +112,13 @@ CREATE TABLE pages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
content TEXT,
position INTEGER
position INTEGER,
public BOOLEAN NOT NULL DEFAULT 1
);
CREATE TABLE custom_urls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
member_id INTEGER NOT NULL,
custom_url TEXT,
FOREIGN KEY (member_id) REFERENCES member (id)
);

View File

@@ -46,7 +46,14 @@
{% if pins %}
<div class="heading">Pinned</div>
{% for pin in pins %}
<div class="navitem">> <a href="{{ url_for('home.page', mid=pin[0]) }}">{{pin[3]|safe}}</a></div>
{% if pin[21] == 2 %}
{% set view_page = False %}
{% elif not g.user and pin[21] == 0 %}
{% set view_page = False %}
{% else %}
{% set view_page = True %}
{% endif %}
{% if view_page %}<div class="navitem">> {% if pin[22] %}<a href="{{ url_for('home.page', mid=pin[22]) }}">{{ pin[3]|safe }}</a>{%else%}<a href="{{ url_for('home.page', mid=pin[0]) }}">{{ pin[3]|safe }}</a>{%endif%}</div>{% endif %}
{% endfor %}
{% endif %}

View File

@@ -22,18 +22,33 @@
{% for member in memberlist %}
{% if not g.user and member[9]==0 %}
{% else %}
{% if member[21] == 2 %}
{% set view_page = False %}
{% elif not g.user and member[21] == 0 %}
{% set view_page = False %}
{% else %}
{% set view_page = True %}
{% endif %}
{% if not g.user and not view_page %}
{% set hide_links = True %}
{% endif %}
<div class="profile {{member[10]}}" id="m{{ member[0] }}">
<div class="heading">{% if member[9]==0 %}<img class="minilock" src="{{ url_for('static', filename='lock.png') }}">{% endif %}<b>{{ member[3]|safe }}</b> {{ member[4]|safe }}</div>
{% set icon = get_member_icon(member[0]) %}
<img src="{{ url_for('static', filename='icons/'+icon) }}" class="icon">
{% if icon %}
<img class="icon" src="{{ url_for('static', filename='icons/'+icon) }}">
{% else %}
<img class="icon" src="{{ url_for('static', filename='any.jpg') }}">
{% endif %}
<div class="bio">
{{ member[5].replace('\n', '<br>')|safe }}
</div>
<br class="clear" />
<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],location='full') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='full') }}">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],location='full') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='full') }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
<!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
{% if not hide_links %}<div class="heading links">{% if view_page %}{% if member[22] %}<a href="{{ url_for('home.page', mid=member[22]) }}">View Page</a>{%else%}<a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% endif %}{% endif %}{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0],location='full') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='full') }}">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],location='full') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='full') }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>{% endif %}
<br class="clear" />
</div>
{% endif %}

View File

@@ -16,6 +16,18 @@
{% if not g.user and member[9]==0 %}
{% else %}
{% if member[21] == 2 %}
{% set view_page = False %}
{% elif not g.user and member[21] == 0 %}
{% set view_page = False %}
{% else %}
{% set view_page = True %}
{% endif %}
{% if not g.user and not view_page %}
{% set hide_links = True %}
{% endif %}
<div class="profile {{member[10]}}" id="m{{ member[0] }}">
<div class="heading">{% if member[9]==0 %}<img class="minilock" src="{{ url_for('static', filename='lock.png') }}">{% endif %}<b>{{ member[3]|safe }}</b> {{ member[4]|safe }}</div>
@@ -25,7 +37,7 @@
{{ member[5].replace('\n', '<br>')|safe }}
</div>
<br class="clear" />
<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],location='home') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='home') }}">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],location='home') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='home') }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
{% if not hide_links %}<div class="heading links">{% if view_page %}{% if member[22] %}<a href="{{ url_for('home.page', mid=member[22]) }}">View Page</a>{%else%}<a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% endif %}{% endif %}{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0],location='home') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='home') }}">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],location='home') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='home') }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>{% endif %}
<br class="clear" />
</div>

View File

@@ -6,6 +6,7 @@
{% for group in groups %}
{% if not g.user and group[3]==0 %}
{% else %}
<div class="heading big"><a href="{{ url_for('home.group_page', gid=group[0]) }}">{{group[1]}}</a></div>
<div class="maintext">
@@ -14,7 +15,16 @@
{% for member in group_members[group[0]] %}
{% if not g.user and member[9]==0 %}
{% else %}
&#10032; <a href="{{ url_for('home.page', mid=member[0]) }}">{{ member[3]|safe }}</a> <br>
{% if member[21] == 2 %}
{% set view_page = False %}
{% elif not g.user and member[21] == 0 %}
{% set view_page = False %}
{% else %}
{% set view_page = True %}
{% endif %}
&#10032; {% if view_page %}<a href="{{ url_for('home.page', mid=member[0]) }}">{% endif %}{{ member[3]|safe }}{% if view_page %}</a>{% endif %} <br>
{% endif %}
{% endfor %}
{% endif %}

View File

@@ -6,29 +6,59 @@
<div id="frontbanner" class="heading">
{% if front_list|length > 0 %}
<b>currently fronting: </b> {% for member in front_list %}{% if not g.user and member[9]==0 %}{% else %}<a href="{{ url_for('home.page', mid=member[0]) }}">{{ member[3]|safe }}</a> {% if front_list.index(member) != front_list|length -1 %}&{% endif %}{% endif %} {% endfor %}
<b>currently fronting: </b>
{% for member in front_list %}
{% if member[21] == 2 %}
{% set a_tags = False %}
{% elif not g.user and member[21] == 0 %}
{% set a_tags = False %}
{% else %}
{% set a_tags = True %}
{% endif %}
{% if member[22] %}
{% if a_tags %}<a href="{{ url_for('home.page', mid=member[22]) }}">{% endif %}{{ member[3]|safe }}{% if a_tags %}</a>{% endif %}
{%else%}{% if a_tags %}<a href="{{ url_for('home.page', mid=member[0]) }}">{% endif %}{{ member[3]|safe }}{% if a_tags %}</a>{% endif %}
{%endif%}
{% if front_list.index(member) != front_list|length -1 %}& {% endif %}{% endfor %}
{% else %}
<i><sub>There are currently no members listed as fronting</sub></i>
{% endif %}
{% if last_updated %}<br><i><sub>last updated: {{ get_datetime_str(last_updated) }}</sub></i>{% endif %}
</div>
{% if homepage_text %}<p>{{ homepage_text|safe }}</p>{% endif %}
{% for member in home_pins %}
{% if not g.user and member[9]==0 %}
{% else %}
{% if member[21] == 2 %}
{% set view_page = False %}
{% elif not g.user and member[21] == 0 %}
{% set view_page = False %}
{% else %}
{% set view_page = True %}
{% endif %}
{% if not g.user and not view_page %}
{% set hide_links = True %}
{% endif %}
<div class="profile {{member[10]}}" id="m{{ member[0] }}">
<div class="heading">{% if member[9]==0 %}<img class="minilock" src="{{ url_for('static', filename='lock.png') }}">{% endif %}<b>{{ member[3]|safe }}</b> {{ member[4]|safe }}</div>
{% set icon = get_member_icon(member[0]) %}
<img src="{{ url_for('static', filename='icons/'+icon) }}" class="icon">
{% if icon %}
<img class="icon" src="{{ url_for('static', filename='icons/'+icon) }}">
{% else %}
<img class="icon" src="{{ url_for('static', filename='any.jpg') }}">
{% endif %}
<div class="bio">
{{ member[5].replace('\n', '<br>')|safe }}
</div>
<br class="clear" />
<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],location='home') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='home') }}">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],location='home') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='home') }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
<!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
{% if not hide_links %}<div class="heading links">{% if view_page %}{% if member[22] %}<a href="{{ url_for('home.page', mid=member[22]) }}">View Page</a>{%else%}<a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% endif %}{% endif %}{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0],location='home') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='home') }}">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],location='home') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='home') }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>{% endif %}
<br class="clear" />
</div>

View File

@@ -47,24 +47,12 @@
<hr>
<div class="heading">Export</div>
<a href="{{ url_for('manage.export_system') }}">Export entire system as JSON</a> (without images)<br>
<a href="{{ url_for('manage.export_system_full') }}">Export entire system as ZIP</a> (with images)
<div class="heading">Export & Import</div>
<a href="{{ url_for('manage.export_system_full') }}">Export entire system as ZIP</a>
<hr>
<div class="heading">Import system from JSON</div>
<p>You must only run full system imports on a fresh database</p>
<form method="post" enctype="multipart/form-data" id="json">
<input type="file" name="json">
<input type="submit" value="Upload JSON">
</form>
<hr>
<div class="heading">Import system from ZIP</div>
<p>You must only run full system imports on a fresh database</p>
<p><b>Import system from previous Myriad export</b></p>
<p class="danger">This will replace existing data</p>
<p>Be sure to upload the .zip folder as it was downloaded without unzipping it</p>
<form method="post" enctype="multipart/form-data" id="zip">
<input type="file" name="zip">
<input type="submit" value="Upload ZIP">
@@ -72,28 +60,5 @@
<hr>
<div class="heading big pink">WIP ZONE</div>
<div class="heading">Site Users</div>
<div class="maintext">These are the usernames that can log in to the site</div>
{% for user in users %}
<p><b>{{ user[1] }}</b>{% if user[0]!=g.user[0] %} | <a>Delete user</a>{% endif %}</p>
{% endfor %}
<p><a>Add New User</a></p>
<div class="heading">Admin Log</div>
<div class="maintext">Actions taken by registered users</div>
<div class="heading">Site Theme</div>
<div class="maintext">Choose the overall theme for the site here</div>
<form>
<select name="theme" id="theme">
{% for theme in get_themes() %}
{% set theme_name = theme.split(".")[0] %}
<option value="{{theme_name}}">{{theme_name}}</option>
{% endfor %}
</select>
<input type="submit" value="Submit">
</form>
</div>
{% endblock %}

View File

@@ -63,12 +63,24 @@
<img class="mng_img" src="{{ url_for('static', filename='misc/'+image) }}">
<br class="clear" />
{% set imgurl = url_for('static', filename='misc/'+image) %}
<a href="" onclick="copyURL('{{imgurl}}')">Copy Image URL</a> &#9734 <a href="">Delete</a>
<a style="color:blue;cursor:pointer;" onclick="copyURL('{{imgurl}}')">Copy Source</a>
&#9734
<a href="{{ url_for('manage.delete_misc', filename=image) }}">Delete</a>
</div>
{% endfor %}
</div>
</div>
<p><a href="{{ url_for('manage.export_misc') }}">Export all assets to zip</a></p>
<hr>
<p>Import assets from a zip folder</p>
<form method="post" enctype="multipart/form-data" id="images_zip">
<input type="file" name="images_zip" class="mobile-edit">
<input type="submit" value="Upload ZIP">
</form>
<script>
function copyURL(a) {
navigator.clipboard.writeText(a);

View File

@@ -6,8 +6,7 @@
{% block content %}
<div class="container">
<a href="{{url_for('home.page', mid=member[0])}}">View {{member[3]|safe}}'s page</a>
{% if member[22] %}<a href="{{ url_for('home.page', mid=member[22]) }}">View {{member[3]|safe}}'s page</a>{%else%}<a href="{{ url_for('home.page', mid=member[0]) }}">View {{member[3]|safe}}'s page</a>{%endif%}
<br class="clear" />
<div class="heading">Edit Details</div>
@@ -26,6 +25,8 @@
<option value="{{theme_name}}" {% if theme_name==member[10] %}selected{% endif %}>{{theme_name}}</option>
{% endfor %}
</select><br><br>
<p>Public: this member's profile will be visible in lists to anyone with access to the site</p>
<p>Private: this member's profile will be hidden, only visible to logged in users</p>
<input type="radio" id="public" name="privacy" value=1 {% if member[9]==1 %}checked{% endif %}>
<label for="public">Public</label><br>
<input type="radio" id="private" name="privacy" value=0 {% if member[9]==0 %}checked{% endif %}>
@@ -34,6 +35,37 @@
</form>
<div class="heading">Public Page Settings</div>
<p>Enable public page for this member? These settings are non-destructive and can be reverted at any time.</p>
<p>Public: member's customizable page can be viewed by anyone with access to the site</p>
<p>Private: member's page is viewable by users logged in to the site</p>
<p>Disabled: a custom page is not enabled for this member</p>
{% set public_page = member[21] %}
<form method="post" id="enable_page">
<input type="radio" id="page_public" name="enable_page" value=1 {% if public_page == 1 %}checked{% endif %}>
<label for="page_public">Public</label><br>
<input type="radio" id="page_private" name="enable_page" value=0 {% if public_page == 0 %}checked{% endif %}>
<label for="page_private">Private</label><br>
<input type="radio" id="page_disabled" name="enable_page" value=2 {% if public_page == 2 %}checked{% endif %}>
<label for="page_disabled">Disabled</label><br>
<input type="submit" value="Submit">
</form>
<hr>
<p>Set a custom URL for your page. This has to be unique. Trying to set a custom URL that is already in use
won't work.
</p>
{% if member[22] %}{% set customurl = member[22] %}{% else %}{% set customurl = "" %}{% endif %}
<form method="post" id="custom_url">
<label for="custom_url">Custom URL</label>
<input name="custom_url" id="custom_url" value="{{ customurl }}"><br>
<input type="submit" value="Submit">
</form>
<hr>
<p>Select which sections to show on this member's public page</p>
<form method="post" id="page_settings">
<input type="checkbox" id="show_groups" name="show_groups" {% if member[15] %}checked{% endif %}>

View File

@@ -7,10 +7,6 @@
<div class="container {{member[10]}}">
{% if not g.user and member[9]==0 %}
permission denied
{% else %}
{% if g.user %}
<a href="{{url_for('manage.edit', mid=member[0])}}">Edit member</a> &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0],location='mid') }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0],location='mid') }}">Remove from Front</a>{% endif %} &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0],location='mid') }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0],location='mid') }}">Unpin from Homepage</a>{% endif %}
<br class="clear" />
@@ -18,8 +14,9 @@
{% if member[8]==1 %}<div class="heading"><i>Currently Fronting</i></div>{% endif %}
{% if icon %}
<img class="icon" src="{{ url_for('static', filename='icons/'+icon[0]) }}">
{% set main_icon = get_member_icon(member[0]) %}
{% if main_icon %}
<img class="icon" src="{{ url_for('static', filename='icons/'+main_icon) }}">
{% else %}
<img class="icon" src="{{ url_for('static', filename='any.jpg') }}">
{% endif %}
@@ -58,13 +55,6 @@
{{ section[3]|safe }}
{% endfor %}
<!-- {% if groups|length > 0 %}
<div class="heading big">{{ member[20] }}</div>
{% for group in groups %}
{% endfor %}
{% endif %} -->
{% if member[13] %}
{% if blinkies|length > 0 %}
{% if member[18] %}<div class="heading big">{{ member[18] }}</div>{% endif %}
@@ -101,7 +91,14 @@
{% endif %}
<br class="clear" />
{% if member[15] %}
{% if groups|length > 0 %}
<div class="heading big">{{ member[20] }}</div>
{% for gr in groups %}
{% set group = get_group(gr[1]) %}
>> <a href="{{ url_for('home.group_page', gid=group[0]) }}">{{ group[1] }}</a><br>
{% endfor %}
{% endif %}
{% endif %}
</div>

View File

@@ -1,6 +1,9 @@
import datetime, re
from myriad.db import get_db
def error404():
return "Not Found <br> <a href='#' onclick='history.back()'>Go Back</a>", 404
def server_time():
raw = datetime.datetime.now()
real = raw.strftime("%d/%m/%Y, %H:%M:%S")