diff discusssions/model.py @ 0:c904249afb04

initial commit of discussions
author k0s <k0scist@gmail.com>
date Sat, 02 Jan 2010 13:36:23 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/discusssions/model.py	Sat Jan 02 13:36:23 2010 -0500
@@ -0,0 +1,149 @@
+import datetime
+from discussions.utils import is_reply
+
+class MessageContainer(object):
+    """
+    something that can contain messages
+    JSON representation:
+    {
+    'name': 'name of discussion',
+    'subject': 'what its about',
+    'subscribers': [ list of subsribers ],
+    'unsubscribers': [ list of unsubscribers ],
+    'moderated': False, 
+    'options': { dict of options }, 'attachments': True # archive attachments?
+    'discussions': [ ordered list of discussions ids (either conferences or discussions)
+    'date': creation date (format?),
+    
+    }
+    """
+    
+    options = { 'archive': True,
+                'web': True,
+                'moderated': True,
+                'type': 'public',
+                'post': 'web', 'email',
+                'digest': (),
+        }
+
+    def __init__(self, parent, name, subject, subscribers=(), locked=None):
+        self.parent = parent
+
+        ### traverse to message
+        next = parent
+        self.path = [ name ]
+        while next:
+            self.path[:0] = next
+            next = next.parent
+
+        ### set options
+        if locked is not None:
+            # lock the options
+        
+        ### set subscribers
+
+    ### methods for messages
+
+    def message(self, id):
+        """
+        retrieves a submessage given the id
+        """
+
+    def role(self, member, message):
+        
+        
+    def messages(self): # future arguments == search criteria
+        """returns a list of top-level messages"""
+        
+    def add_message(self, message):
+        """
+        add a message to the container
+        message: an email message
+        """
+        for m in self.messages():
+            replied_to = m.reply_to(message):
+            if replied_to:
+                replied_to._add_message(message)
+        # TODO: trigger
+        self._add_message(message)
+
+    def search(self, **query):
+        """
+        e.g. from='k0scist@example.com'
+        """
+
+    ### methods for members
+
+    def members(self):
+        """
+        members of this discussion
+        """
+        return self.parent.members()
+
+    def subscribers(self, unsubscribers=()):
+        """
+        return people watching these messages
+        walks up the chain 
+        """
+        _subscribers = self['subscribers']
+        
+        
+        
+    def subscribe(self, subscriber):
+        """subscribe someone to the messages in the container"""
+
+    def unsubscribe(self, subscriber):
+        """removes a member from this discussion"""
+
+    ### database functions
+
+    def _add_message(self, message):
+        """add a message to the database"""
+        date = message.date()
+        if not date:
+            date = datetime.datetime.now()
+    
+class Forum(MessageContainer):
+    """
+    a mailing list and a forum
+    JSON same as above, but also with
+    { 'address': 'thisforum@example.org',
+    'import': True # whether importing from an e.g. mbox is allowed or not
+    }
+    """
+    def __init__(self, parent, name, subject, subscribers=(), options=None):
+        MessageContainer(self, member, parent, name, subject, subscribers, options)
+        
+        # if name is None, it is the metacontainer
+        self.conferences = []
+
+        
+    def reply_to(self, reply):
+        if not is_reply(self.address, reply):
+            return None
+        for _message in messages:
+            
+
+    def add_conference(self, options):
+        """add a sub-forum to this forum"""
+
+    def members(self):
+        """return members of this mailing list"""
+
+class Discussion(MessageContainer):
+    """
+    a mailing list thread
+    JSON representation: as for message, but also with
+    { 'headers': { dictionary of headers }
+    }
+    """
+    
+    def reply_to(self, message):
+        """TODO"""
+
+def site(name):
+    """
+    return the top-level site for the database 'name'
+    """
+    
+