feat: add link to mailing list article on requests page

Provides a convenient way to check for responses on the
mailing list prior to Accepting/Rejecting requests.

We compute the Message-ID hash that can be used to
link back to the article in the mailing list archive.

Signed-off-by: moson-mo <mo-son@mailbox.org>
This commit is contained in:
moson-mo 2023-01-11 20:12:28 +01:00
parent 154bb239bf
commit ff44eb02de
No known key found for this signature in database
GPG key ID: 4A4760AB4EE15296
4 changed files with 61 additions and 3 deletions

View file

@ -1,7 +1,10 @@
import base64
import hashlib
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema from aurweb import config, schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.request_type import RequestType as _RequestType from aurweb.models.request_type import RequestType as _RequestType
@ -103,3 +106,16 @@ class PackageRequest(Base):
def status_display(self) -> str: def status_display(self) -> str:
"""Return a display string for the Status column.""" """Return a display string for the Status column."""
return self.STATUS_DISPLAY[self.Status] return self.STATUS_DISPLAY[self.Status]
def ml_message_id_hash(self) -> str:
"""Return the X-Message-ID-Hash that is used in the mailing list archive."""
# X-Message-ID-Hash is a base32 encoded SHA1 hash
msgid = f"pkg-request-{str(self.ID)}@aur.archlinux.org"
sha1 = hashlib.sha1(msgid.encode()).digest()
return base64.b32encode(sha1).decode()
def ml_message_url(self) -> str:
"""Return the mailing list URL for the request."""
url = config.get("options", "ml_thread_url") % (self.ml_message_id_hash())
return url

View file

@ -25,6 +25,7 @@ max_rpc_results = 5000
max_search_results = 2500 max_search_results = 2500
max_depends = 1000 max_depends = 1000
aur_request_ml = aur-requests@lists.archlinux.org aur_request_ml = aur-requests@lists.archlinux.org
ml_thread_url = https://lists.archlinux.org/archives/list/aur-requests@lists.archlinux.org/thread/%s
request_idle_time = 1209600 request_idle_time = 1209600
request_archive_time = 15552000 request_archive_time = 15552000
auto_orphan_age = 15552000 auto_orphan_age = 15552000

View file

@ -115,8 +115,11 @@
{% if result.User %} {% if result.User %}
<a href="/account/{{ result.User.Username }}"> <a href="/account/{{ result.User.Username }}">
{{ result.User.Username }} {{ result.User.Username }}
</a> </a>&nbsp;
{% endif %} {% endif %}
<a target="_blank" rel="noopener noreferrer" href="{{ result.ml_message_url() }}">
(PRQ#{{ result.ID }})
</a>
</td> </td>
{% set idle_time = config_getint("options", "request_idle_time") %} {% set idle_time = config_getint("options", "request_idle_time") %}
{% set time_delta = (utcnow - result.RequestTS) | int %} {% set time_delta = (utcnow - result.RequestTS) | int %}

View file

@ -1,7 +1,7 @@
import pytest import pytest
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import db, time from aurweb import config, db, time
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.package_base import PackageBase from aurweb.models.package_base import PackageBase
from aurweb.models.package_request import ( from aurweb.models.package_request import (
@ -190,3 +190,41 @@ def test_package_request_status_display(user: User, pkgbase: PackageBase):
pkgreq.Status = 124 pkgreq.Status = 124
with pytest.raises(KeyError): with pytest.raises(KeyError):
pkgreq.status_display() pkgreq.status_display()
def test_package_request_ml_message_id_hash(user: User, pkgbase: PackageBase):
with db.begin():
pkgreq = db.create(
PackageRequest,
ID=1,
ReqTypeID=MERGE_ID,
User=user,
PackageBase=pkgbase,
PackageBaseName=pkgbase.Name,
Comments=str(),
ClosureComment=str(),
Status=PENDING_ID,
)
# A hash composed with ID=1 should result in BNNNRWOFDRSQP4LVPT77FF2GUFR45KW5
assert pkgreq.ml_message_id_hash() == "BNNNRWOFDRSQP4LVPT77FF2GUFR45KW5"
def test_package_request_ml_message_url(user: User, pkgbase: PackageBase):
with db.begin():
pkgreq = db.create(
PackageRequest,
ID=1,
ReqTypeID=MERGE_ID,
User=user,
PackageBase=pkgbase,
PackageBaseName=pkgbase.Name,
Comments=str(),
ClosureComment=str(),
Status=PENDING_ID,
)
assert (
config.get("options", "ml_thread_url") % (pkgreq.ml_message_id_hash())
== pkgreq.ml_message_url()
)