by roundabout, Monday, 11 November 2024, 19:52:01 (1731354721), pushed by roundabout, Monday, 11 November 2024, 19:52:04 (1731354724)
Author identity: vlad <vlad.muntoiu@gmail.com>
06f7d8c8570ff2659546b78c4cb5d7cbc49b269f
app.py
@@ -186,6 +186,37 @@ def search():
num_pages=results.pages)
@app.route("/user-search")
def user_search():
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 = User.query.filter(User.username.ilike(f"%{query}%")).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("user-search.html", results=results, query=query,
page_number=page_number,
page_length=page_length,
next_page=next_page,
prev_page=prev_page,
num_pages=results.pages)
@app.route("/language", methods=["POST"])
def set_locale():
response = flask.redirect(flask.request.referrer if flask.request.referrer else "/",
config.py
@@ -25,7 +25,7 @@ MAX_PAYLOAD_SIZE: int = 4 * 1024**3
AVATAR_SIZE: tuple = (192, 192)
HASHING_ROUNDS: int = 11
RESERVED_NAMES: tuple = ("git", "settings", "logout", "accounts", "info", "notifications", "about", "newrepo", "favourites", "data-api", "language", "help")
RESERVED_NAMES: tuple = ("git", "settings", "logout", "accounts", "info", "notifications", "about", "newrepo", "favourites", "data-api", "language", "help", "search", "user-search")
suggest_https: bool = False # this config is intended for a test server
port: int = 8080 # currently not shown in the UI, only used for critical communications
templates/home.html
@@ -13,7 +13,11 @@
<h1>{{ config.site_name }}</h1>
<h2>{% trans %}Search{% endtrans %}</h2>
<form action="/search" method="get" role="search" class="buttonbox">
<input type="text" name="q" placeholder="{% trans %}Search repositories...{% endtrans %}">
<input type="text" name="q" placeholder="{% trans %}Search repositories...{% endtrans %}" aria-label="Repository search">
<button type="submit">{% trans %}Search{% endtrans %}</button>
</form>
<form action="/user-search" method="get" role="search" class="buttonbox">
<input type="text" name="q" placeholder="{% trans %}Search users...{% endtrans %}" aria-label="User search">
<button type="submit">{% trans %}Search{% endtrans %}</button>
</form>
</x-frame>
templates/search.html
@@ -1,10 +1,7 @@
{% extends "default.html" %}
{% block title %}
{% trans %}Search repositories{% endtrans %}
{% endblock %}
{% block title %}
{% trans username=username, repository=repository %}Repository listing: {{ query }}{% endtrans %}
{% trans query=query %}Repository listing: {{ query }}{% endtrans %}
{% endblock %}
{% block content %}
<x-vbox>
@@ -20,7 +17,7 @@
{% endif %}
{% if result.url %}
<p>
Homepage: <a href="{{ result.url }}">{{ result.url }}</a>
{% trans %}Homepage:{% endtrans %} <a href="{{ result.url }}">{{ result.url }}</a>
</p>
{% endif %}
</section>
templates/user-search.html
@@ -0,0 +1,26 @@
{% extends "default.html" %}
{% block title %}
{% trans query=query %}User listing: {{ query }}{% endtrans %}
{% endblock %}
{% block content %}
<x-vbox>
<x-frame style="--width: 896px;" class="flexible-space">
<ul style="list-style: none;" class="noindent">
{% for result in results %}
<li>
<article class="card" style="flex: 0 1 auto;">
<section class="card-main">
<a href="{{ result.username }}"><h3>{{ result.username }}</h3></a>
{% if result.bio %}
<p>{{ result.bio }}</p>
{% endif %}
</section>
</article>
</li>
{% endfor %}
</ul>
{% include "pagination.html" %}
</x-frame>
</x-vbox>
{% endblock %}