mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
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:
parent
154bb239bf
commit
ff44eb02de
4 changed files with 61 additions and 3 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
{% 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 %}
|
||||||
|
|
|
@ -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()
|
||||||
|
)
|
||||||
|
|
Loading…
Add table
Reference in a new issue