Notifyables.py :  » Issue-Tracker » IssueTracker » IssueTrackerProduct » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Issue Tracker » IssueTracker 
IssueTracker » IssueTrackerProduct » Notifyables.py
# python

# Zope
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from OFS import SimpleItem,Folder
from AccessControl import ClassSecurityInfo
from App.Dialogs import MessageDialog

try:
    # >= Zope 2.12
    from App.special_dtml import DTMLFile
    from App.class_init import InitializeClass
except ImportError:
    # < Zope 2.12
    from Globals import DTMLFile,InitializeClass


# Product
import Utils
from Constants import *



class Notifyables:

    # Global container
    #
    def hasGlobalContainer(self):
        """ Check if a global container exists """
        if hasattr(self, DEFAULT_NOTIFYABLECONTAINER_ID):
            return true
        else:
            return false

    def isGlobalHere(self):
        """ Check if we're "standing" in a global container """
        if hasattr(self, 'notifyables'):
            return false
        else:
            return true

    def _getManagementFormURL(self, msg=None):
        """ return the URL to redirect to for returning to
        the appropriate interface. """
        if self.isGlobalHere():
            url = self.absolute_url()
            url += '/manage_GlobalManagementForm'
        else:
            url = self.absolute_url()
            url += '/manage_ManagementNotifyables'
        if msg is not None:
            params = {'manage_tabs_message':msg}
            url = Utils.AddParam2URL(url, params)
        return url

    def getGlobalContainer(self):
        """ Return the global_notifyables object """
        return getattr(self, DEFAULT_NOTIFYABLECONTAINER_ID)
        

    def getManagementForm(self):
        """ Return correct management form depending on container """
        if self.isGlobalHere():
            return self.manage_GlobalManagementForm
        else:
            return self.manage_ManagementNotifyables
            #return self.manage_ManagementForm

        
    # Notifyables
    #

    def hasNotifyables(self):
        """ see if there are any notifyables at all """
        if len(self.getNotifyables()) > 0:
            return 1
        else:
            return 0

  
    def getNotifyables(self, only=None):
        """ Return all Notifyable objects """
        if only =='':
            only = None
            
        if only == 'global':
            local_container = None
        else:
            local_container = self.getNotifyablesObjectContainer(only='local')

        if only == 'local':
            global_container = None
        else:
            global_container = self.getNotifyablesObjectContainer(only='global')
            
        meta_type = NOTIFYABLE_METATYPE
        if local_container is None:
            local_notifyables = []
        else:
            local_notifyables = local_container.objectValues(meta_type)
        if global_container:
            global_notifyables = global_container.objectValues(meta_type)
            return local_notifyables + global_notifyables
        else:
            return local_notifyables

    def getNotifyablesByGroup(self, group, only=None):
        """ return a list of all notiyables belonging to this group """
        checked = []
        for notifyable in self.getNotifyables(only=only):
            if notifyable.partofGroup(group):
                checked.append(notifyable)

        return checked
        
    def getNotifyablesEmailName(self, only=None):
        """ wrap getNotifyables and return dictionary """
        email_name = {}
        for nf in self.getNotifyables(only=only):
            email_name[nf.getEmail()] = nf.getName()
        return email_name

    def manage_addNotifyables(self, REQUEST):
        """ Save notifyables (only via the web) """

        new_emails = REQUEST.get('new_email',[])
        no_created = 0
        no_attempted = 0
        for c in range(len(new_emails)):
            email = REQUEST['new_email'][c]
            alias = REQUEST['new_alias'][c]
            groups = REQUEST.get('new_groups',[])
            if email != '':
                no_attempted += 1
            if not isinstance(groups, list):
                groups = [groups]
            if Utils.ValidEmailAddress(email):
                self.manage_addNotifyable(email, alias, groups)
                no_created += 1

        if no_created == no_attempted:
            if len(new_emails) > 1:
                mtm = "Notifyables created."
            else:
                mtm = "Notifyable created."
        else:
            if len(new_emails) > 1:
                mtm = """%s out of %s were created.
                Check your input data."""%(no_created, no_attempted)
            else:
                mtm = "Notifyable not created. Check your input data"
        form = self.getManagementForm()
        return form(REQUEST, manage_tabs_message=mtm)

    def manage_addNotifyable(self, email, alias='', groups=[], REQUEST=None):
        """ Create notifyable object """
        email, alias = email.strip(), alias.strip()
        if Utils.ValidEmailAddress(email):
            container = self.getNotifyablesObjectContainer()
            id = self.GenerateNotifyableId(email)
            n = IssueTrackerNotifyable(id, alias, email, groups)
            container._setObject(id, n)

            if REQUEST is not None:
                mtm= "%s created."%NOTIFYABLE_METATYPE
                return MessageDialog(title=mtm, message=mtm,
                                     action='%s/manage_main' % REQUEST['URL1'])
        else:
            raise "InvalidEmailAddress", \
                  "Email address used (%s) was invalid"%email
            

    def manage_delNotifyables(self, REQUEST):
        """ Prepare which notifyable ids to remove """
        ids = REQUEST.get('del_notify_ids',[])
        container = self.getNotifyablesObjectContainer()
        container.manage_delObjects(ids)

        msg = "Notifyables deleted."
        url = self._getManagementFormURL(msg)

        REQUEST.RESPONSE.redirect(url)


    def _filterNotifyGroups(self, groups):
        """ Return the list groups but filter out groups that
            don't exists in getNotifyableGroups()
        """
        existing_group_ids = []
        for group in self.getNotifyableGroups():
            existing_group_ids.append(group.getId())
        n_groups=[]
        for group in groups:
            if group.strip() in existing_group_ids and \
               group.strip() not in n_groups:
                n_groups.append(group.strip())
        return n_groups
        

    # Notify groups
    #

    def hasOldProperty(self):
        """ Returns how many items in the old property """
        if hasattr(self, 'notify_groups') and \
           type(self.notify_groups)==ListType:
            return len(self.notify_groups)
        else:
            return 0

    def convertOldGroups2Objects(self, REQUEST=None):
        """ If still having the old property, recreate as objects """
        all_object_groups = self.getNotifyableGroupIds()
        if self.hasOldProperty():
            for each in self.notify_groups:
                try:
                    self.manage_addNotifyableGroup(each)
                except:
                    pass
            self.notify_groups = []

            if REQUEST is not None:
                form = self.getManagementForm()
                mtm = "Old property now updated for groups."
                return form(REQUEST, manage_tabs_message=mtm)


    def getGroupsByIds(self, ids):
        """ Return the objects of notifyable group ids """
        objects = self.getNotifyableGroups()
        r_objects = []
        for object in objects:
            if object.getId() in ids:
                r_objects.append(object)

        return r_objects
    
    def getNotifyableGroups(self, only=None):
        """ Get all notifyable groups """
        if only =='':
            only = None

        if only=='global':
            local_container = None
        else:
            local_container = self.getNotifyablesObjectContainer(only='local')

        if only=='local':
            global_container = None
        else:
            global_container = self.getNotifyablesObjectContainer(only='global')
            
        meta_type = NOTIFYABLEGROUP_METATYPE
        if local_container is None:
            local_notifyables = []
        else:
            local_notifyables = local_container.objectValues(meta_type)
        if global_container:
            global_notifyables = global_container.objectValues(meta_type)
            return local_notifyables + global_notifyables
        else:
            return local_notifyables

    def getNotifyableGroupIds(self):
        """ return the ids of all group objects """
        ids=[]
        for object in self.getNotifyableGroups():
            ids.append(object.getId())
        return ids
        
        
    def manage_delNotifyGroups(self, notify_groups, REQUEST=None):
        """ delete some groups from self.notify_groups """
        container = self.getNotifyablesObjectContainer()
        container.manage_delObjects(notify_groups)
        msg = 'Notifygroups deleted.'
        if REQUEST is not None:
            url = self._getManagementFormURL(msg)
            REQUEST.RESPONSE.redirect(url)
        else:
            return msg        

    def manage_saveNotifyGroup(self, notify_group, REQUEST):
        """ add one group (via the web only) """
        self.manage_addNotifyableGroup(notify_group)

        msg = "%s created."%NOTIFYABLEGROUP_METATYPE
        url = self._getManagementFormURL(msg)
        REQUEST.RESPONSE.redirect(url)
        

    def GenerateNotifyableId(self, email, length=10, int_length=None):
        """ generate a random id for a notifyable string """
        email= email.replace('@','_at_')
        return email

    def createNotifyGroupId(self, group):
        """ generate a random id for a notifyable string """
        group = Utils.safeId(group.strip())
        group = group.replace(' ','_').replace('-','_').lower()
        return group

    def manage_addNotifyableGroup(self, notify_group, REQUEST=None):
        """ Create a notifyable group """
        dest = self.getNotifyablesObjectContainer()
        id = self.createNotifyGroupId(notify_group)
        group = IssueTrackerNotifyableGroup(id, notify_group)
        dest._setObject(id, group)
        self = dest._getOb(id)

        if REQUEST is not None:
            mtm= "%s created."%NOTIFYABLEGROUP_METATYPE
            return MessageDialog(title=mtm, message=mtm,
                                 action='%s/manage_main' % REQUEST['URL1'])

    def getNotifyablesObjectContainer(self, only=None):
        """ Return the container where notifyables and groups"""
        # Tests whether we are in an IssueTracker
        if only is None:
            if hasattr(self, 'notifyables'):
                return self.notifyables
            else:
                return getattr(self,DEFAULT_NOTIFYABLECONTAINER_ID)
        elif only=='local':
            if hasattr(self, 'notifyables'):
                return self.notifyables
            else:
                return None
        elif only=='global':
            if hasattr(self, DEFAULT_NOTIFYABLECONTAINER_ID):
                return getattr(self,DEFAULT_NOTIFYABLECONTAINER_ID)
            else:
                return None
        else:
            return None


    # Templates
    #

    dtml_file = 'dtml/NotifyableManagementPartForm'
    NotifyableManagementPartForm = DTMLFile(dtml_file, globals())
    

