mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
feature: add filters and stats for requests
Signed-off-by: Leonidas Spyropoulos <artafinde@archlinux.org>
This commit is contained in:
parent
da5a646a73
commit
b757e66997
3 changed files with 116 additions and 5 deletions
|
@ -8,7 +8,12 @@ from aurweb import db, defaults, time, util
|
||||||
from aurweb.auth import creds, requires_auth
|
from aurweb.auth import creds, requires_auth
|
||||||
from aurweb.exceptions import handle_form_exceptions
|
from aurweb.exceptions import handle_form_exceptions
|
||||||
from aurweb.models import PackageRequest
|
from aurweb.models import PackageRequest
|
||||||
from aurweb.models.package_request import PENDING_ID, REJECTED_ID
|
from aurweb.models.package_request import (
|
||||||
|
ACCEPTED_ID,
|
||||||
|
CLOSED_ID,
|
||||||
|
PENDING_ID,
|
||||||
|
REJECTED_ID,
|
||||||
|
)
|
||||||
from aurweb.requests.util import get_pkgreq_by_id
|
from aurweb.requests.util import get_pkgreq_by_id
|
||||||
from aurweb.scripts import notify
|
from aurweb.scripts import notify
|
||||||
from aurweb.templates import make_context, render_template
|
from aurweb.templates import make_context, render_template
|
||||||
|
@ -22,26 +27,59 @@ async def requests(
|
||||||
request: Request,
|
request: Request,
|
||||||
O: int = Query(default=defaults.O),
|
O: int = Query(default=defaults.O),
|
||||||
PP: int = Query(default=defaults.PP),
|
PP: int = Query(default=defaults.PP),
|
||||||
|
filter_pending: bool = False,
|
||||||
|
filter_closed: bool = False,
|
||||||
|
filter_accepted: bool = False,
|
||||||
|
filter_rejected: bool = False,
|
||||||
):
|
):
|
||||||
context = make_context(request, "Requests")
|
context = make_context(request, "Requests")
|
||||||
|
|
||||||
context["q"] = dict(request.query_params)
|
context["q"] = dict(request.query_params)
|
||||||
|
|
||||||
|
if len(dict(request.query_params)) == 0:
|
||||||
|
filter_pending = True
|
||||||
|
|
||||||
O, PP = util.sanitize_params(O, PP)
|
O, PP = util.sanitize_params(O, PP)
|
||||||
context["O"] = O
|
context["O"] = O
|
||||||
context["PP"] = PP
|
context["PP"] = PP
|
||||||
|
context["filter_pending"] = filter_pending
|
||||||
|
context["filter_closed"] = filter_closed
|
||||||
|
context["filter_accepted"] = filter_accepted
|
||||||
|
context["filter_rejected"] = filter_rejected
|
||||||
|
|
||||||
# A PackageRequest query
|
# A PackageRequest query
|
||||||
query = db.query(PackageRequest)
|
query = db.query(PackageRequest)
|
||||||
|
|
||||||
|
# Requests statistics
|
||||||
|
context["total_requests"] = query.count()
|
||||||
|
pending_count = 0 + query.filter(PackageRequest.Status == PENDING_ID).count()
|
||||||
|
context["pending_requests"] = pending_count
|
||||||
|
closed_count = 0 + query.filter(PackageRequest.Status == CLOSED_ID).count()
|
||||||
|
context["closed_requests"] = closed_count
|
||||||
|
accepted_count = 0 + query.filter(PackageRequest.Status == ACCEPTED_ID).count()
|
||||||
|
context["accepted_requests"] = accepted_count
|
||||||
|
rejected_count = 0 + query.filter(PackageRequest.Status == REJECTED_ID).count()
|
||||||
|
context["rejected_requests"] = rejected_count
|
||||||
|
|
||||||
|
# Apply filters
|
||||||
|
in_filters = []
|
||||||
|
if filter_pending:
|
||||||
|
in_filters.append(PENDING_ID)
|
||||||
|
if filter_closed:
|
||||||
|
in_filters.append(CLOSED_ID)
|
||||||
|
if filter_accepted:
|
||||||
|
in_filters.append(ACCEPTED_ID)
|
||||||
|
if filter_rejected:
|
||||||
|
in_filters.append(REJECTED_ID)
|
||||||
|
filtered = query.filter(PackageRequest.Status.in_(in_filters))
|
||||||
# If the request user is not elevated (TU or Dev), then
|
# If the request user is not elevated (TU or Dev), then
|
||||||
# filter PackageRequests which are owned by the request user.
|
# filter PackageRequests which are owned by the request user.
|
||||||
if not request.user.is_elevated():
|
if not request.user.is_elevated():
|
||||||
query = query.filter(PackageRequest.UsersID == request.user.ID)
|
filtered = filtered.filter(PackageRequest.UsersID == request.user.ID)
|
||||||
|
|
||||||
context["total"] = query.count()
|
context["total"] = filtered.count()
|
||||||
context["results"] = (
|
context["results"] = (
|
||||||
query.order_by(
|
filtered.order_by(
|
||||||
# Order primarily by the Status column being PENDING_ID,
|
# Order primarily by the Status column being PENDING_ID,
|
||||||
# and secondarily by RequestTS; both in descending order.
|
# and secondarily by RequestTS; both in descending order.
|
||||||
case([(PackageRequest.Status == PENDING_ID, 1)], else_=0).desc(),
|
case([(PackageRequest.Status == PENDING_ID, 1)], else_=0).desc(),
|
||||||
|
|
|
@ -4,6 +4,65 @@
|
||||||
{% set plural = "%d package requests found." %}
|
{% set plural = "%d package requests found." %}
|
||||||
|
|
||||||
{% block pageContent %}
|
{% block pageContent %}
|
||||||
|
<div class="box">
|
||||||
|
<h2>{{ "Requests" | tr }}</h2>
|
||||||
|
<h3>{{ "Total Statistics" | tr }}</h3>
|
||||||
|
<table class="no-width">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{ "Total" | tr }}:</td>
|
||||||
|
<td>{{ total_requests }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{ "Pending" | tr }}:</td>
|
||||||
|
<td>{{ pending_requests }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{ "Closed" | tr }}:</td>
|
||||||
|
<td>{{ closed_requests }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{ "Accepted" | tr }}:</td>
|
||||||
|
<td>{{ accepted_requests }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{ "Rejected" | tr }}:</td>
|
||||||
|
<td>{{ rejected_requests }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<h3>{{ "Filters" | tr }}</h3>
|
||||||
|
<div class="box filter-criteria">
|
||||||
|
<form id="todolist_filter" method="get" action="/requests">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{{ "Select filter criteria" | tr }}</legend>
|
||||||
|
<div>
|
||||||
|
<label for="id_filter_pending" title="Pending">{{ "Pending" | tr }}</label>
|
||||||
|
<input type="checkbox" name="filter_pending" id="id_filter_pending" value="True" {{ "checked" if
|
||||||
|
filter_pending == true }}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="id_filter_closed" title="Closed">{{ "Closed" | tr }}</label>
|
||||||
|
<input type="checkbox" name="filter_closed" id="id_filter_closed" value="True" {{ "checked" if
|
||||||
|
filter_closed == true }}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="id_filter_accepted" title="Accepted">{{ "Accepted" | tr }}</label>
|
||||||
|
<input type="checkbox" name="filter_accepted" id="id_filter_accepted" value="True" {{ "checked" if
|
||||||
|
filter_accepted == true }}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="id_filter_rejected" title="Rejected">{{ "Rejected" | tr }}</label>
|
||||||
|
<input type="checkbox" name="filter_rejected" id="id_filter_rejected" value="True" {{ "checked" if
|
||||||
|
filter_rejected == true }}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type='submit' class='button' name='submit' value='Filter'>{{ "Filter" | tr }}</button>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div id="pkglist-results" class="box">
|
<div id="pkglist-results" class="box">
|
||||||
{% if not total %}
|
{% if not total %}
|
||||||
<p>{{ "No requests matched your search criteria." | tr }}</p>
|
<p>{{ "No requests matched your search criteria." | tr }}</p>
|
||||||
|
|
|
@ -717,6 +717,10 @@ def test_requests(
|
||||||
"O": 0, # Page 1
|
"O": 0, # Page 1
|
||||||
"SeB": "nd",
|
"SeB": "nd",
|
||||||
"SB": "n",
|
"SB": "n",
|
||||||
|
"filter_pending": True,
|
||||||
|
"filter_closed": True,
|
||||||
|
"filter_accepted": True,
|
||||||
|
"filter_rejected": True,
|
||||||
},
|
},
|
||||||
cookies=cookies,
|
cookies=cookies,
|
||||||
)
|
)
|
||||||
|
@ -732,7 +736,17 @@ def test_requests(
|
||||||
|
|
||||||
# Request page 2 of the requests page.
|
# Request page 2 of the requests page.
|
||||||
with client as request:
|
with client as request:
|
||||||
resp = request.get("/requests", params={"O": 50}, cookies=cookies) # Page 2
|
resp = request.get(
|
||||||
|
"/requests",
|
||||||
|
params={
|
||||||
|
"O": 50,
|
||||||
|
"filter_pending": True,
|
||||||
|
"filter_closed": True,
|
||||||
|
"filter_accepted": True,
|
||||||
|
"filter_rejected": True,
|
||||||
|
},
|
||||||
|
cookies=cookies,
|
||||||
|
) # Page 2
|
||||||
assert resp.status_code == int(HTTPStatus.OK)
|
assert resp.status_code == int(HTTPStatus.OK)
|
||||||
|
|
||||||
assert "‹ Previous" in resp.text
|
assert "‹ Previous" in resp.text
|
||||||
|
|
Loading…
Add table
Reference in a new issue