roundabout,
created on Tuesday, 12 December 2023, 17:32:07 (1702402327),
received on Wednesday, 31 July 2024, 06:54:39 (1722408879)
Author identity: vlad <vlad.muntoiu@gmail.com>
dd96f328ef6d099d1afb908b8e26aacf06b64089
app.py
@@ -176,10 +176,12 @@ with app.app_context():
class Post(db.Model): identifier = db.Column(db.String(109), unique=True, nullable=False, primary_key=True) number = db.Column(db.String(109), nullable=False)repoName = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False) ownerName = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False) parentID = db.Column(db.String(109), db.ForeignKey("post.identifier"), nullable=True) state = db.Column(db.SmallInteger, nullable=True, default=1)date = db.Column(db.DateTime, default=datetime.now) subject = db.Column(db.Unicode(384))
@@ -191,6 +193,7 @@ with app.app_context():
def __init__(self, owner, repo, parent, subject, message): self.identifier = f"/{owner.username}/{repo.name}/{repo.lastPostID}" self.number = repo.lastPostIDself.repoName = repo.route self.repo = repo self.ownerName = owner.username
@@ -633,6 +636,29 @@ def repositoryForum(username, repository):
return flask.render_template("repo-forum.html", username=username, repository=repository, repoData=repoData, relationships=relationships, repo=repo, userRelationship=userRelationship, Post=Post) @app.route("/<username>/<repository>/forum/<postID>") def repositoryForumThread(username, repository, postID): if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username, repository) is not None): flask.abort(403) serverRepoLocation = os.path.join(config.REPOS_PATH, os.path.join(username, repository)) app.logger.info(f"Loading {serverRepoLocation}") if not os.path.exists(serverRepoLocation): app.logger.error(f"Cannot load {serverRepoLocation}") return flask.render_template("not-found.html"), 404 repo = git.Repo(serverRepoLocation) repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first() user = User.query.filter_by(username=username).first() relationships = RepoAccess.query.filter_by(repo=repoData) userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first() return flask.render_template("repo-forum-thread.html", username=username, repository=repository, repoData=repoData, relationships=relationships, repo=repo, userRelationship=userRelationship, Post=Post, postID=postID) @app.route("/<username>/<repository>/users/", methods=["GET", "POST"]) def repositoryUsers(username, repository): if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
static/style.css
@@ -139,33 +139,19 @@ body {
main { flex: 1 0 auto; } body > footer dd ul {padding-left: 0;margin-left: 0 !important;list-style: none;}body > footer dt {font-family: "Roboto Condensed";text-transform: uppercase;font-weight: 600;}body > footer hr { border-color: #ffffff80; margin: 8px 0; } #footer-lists {flex-flow: row wrap;}#footer-lists > dl {flex: 1 0 0;}.branch-icon { width: 2em; font-size: 32px; align-items: center; justify-content: center; display: flex; } dd { margin-left: 2em;}
templates/post.html
@@ -0,0 +1,31 @@
<dl> <dt> <article class="card"> <section class="card-main"> {% if post.parent and not level %} <a href="{{ parent.parent.number }}"> <x-hbox class="box-center"> <iconify-icon icon="mdi:arrow-left"></iconify-icon> {{ post.parent.subject }} </x-hbox> </a> {% endif %} {% if level %} <h2><a href="{{ post.number }}">{{ post.subject }}</a></h2> {% else %} <h2>{{ post.subject }}</h2> {% endif %} <p><a href="/{{ post.owner.username }}">{{ post.owner.username }}</a> • {{ post.date | strftime("%A, %e %B %Y, %H:%M:%S") }}</p> <p> {{ post.message }} </p> </section> </article> </dt> {% set level = level + 1 %} {% if post.children %} {% for post in Post.query.filter_by(repo=repoData, parent=parent) %} <dd>{% include "post.html" %}</dd> {% endfor %} {% endif %} </dl>
templates/repo-forum-thread.html
@@ -0,0 +1,16 @@
{% extends "repo.html" %} {% block title %} Forum of {{ username }}/{{ repository }} {% endblock %} {% block content %} <x-vbox> <x-frame style="--width: 896px;" class="flexible-space"> <x-vbox> {% set parent = Post.query.filter_by(repo=repoData, number=postID).first() %} {% set post = parent %} {% set level = 0 %} {% include "post.html" %} </x-vbox> </x-frame> </x-vbox> {% endblock %}
templates/repo-forum.html
@@ -5,8 +5,19 @@
{% block content %} <x-vbox> <x-frame style="--width: 896px;" class="flexible-space"> {% for post in Post.query.filter_by(repo=repoData) %}{% endfor %}<x-vbox> {% for post in Post.query.filter_by(repo=repoData, parent=none) %} <article class="card card-horizontal"> <figure class="branch-icon"> <iconify-icon icon="mdi:note"></iconify-icon> </figure> <section class="card-main"> <h3><a href="{{ post.number }}">{{ post.subject }}</a></h3> <p><a href="/{{ post.owner.username }}">{{ post.owner.username }}</a></p> </section> </article> {% endfor %} </x-vbox></x-frame> </x-vbox> {% endblock %}{% endblock %}