roundabout,
created on Monday, 29 July 2024, 09:16:19 (1722244579),
received on Wednesday, 31 July 2024, 06:54:52 (1722408892)
Author identity: vlad <vlad.muntoiu@gmail.com>
b29f7c6dfec57a459d953d0cdecb23fbbc67ab3f
app.py
@@ -927,9 +927,6 @@ def repository_forum(username, repository):
repository) is not None):
flask.abort(403)
if not os.path.exists(server_repo_location):
return flask.render_template("errors/not-found.html"), 404
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
@@ -951,6 +948,64 @@ def repository_forum(username, repository):
)
@repositories.route("/<username>/<repository>/forum/search")
def repository_forum_search(username, repository):
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
if not os.path.exists(server_repo_location):
flask.abort(404)
if not (get_visibility(username, repository) or get_permission_level(
flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
query = flask.request.args.get("q")
page_number = flask.request.args.get("page", 1, type=int)
if flask.session.get("username"):
default_page_length = db.session.get(User, flask.session.get("username")).default_page_length
else:
default_page_length = 16
page_length = flask.request.args.get("per_page", default_page_length, type=int)
results = Post.query.filter(Post.repo == repo_data).filter(Post.subject.ilike(f"%{query}%") | Post.message.ilike(f"%{query}%")).order_by(Post.last_updated.desc()).paginate(page=page_number, per_page=page_length)
if results.has_next:
next_page = results.next_num
else:
next_page = None
if results.has_prev:
prev_page = results.prev_num
else:
prev_page = None
return flask.render_template(
"repo-forum-search.html",
username=username,
repository=repository,
repo_data=repo_data,
relationships=relationships,
user_relationship=user_relationship,
query=query,
results=results,
Post=Post,
remote=f"http{'s' if config.suggest_https else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
is_favourite=get_favourite(flask.session.get("username"), username, repository),
default_branch=repo_data.default_branch,
page_number=page_number,
page_length=page_length,
next_page=next_page,
prev_page=prev_page,
num_pages=results.pages
)
@repositories.route("/<username>/<repository>/forum/topic/<int:id>")
def repository_forum_topic(username, repository, id):
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
templates/repository/repo-forum-search.html
@@ -0,0 +1,36 @@
{% extends "repo.html" %}
{% set active_page = "forum" %}
{% block title %}
{% trans username=username, repository=repository %}Forum of {{ username }}/{{ repository }}{% endtrans %}
{% endblock %}
{% block content %}
<x-vbox>
<x-frame style="--width: 896px;" class="flexible-space">
<x-vbox>
<form class="vbox">
<input type="text" name="q" placeholder="{% trans %}Search...{% endtrans %}" value="{{ query }}">
</form>
{% for post in results %}
<article class="card card-horizontal">
{% if post.state == 0 %}
<div class="card-top state-label" style="background: var(--color-done); color: var(--color-done-text);">
{% trans %}done{% endtrans %}
</div>
{% elif post.state == 1 %}
<div class="card-top state-label" style="background: var(--color-pending); color: var(--color-pending-text);">
{% trans %}active{% endtrans %}
</div>
{% endif %}
<section class="card-main">
<a href="/{{ username }}/{{ repository }}/forum/{{ post.number }}"><h2>{{ post.subject }}</h2></a>
<p class="post-details"><a href="/{{ post.owner.username }}" class="post-author">{{ post.owner.username }}</a> • {{ post.date | strftime("%A, %e %B %Y, %H:%M:%S") }}</p>
<p>{{ post.html | safe }}</p>
</section>
</article>
{% endfor %}
</x-vbox>
{% include "pagination.html" %}
</x-frame>
</x-vbox>
{% endblock %}