Add a new option that makes it possible to subscribe to package
ownership changes (adoption/disownment).

Fixes FS#15412.

Signed-off-by: Lukas Fleischer <[email protected]>
---
 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 25102a2..5e5f377 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 0000000..0d3a9b7
--- /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 b39420f..be0981f 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 1691bff..5d10cce 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 b9affd6..b4f0192 100644
--- a/web/template/account_edit_form.php
+++ b/web/template/account_edit_form.php
@@ -143,6 +143,10 @@
                        <label for="id_updatenotify"><?= __("Notify of package 
updates") ?>:</label>
                        <input type="checkbox" name="UN" id="id_updatenotify" 
<?= $UN ? 'checked="checked"' : '' ?> />
                </p>
+               <p>
+                       <label for="id_ownershipnotify"><?= __("Notify of 
ownership changes") ?>:</label>
+                       <input type="checkbox" name="ON" 
id="id_ownershipnotify" <?= $ON ? 'checked="checked"' : '' ?> />
+               </p>
        </fieldset>
 
        <fieldset>
-- 
2.7.1

Reply via email to