class IssueTrackerNotifyable(SimpleItem.SimpleItem):
    """ IssueTrackerNotifyable class """

    meta_type = NOTIFYABLE_METATYPE
    icon = '%s/issuetracker_notifyable.gif'%ICON_LOCATION
    
    meta_types = []

    _properties=({'id':'alias',         'type': 'string', 'mode':'w'},
                 {'id':'email',         'type': 'string', 'mode':'w'},
                 {'id':'groups',        'type': 'lines',  'mode':'w'},
                 )
    
    security=ClassSecurityInfo()

    manage_editNotifyableForm = DTMLFile('dtml/editNotifyableForm', globals())
    
    manage_options = (
        {'label':'Properties', 'action':'manage_editNotifyableForm'},
        )
    
    def __init__(self, id, alias, email, groups=[]):
        """ init """
        if not Utils.ValidEmailAddress(email):
            raise "InvalidEmailAddress",\
                  "The email address (%s) was incorrect"%email
        else:
            self.id = id
            self.alias = alias.strip()
            self.email = email.strip()
            self.groups = groups

    def getName(self):
        """ Return self.alias. This might be in the future:
            self.firstname + self.lastname
        """
        return self.alias

    def getEmail(self):
        """ return the email address """
        return self.email

    def getTitle(self):
        """ return alias or email address """
        name = self.getName()
        if name:
            return name
        else:
            return self.getEmail()

    def getGroups(self):
        """ return groups """
        return self.groups

    def partofGroup(self, group):
        """ case insensitivly check if 'group' is part of this
        'self.groups' """
        these = [Utils.ss(x) for x in self.getGroups()]
        if isinstance(group, basestring):
            return Utils.ss(group) in these
        else:
            return Utils.ss(group.getTitle()) in these

    def showGroups(self):
        """ return blank or comma separated with brackets """
        

    def manage_editNotifyable(self, alias=None, email=None, groups=None,
                              REQUEST=None):
        """ save changes to Notifyable """
        no = self
        n={'id':no.id}
        if alias is not None:
            self.alias = alias.strip()
        if email is not None and Utils.ValidEmailAddress(email.strip()):
            self.email = email.strip()
        if groups is not None:
            if not isinstance(groups, list):
                groups = [groups]
            self.groups = groups

        msg = 'Notifyable updated.'
        if REQUEST is not None:
            url = self.absolute_url()+'/manage_editNotifyableForm'
            params = {'manage_tabs_message':msg}
            url = Utils.AddParam2URL(url, params)
            REQUEST.RESPONSE.redirect(url)
        else:
            return msg
        

    def getEmail(self):
        """ Return self.email """
        return self.email

    def getAlias(self):
        """ Return self.alias """
        return self.alias


        
