Add UFC_HasEmailRedirect / UFC_NLSubscribed
authorRaphaël Barrois <raphael.barrois@polytechnique.org>
Sat, 29 Jan 2011 23:29:51 +0000 (00:29 +0100)
committerRaphaël Barrois <raphael.barrois@polytechnique.org>
Sat, 29 Jan 2011 23:35:00 +0000 (00:35 +0100)
Signed-off-by: Raphaël Barrois <raphael.barrois@polytechnique.org>
classes/userfilter.php
classes/userfilter/conditions.inc.php

index 1fd27a6..c900cfd 100644 (file)
@@ -863,6 +863,26 @@ class UserFilter extends PlFilter
         return $joins;
     }
 
+    /** NLS
+     */
+    private $nls = array();
+    public function addNewsLetterFilter($nlid)
+    {
+        $this->requireAccounts();
+        $sub = 'nl_' . $nlid;
+        $this->nls[$nlid] = $sub;
+        return $sub;
+    }
+
+    protected function newsLetterJoins()
+    {
+        $joins = array();
+        foreach ($this->nls as $key => $sub) {
+            $joins[$sub] = PlSqlJoin::left('newsletter_ins', '$ME.nlid = {?} AND $ME.uid = $UID', $key);
+        }
+        return $joins;
+    }
+
     /** BINETS
      */
 
@@ -901,6 +921,14 @@ class UserFilter extends PlFilter
         return $this->register_optional($this->e, $email);
     }
 
+    private $with_eo = false;
+    public function addEmailOptionsFilter()
+    {
+        $this->requireAccounts();
+        $this->with_eo = true;
+        return 'eo';
+    }
+
     private $ve = array();
     public function addVirtualEmailFilter($email = null)
     {
@@ -963,6 +991,9 @@ class UserFilter extends PlFilter
                                                                          a.email))',
                                                   $globals->mail->domain, $globals->mail->domain2);
         }
+        if ($this->with_eo) {
+            $joins['eo'] = PlSqlJoin::left('email_options', '$ME.uid = $UID');
+        }
         return $joins;
     }
 
index 5bc0668..766ee0c 100644 (file)
@@ -31,7 +31,7 @@
  */
 abstract class UserFilterCondition implements PlFilterCondition
 {
-    const OP_EQUALS     = '==';
+    const OP_EQUALS     = '=';
     const OP_GREATER    = '>';
     const OP_NOTGREATER = '<=';
     const OP_LESSER     = '<';
@@ -324,6 +324,19 @@ class UFC_Hrpid extends UserFilterCondition
     }
 }
 // }}}
+// {{{ class UFC_HasEmailRedirect
+/** Filters users, keeping only those with a valid email redirection.
+ */
+class UFC_HasEmailRedirect extends UserFilterCondition
+{
+    public function buildCondition(PlFilter $uf)
+    {
+        $sub_redirect = $uf->addEmailRedirectFilter();
+        $sub_options = $uf->addEmailOptionsFilter();
+        return 'e' . $sub_redirect . '.flags = \'active\' OR FIND_IN_SET(\'googleapps\', ' . $sub_options . '.storage)';
+    }
+}
+// }}}
 // {{{ class UFC_Ip
 /** Filters users based on one of their last IPs
  * @param $ip IP from which connection are checked
@@ -802,6 +815,28 @@ class UFC_Sex extends UserFilterCondition
     }
 }
 // }}}
+// {{{ class UFC_NLSubscribed
+/** Filters users based on NL subscription
+ * @param $nlid NL whose subscribers we are selecting
+ * @param $issue Select only subscribers who have not yet received that issue
+ */
+class UFC_NLSubscribed extends UserFilterCondition
+{
+    private $nlid;
+    private $issue_id;
+    public function __construct($nlid, $issue_id)
+    {
+        $this->nlid = $nlid;
+        $this->issue_id = $issue_id;
+    }
+
+    public function buildCondition(PlFilter $uf)
+    {
+        $sub = $uf->addNewsLetterFilter($this->nlid);
+        return XDB::format($sub . '.last < {?}', $this->issue_id);
+    }
+}
+// }}}
 // {{{ class UFC_Group
 /** Filters users based on group membership
  * @param $group Group whose members we are selecting