Switch to side-by-side view

--- a/ForgeClassic/sfx/model/mailman.py
+++ b/ForgeClassic/sfx/model/mailman.py
@@ -3,7 +3,7 @@
 from datetime import datetime
 
 import tg
-from sqlalchemy import and_
+import sqlalchemy as sa
 from pylons import c as context
 from pylons import g
 
@@ -12,13 +12,11 @@
 from pyforge.lib import helpers as h
 from .sfx_model import tables as T
 
-common_suffix = tg.config.get('forgemail.domain', '.sourceforge.net')
-
 class List(object):
+    PRIVATE=0
     PUBLIC=1
-    PRIVATE=0
+    DELETE=2
     HIDDEN=9
-    DELETE=2
 
     def __init__(self, name):
         self.name = name
@@ -26,7 +24,8 @@
     @classmethod
     def find(cls):
         q = T.mail_group_list.select()
-        q = q.where(T.mail_group_list.c.group_id==context.project.get_tool_data('sfx', 'group_id'))
+        q = q.where(
+            T.mail_group_list.c.group_id==context.project.get_tool_data('sfx', 'group_id'))
         for row in q.execute():
             lst = List(row['list_name'])
             lst._sitedb_row = row
@@ -35,45 +34,19 @@
     @LazyProperty
     def _sitedb_row(self):
         q = T.mail_group_list.select(T.mail_group_list.c.list_name==self.name)
-        q = q.where(T.mail_group_list.c.group_id==context.project.get_tool_data('sfx', 'group_id'))
+        q = q.where(
+            T.mail_group_list.c.group_id==context.project.get_tool_data('sfx', 'group_id'))
         return q.execute().first()
 
-    @LazyProperty
-    def _maildb_row(self):
-        q = T.lists.select(T.lists.c.list_name==self.name)
-        return q.execute().first()
-
-    @property
-    def group_id(self):
-        return self._sitedb_row['group_id']
-
-    @property
-    def group_list_id(self):
-        return self._sitedb_row['group_list_id']
-
-    @property
-    def description(self):
-        return self._sitedb_row['description']
-
-    @property
-    def is_public(self):
-        return self._sitedb_row['is_public']
+    def __getattr__(self, name):
+        try:
+            return self._sitedb_row[name]
+        except KeyError:
+            raise AttributeError, name
 
     @property
     def admin_url(self):
         return 'https://lists.sourceforge.net/mailman/admin/%s' % self.name
-
-    @property
-    def subscribers_url(self):
-        return g.url('/mail/admin/list_subscribers.php',
-                     group_id=self.group_id,
-                     group_list_id=self.group_list_id)
-
-    @property
-    def password_url(self):
-        return g.url('/mail/admin/list_adminpass.php',
-                     group_id=self.group_id,
-                     group_list_id=self.group_list_id)
 
     @classmethod
     def create(cls, name, is_public, description):
@@ -126,7 +99,7 @@
             return
 
         stmt = T.mail_group_list.update(
-            where=and_(
+            where=sa.and_(
                 T.mail_group_list.c.group_id==self.group_id,
                 T.mail_group_list.c.group_list_id==self.group_list_id))
         stmt.execute(is_public=is_public, description=description)
@@ -154,3 +127,31 @@
             operation_detail=operation_detail,
             operation_status_type='pending',
             operation_status_detail='Purge remove ml pending')
+
+    def change_password(self, new_password):
+        stmt = T.ml_password_change.insert()
+        stmt.execute(
+            ml_name=self.name,
+            password=new_password)
+
+    def subscribers(self, search_criteria=None, sort_by='user name', ):
+        q = T.mllist_subscriber.select()
+        q = q.where(T.mllist_subscriber.c.ml_list_name==self.name)
+        if search_criteria is not None:
+            q = q.where(T.mllist_subscriber.c.subscribed_email.ilike(search_criteria))
+        if sort_by != 'user name':
+            q = q.order_by(
+                sa.text("substring(subscribed_email from '@.*') ASC"))
+        q = q.order_by(T.mllist_subscriber.c.subscribed_email)
+        return (Subscriber(row) for row in q.execute())
+
+class Subscriber(object):
+
+    def __init__(self, row):
+        self._row = row
+
+    def __getattr__(self, name):
+        try:
+            return self._row[name]
+        except KeyError:
+            raise AttributeError, name