InitializeClass(IssueTrackerNotifyable)


class IssueTrackerNotifyableGroup(SimpleItem.SimpleItem):
    """ IssueTrackerNotifyableGroup class """

    meta_type = NOTIFYABLEGROUP_METATYPE
    icon = '%s/issuetracker_notifyablegroup.gif'%ICON_LOCATION
    
    meta_types = []

    _properties=({'id':'title', 'type': 'string', 'mode':'w'},
                 )
    
    security=ClassSecurityInfo()

    manage_editNotifyableGroupForm = DTMLFile('dtml/editNotifyableGroupForm', globals())
    
    manage_options = (
        {'label':'Properties', 'action':'manage_editNotifyableGroupForm'},
        )
    
    def __init__(self, id, title):
        """ init """
        self.id = id
        self.title = title
        
    def getId(self):
        """ return id """
        return self.id

    def getTitle(self):
        """ return title """
        return self.title

    def manage_editNotifyableGroup(self, title=None, REQUEST=None):
        """ edit properties """
        if title is not None:
            self.title = title

        if REQUEST is not None:
            mtm="Group changed."
            form = self.manage_editNotifyableGroupForm
            return form(REQUEST, manage_tabs_message=mtm)
                                                       
        

        
InitializeClass(IssueTrackerNotifyable)

