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.orm import backref, relationship
from aurweb import schema
from aurweb import config, schema
from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.request_type import RequestType as _RequestType
@ -103,3 +106,16 @@ class PackageRequest(Base):
def status_display(self) -> str:
"""Return a display string for the Status column."""
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_depends = 1000
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_archive_time = 15552000
auto_orphan_age = 15552000

View file

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

View file

@ -1,7 +1,7 @@
import pytest
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.package_base import PackageBase
from aurweb.models.package_request import (
@ -190,3 +190,41 @@ def test_package_request_status_display(user: User, pkgbase: PackageBase):
pkgreq.Status = 124
with pytest.raises(KeyError):
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()
)