view 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 source

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'
    """