zpt_file = 'zpt/addNotifyableContainerForm'
manage_addNotifyableContainerForm = PageTemplateFile(zpt_file, globals())

def manage_addNotifyableContainer(dispatcher, REQUEST=None):
    """ Create a notifyable container object """
    id = DEFAULT_NOTIFYABLECONTAINER_ID
    title = DEFAULT_NOTIFYABLECONTAINER_TITLE
    
    dest = dispatcher.Destination()
    container = IssueTrackerNotifyableContainer(id, title)
    dest._setObject(id, container)
    self = dest._getOb(id)

    if REQUEST is not None:
        mtm= "%s created."%NOTIFYABLECONTAINER_METATYPE
        if int(REQUEST.get('goto_after',0)):
            page = self.manage_GlobalManagementForm
            return page(self, REQUEST, manage_tabs_message=mtm)
        else:
            return MessageDialog(title=mtm, message=mtm,
                             action='%s/manage_main' % REQUEST['URL1'])
    

class IssueTrackerNotifyableContainer(Folder.Folder, 
                                      Notifyables):
    """ IssueTrackerNotifyableContainer class """

    meta_type = NOTIFYABLECONTAINER_METATYPE
    icon = '%s/issuetracker_notifyablegroup.gif'%ICON_LOCATION
    
    #meta_types = [NOTIFYABLEGROUP_METATYPE]

    _properties=({'id':'title',         'type': 'string', 'mode':'w'},
                 {'id':'groups',        'type': 'lines',  'mode':'w'},
                 )
    
    security=ClassSecurityInfo()

    dtml_file = 'dtml/GlobalManagementForm'
    manage_GlobalManagementForm = DTMLFile(dtml_file, globals())
    
    manage_options = (
        {'label':'Management', 'action':'manage_GlobalManagementForm'},
        Folder.Folder.manage_options[0]
        )
    
    def __init__(self, id, title, groups=[]):
        self.id = id
        self.title = title
        self.groups = groups

    def getRandomString(self, length=5, loweronly=0, numbersonly=0):
        """ return a completely random piece of string """
        script = Utils.getRandomString
        return script(length, loweronly, numbersonly)
    
InitializeClass(IssueTrackerNotifyableContainer)
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.