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.lastPostID
self.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 %}