From 6ec4a3589e327ded693ab0c741828fc5ec66b840 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer
Date: Sun, 21 Feb 2016 19:44:38 +0100
Subject: Send notifications when changing ownership
Add a new option that makes it possible to subscribe to package
ownership changes (adoption/disownment).
Fixes FS#15412.
Signed-off-by: Lukas Fleischer
---
scripts/notify.py | 44 ++++++++++++++++++++++++++++++++++++++
upgrading/4.3.0.txt | 5 +++++
web/lib/acctfuncs.inc.php | 7 ++++--
web/lib/pkgbasefuncs.inc.php | 8 ++++++-
web/template/account_edit_form.php | 4 ++++
5 files changed, 65 insertions(+), 3 deletions(-)
create mode 100644 upgrading/4.3.0.txt
diff --git a/scripts/notify.py b/scripts/notify.py
index 25102a26..5e5f3772 100755
--- a/scripts/notify.py
+++ b/scripts/notify.py
@@ -115,6 +115,16 @@ def get_update_recipients(cur, pkgbase_id, uid):
return [row[0] for row in cur.fetchall()]
+def get_ownership_recipients(cur, pkgbase_id, uid):
+ cur.execute('SELECT DISTINCT Users.Email FROM Users ' +
+ 'INNER JOIN PackageNotifications ' +
+ 'ON PackageNotifications.UserID = Users.ID WHERE ' +
+ 'Users.OwnershipNotify = 1 AND ' +
+ 'PackageNotifications.UserID != %s AND ' +
+ 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id])
+ return [row[0] for row in cur.fetchall()]
+
+
def get_request_recipients(cur, reqid):
cur.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' +
'INNER JOIN PackageBases ' +
@@ -243,6 +253,38 @@ def flag(cur, uid, pkgbase_id):
send_notification(to, subject, body, refs)
+def adopt(cur, pkgbase_id, uid):
+ user = username_from_id(cur, uid)
+ pkgbase = pkgbase_from_id(cur, pkgbase_id)
+ to = get_ownership_recipients(cur, pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Ownership Notification for %s' % (pkgbase)
+ body = 'The package %s [1] was adopted by %s [2].' % (pkgbase, user)
+ refs = '[1] ' + pkgbase_uri + '\n'
+ refs += '[2] ' + user_uri
+
+ send_notification(to, subject, body, refs)
+
+
+def disown(cur, pkgbase_id, uid):
+ user = username_from_id(cur, uid)
+ pkgbase = pkgbase_from_id(cur, pkgbase_id)
+ to = get_ownership_recipients(cur, pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Ownership Notification for %s' % (pkgbase)
+ body = 'The package %s [1] was disowned by %s [2].' % (pkgbase, user)
+ refs = '[1] ' + pkgbase_uri + '\n'
+ refs += '[2] ' + user_uri
+
+ send_notification(to, subject, body, refs)
+
+
def comaintainer_add(cur, pkgbase_id, uid):
pkgbase = pkgbase_from_id(cur, pkgbase_id)
to = [get_user_email(cur, uid)]
@@ -364,6 +406,8 @@ if __name__ == '__main__':
'comment': comment,
'update': update,
'flag': flag,
+ 'adopt': adopt,
+ 'disown': disown,
'comaintainer-add': comaintainer_add,
'comaintainer-remove': comaintainer_remove,
'delete': delete,
diff --git a/upgrading/4.3.0.txt b/upgrading/4.3.0.txt
new file mode 100644
index 00000000..0d3a9b7b
--- /dev/null
+++ b/upgrading/4.3.0.txt
@@ -0,0 +1,5 @@
+1. Add a column to store ownership notification settings:
+
+----
+ALTER TABLE Users ADD COLUMN OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1;
+----
diff --git a/web/lib/acctfuncs.inc.php b/web/lib/acctfuncs.inc.php
index b39420fe..be0981f2 100644
--- a/web/lib/acctfuncs.inc.php
+++ b/web/lib/acctfuncs.inc.php
@@ -58,13 +58,14 @@ function html_format_pgp_fingerprint($fingerprint) {
* @param string $J The inactivity status of the displayed user
* @param string $CN Whether to notify of new comments
* @param string $UN Whether to notify of package updates
+ * @param string $ON Whether to notify of ownership changes
* @param string $UID The user ID of the displayed user
* @param string $N The username as present in the database
*
* @return void
*/
function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="",
- $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") {
+ $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") {
global $SUPPORTED_LANGS;
include("account_edit_form.php");
@@ -92,13 +93,14 @@ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R=""
* @param string $J The inactivity status of the user
* @param string $CN Whether to notify of new comments
* @param string $UN Whether to notify of package updates
+ * @param string $ON Whether to notify of ownership changes
* @param string $UID The user ID of the modified account
* @param string $N The username as present in the database
*
* @return array Boolean indicating success and message to be printed
*/
function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",
- $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") {
+ $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") {
global $SUPPORTED_LANGS;
$error = '';
@@ -347,6 +349,7 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C=""
$q.= ", InactivityTS = " . $inactivity_ts;
$q.= ", CommentNotify = " . ($CN ? "1" : "0");
$q.= ", UpdateNotify = " . ($UN ? "1" : "0");
+ $q.= ", OwnershipNotify = " . ($ON ? "1" : "0");
$q.= " WHERE ID = ".intval($UID);
$result = $dbh->exec($q);
diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php
index 1691bff7..5d10cce5 100644
--- a/web/lib/pkgbasefuncs.inc.php
+++ b/web/lib/pkgbasefuncs.inc.php
@@ -661,6 +661,9 @@ function pkgbase_adopt ($base_ids, $action=true, $via) {
$q.= "SET MaintainerUID = $uid ";
$q.= "WHERE ID IN (" . implode(",", $base_ids) . ") ";
$dbh->exec($q);
+
+ /* Add the new maintainer to the notification list. */
+ pkgbase_notify($base_ids);
} else {
/* Update the co-maintainer list when disowning a package. */
if (has_credential(CRED_PKGBASE_DISOWN)) {
@@ -692,8 +695,11 @@ function pkgbase_adopt ($base_ids, $action=true, $via) {
}
}
+ foreach ($base_ids as $base_id) {
+ notify(array($action ? 'adopt' : 'disown', $base_id, $uid));
+ }
+
if ($action) {
- pkgbase_notify($base_ids);
return array(true, __("The selected packages have been adopted."));
} else {
return array(true, __("The selected packages have been disowned."));
diff --git a/web/template/account_edit_form.php b/web/template/account_edit_form.php
index b9affd64..b4f01926 100644
--- a/web/template/account_edit_form.php
+++ b/web/template/account_edit_form.php
@@ -143,6 +143,10 @@
/>
+
+
+ />
+