Mercurial > libervia-backend
diff src/plugins/plugin_misc_maildir.py @ 594:e629371a28d3
Fix pep8 support in src/plugins.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 18 Jan 2013 17:55:35 +0100 |
parents | beaf6bec2fcd |
children | 84a6e83157c2 |
line wrap: on
line diff
--- a/src/plugins/plugin_misc_maildir.py Mon Jan 21 00:59:50 2013 +0100 +++ b/src/plugins/plugin_misc_maildir.py Fri Jan 18 17:55:35 2013 +0100 @@ -21,54 +21,54 @@ from logging import debug, info, error import warnings -warnings.filterwarnings('ignore','the MimeWriter',DeprecationWarning,'twisted' ) #FIXME: to be removed, see http://twistedmatrix.com/trac/ticket/4038 +warnings.filterwarnings('ignore', 'the MimeWriter', DeprecationWarning, 'twisted') # FIXME: to be removed, see http://twistedmatrix.com/trac/ticket/4038 from twisted.internet import protocol from twisted.words.protocols.jabber import error as jab_error -from twisted.cred import portal,checkers -from twisted.mail import imap4,maildir +from twisted.cred import portal, checkers +from twisted.mail import imap4, maildir from email.parser import Parser import email.message from email.charset import Charset -import os,os.path +import os from cStringIO import StringIO from twisted.internet import reactor import pdb from sat.core.exceptions import ProfileUnknownError from sat.memory.persistent import PersistentBinaryDict - from zope.interface import implements - PLUGIN_INFO = { -"name": "Maildir Plugin", -"import_name": "Maildir", -"type": "Misc", -"protocols": [], -"dependencies": [], -"main": "MaildirBox", -"handler": "no", -"description": _("""Intercept "normal" type messages, and put them in a Maildir type box""") + "name": "Maildir Plugin", + "import_name": "Maildir", + "type": "Misc", + "protocols": [], + "dependencies": [], + "main": "MaildirBox", + "handler": "no", + "description": _("""Intercept "normal" type messages, and put them in a Maildir type box""") } MAILDIR_PATH = "Maildir" + class MaildirError(Exception): pass + class MaildirBox(object): def __init__(self, host): info(_("Plugin Maildir initialization")) self.host = host - self.__observed={} - self.data={} #list of profile spectific data. key = profile, value = PersistentBinaryDict where key=mailbox name, + self.__observed = {} + self.data = {} # list of profile spectific data. key = profile, value = PersistentBinaryDict where key=mailbox name, # and value is a dictionnary with the following value # - cur_idx: value of the current unique integer increment (UID) # - message_id (as returned by MaildirMailbox): a tuple of (UID, [flag1, flag2, ...]) - pList=host.memory.getProfilesList #shorter :) - self.__mailboxes={} #key: profile, value: {boxname: MailboxUser instance} + pList = host.memory.getProfilesList # shorter :) + self.__mailboxes = {} # key: profile, value: {boxname: MailboxUser instance} #the triggers host.trigger.add("MessageReceived", self.messageReceivedTrigger) @@ -76,11 +76,12 @@ def profileConnected(self, profile): """Called on profile connection, create profile data""" self.data[profile] = PersistentBinaryDict("plugin_maildir", profile) - self.__mailboxes[profile]={} + self.__mailboxes[profile] = {} + def dataLoaded(ignore): if not self.data[profile]: #the mailbox is new, we initiate the data - self.data[profile]["INBOX"] = {"cur_idx":0} + self.data[profile]["INBOX"] = {"cur_idx": 0} self.data[profile].load().addCallback(dataLoaded) def profileDisconnected(self, profile): @@ -108,8 +109,8 @@ profile = self.host.memory.getProfileName(profile_key) if not profile: raise ProfileUnknownError(profile_key) - if not self.__mailboxes[profile].has_key(boxname): - self.__mailboxes[profile][boxname]=MailboxUser(self, boxname, observer, profile=profile) + if boxname not in self.__mailboxes[profile]: + self.__mailboxes[profile][boxname] = MailboxUser(self, boxname, observer, profile=profile) else: if observer: self.addObserver(observer, profile, boxname) @@ -118,33 +119,33 @@ def _getProfilePath(self, profile): """Return a unique path for profile's mailbox The path must be unique, usable as a dir name, and bijectional""" - return profile.replace('/','_').replace('..','_') #FIXME: this is too naive to work well, must be improved + return profile.replace('/', '_').replace('..', '_') # FIXME: this is too naive to work well, must be improved def _removeBoxAccess(self, boxname, mailboxUser, profile): """Remove a reference to a box @param name: name of the box @param mailboxUser: MailboxUser instance""" - if not self.__mailboxes.has_key(boxname): - err_msg=_("Trying to remove an mailboxUser not referenced") + if boxname not in self.__mailboxes: + err_msg = _("Trying to remove an mailboxUser not referenced") error(_("INTERNAL ERROR: ") + err_msg) raise MaildirError(err_msg) - assert self.__mailboxes[profile][boxname]==mailboxUser + assert self.__mailboxes[profile][boxname] == mailboxUser del __mailboxes[profile][boxname] def _checkBoxReference(self, boxname, profile): """Check if there is a reference on a box, and return it @param boxname: name of the box to check @return: MailboxUser instance or None""" - if self.__mailboxes.has_key(profile): - if self.__mailboxes[profile].has_key(boxname): + if profile in self.__mailboxes: + if boxname in self.__mailboxes[profile]: return self.__mailboxes[profile][boxname] def __getBoxData(self, boxname, profile): """Return the date of a box""" try: - return self.data[profile][boxname] #the boxname MUST exist in the data + return self.data[profile][boxname] # the boxname MUST exist in the data except KeyError: - err_msg=_("Boxname doesn't exist in internal data") + err_msg = _("Boxname doesn't exist in internal data") error(_("INTERNAL ERROR: ") + err_msg) raise MaildirError(err_msg) @@ -155,11 +156,11 @@ @param message_id: unique id of the message as given by MaildirMailbox @return: Integer UID""" box_data = self.__getBoxData(boxname, profile) - if box_data.has_key(message_id): + if message_id in box_data: ret = box_data[message_id][0] else: - box_data['cur_idx']+=1 - box_data[message_id]=[box_data['cur_idx'],[]] + box_data['cur_idx'] += 1 + box_data[message_id] = [box_data['cur_idx'], []] ret = box_data[message_id] self.data[profile].force(boxname) return ret @@ -170,7 +171,7 @@ @param boxname: name of the box where the message is @return: Integer UID""" box_data = self.__getBoxData(boxname, profile) - return box_data['cur_idx']+1 + return box_data['cur_idx'] + 1 def getNextExistingUid(self, boxname, uid, profile): """Give the next uid of existing message @@ -178,10 +179,10 @@ @param uid: uid to start from @return: uid or None if the is no more message""" box_data = self.__getBoxData(boxname, profile) - idx=uid+1 - while self.getIdFromUid(boxname, idx, profile) == None: #TODO: this is highly inefficient because getIdfromUid is inefficient, fix this - idx+=1 - if idx>box_data['cur_idx']: + idx = uid + 1 + while self.getIdFromUid(boxname, idx, profile) is None: # TODO: this is highly inefficient because getIdfromUid is inefficient, fix this + idx += 1 + if idx > box_data['cur_idx']: return None return idx @@ -198,7 +199,7 @@ @param message_uid: unique integer identifier @return: unique id of the message as given by MaildirMailbox or None if not found""" box_data = self.__getBoxData(boxname, profile) - for message_id in box_data.keys(): #TODO: this is highly inefficient on big mailbox, must be replaced in the future + for message_id in box_data.keys(): # TODO: this is highly inefficient on big mailbox, must be replaced in the future if message_id == 'cur_idx': continue if box_data[message_id][0] == message_uid: @@ -211,7 +212,7 @@ @param message_idx: message id as given by MaildirMailbox @return: list of strings""" box_data = self.__getBoxData(boxname, profile) - if not box_data.has_key(mess_id): + if mess_id not in box_data: raise MailboxException("Trying to get flags from an unexisting message") return box_data[mess_id][1] @@ -222,11 +223,11 @@ @param flags: list of strings """ box_data = self.__getBoxData(boxname, profile) - assert(type(flags)==list) - flags=[flag.upper() for flag in flags] #we store every flag UPPERCASE - if not box_data.has_key(mess_id): + assert(type(flags) == list) + flags = [flag.upper() for flag in flags] # we store every flag UPPERCASE + if mess_id not in box_data: raise MailboxException("Trying to set flags for an unexisting message") - box_data[mess_id][1]=flags + box_data[mess_id][1] = flags self.data[profile].force(boxname) def getMessageIdsWithFlag(self, boxname, flag, profile): @@ -235,11 +236,11 @@ @param flag: flag to check @return: list of id (as given by MaildirMailbox)""" box_data = self.__getBoxData(boxname, profile) - assert(isinstance(flag,basestring)) - flag=flag.upper() + assert(isinstance(flag, basestring)) + flag = flag.upper() result = [] for key in box_data: - if key=='cur_idx': + if key == 'cur_idx': continue if flag in box_data[key][1]: result.append(key) @@ -250,8 +251,8 @@ @param boxname: name of the box where the message is """ box_data = self.__getBoxData(boxname, profile) - for mess_id in self.getMessageIdsWithFlag(boxname,"\\Deleted", profile): - del(box_data[mess_id]) + for mess_id in self.getMessageIdsWithFlag(boxname, "\\Deleted", profile): + del(box_data[mess_id]) self.data[profile].force(boxname) def cleanTable(self, boxname, existant_id, profile): @@ -259,9 +260,9 @@ @param boxname: name of the box to clean @param existant_id: list of id which actually exist""" box_data = self.__getBoxData(boxname, profile) - to_remove=[] + to_remove = [] for key in box_data: - if key not in existant_id and key!="cur_idx": + if key not in existant_id and key != "cur_idx": to_remove.append(key) for key in to_remove: del box_data[key] @@ -271,34 +272,34 @@ @param callback: method to call when the the box is updated @param boxname: name of the box to observe @param signal: which signal is observed by the caller""" - if not self.__observed.has_key((profile,boxname)): - self.__observed[(profile,boxname)]={} - if not self.__observed[(profile,boxname)].has_key(signal): - self.__observed[(profile,boxname)][signal]=set() - self.__observed[(profile,boxname)][signal].add(callback) + if (profile, boxname) not in self.__observed: + self.__observed[(profile, boxname)] = {} + if signal not in self.__observed[(profile, boxname)]: + self.__observed[(profile, boxname)][signal] = set() + self.__observed[(profile, boxname)][signal].add(callback) def removeObserver(self, callback, profile, boxname, signal="NEW_MESSAGE"): """Remove an observer of maildir box changes @param callback: method to remove from obervers @param boxname: name of the box which was observed @param signal: which signal was observed by the caller""" - if not self.__observed.has_key((profile,boxname)): - err_msg=_("Trying to remove an observer for an inexistant mailbox") + if (profile, boxname) not in self.__observed: + err_msg = _("Trying to remove an observer for an inexistant mailbox") error(_("INTERNAL ERROR: ") + err_msg) raise MaildirError(err_msg) - if not self.__observed[(profile,boxname)].has_key(signal): - err_msg=_("Trying to remove an inexistant observer, no observer for this signal") + if signal not in self.__observed[(profile, boxname)]: + err_msg = _("Trying to remove an inexistant observer, no observer for this signal") error(_("INTERNAL ERROR: ") + err_msg) raise MaildirError(err_msg) - if not callback in self.__observed[(profile,boxname)][signal]: - err_msg=_("Trying to remove an inexistant observer") + if not callback in self.__observed[(profile, boxname)][signal]: + err_msg = _("Trying to remove an inexistant observer") error(_("INTERNAL ERROR: ") + err_msg) raise MaildirError(err_msg) - self.__observed[(profile,boxname)][signal].remove(callback) + self.__observed[(profile, boxname)][signal].remove(callback) def emitSignal(self, profile, boxname, signal_name): """Emit the signal to observer""" - debug('emitSignal %s %s %s' %(profile, boxname, signal_name)) + debug('emitSignal %s %s %s' % (profile, boxname, signal_name)) try: for observer_cb in self.__observed[(profile, boxname)][signal_name]: observer_cb() @@ -325,7 +326,7 @@ if e.name == "body": mail.set_payload(e.children[0].encode('utf-8')) elif e.name == "subject": - mail['Subject'] = e.children[0].encode('utf-8') + mail['Subject'] = e.children[0].encode('utf-8') return mail.as_string() def __init__(self, _maildir, name, observer=None, profile="@NONE@"): @@ -334,36 +335,35 @@ @param profile: real profile (ie not a profile_key) THIS OBJECT MUST NOT BE USED DIRECTLY: use MaildirBox.accessMessageBox instead""" if _maildir._checkBoxReference(name, profile): - error ("INTERNAL ERROR: MailboxUser MUST NOT be instancied directly") + error("INTERNAL ERROR: MailboxUser MUST NOT be instancied directly") raise MailboxException('double MailboxUser instanciation') - if name!="INBOX": + if name != "INBOX": raise NotImplementedError - self.name=name - self.profile=profile - self.maildir=_maildir + self.name = name + self.profile = profile + self.maildir = _maildir profile_path = self.maildir._getProfilePath(profile) - full_profile_path = os.path.join(self.maildir.host.memory.getConfig('','local_dir'), profile_path) + full_profile_path = os.path.join(self.maildir.host.memory.getConfig('', 'local_dir'), profile_path) if not os.path.exists(full_profile_path): - os.makedirs(full_profile_path,0700) + os.makedirs(full_profile_path, 0700) mailbox_path = os.path.join(full_profile_path, MAILDIR_PATH) - self.mailbox_path=mailbox_path + self.mailbox_path = mailbox_path self.mailbox = maildir.MaildirMailbox(mailbox_path) - self.observer=observer + self.observer = observer self.__uid_table_update() if observer: - debug("adding observer for %s (%s)" % (name,profile)) + debug("adding observer for %s (%s)" % (name, profile)) self.maildir.addObserver(observer, profile, name, "NEW_MESSAGE") def __uid_table_update(self): - existant_id=[] - for mess_idx in range (self.getMessageCount()): + existant_id = [] + for mess_idx in range(self.getMessageCount()): #we update the uid table existant_id.append(self.getId(mess_idx)) self.getUid(mess_idx) self.maildir.cleanTable(self.name, existant_id, profile=self.profile) - def __del__(self): if observer: debug("removing observer for %s" % self.name) @@ -377,8 +377,8 @@ def emitSignal(self, ignore, signal): """Emit the signal to the observers""" - if signal=="NEW_MESSAGE": - self.getUid(self.getMessageCount()-1) #XXX: we make an uid for the last message added + if signal == "NEW_MESSAGE": + self.getUid(self.getMessageCount() - 1) # XXX: we make an uid for the last message added self.maildir.emitSignal(self.profile, self.name, signal) def getId(self, mess_idx): @@ -388,8 +388,8 @@ def getUid(self, mess_idx): """Return a unique interger id for the message, always ascending""" - mess_id=self.getId(mess_idx) - return self.maildir.getUid(self.name,mess_id, profile=self.profile) + mess_id = self.getId(mess_idx) + return self.maildir.getUid(self.name, mess_id, profile=self.profile) def getNextUid(self): return self.maildir.getNextUid(self.name, profile=self.profile) @@ -413,7 +413,7 @@ """Return the message index from the uid @param mess_uid: message unique identifier @return: message index, as managed by MaildirMailbox""" - for mess_idx in range (self.getMessageCount()): + for mess_idx in range(self.getMessageCount()): if self.getUid(mess_idx) == mess_uid: return mess_idx raise IndexError @@ -422,7 +422,7 @@ """Return the message index from the unique index @param mess_id: message unique index as given by MaildirMailbox @return: message sequence index""" - for mess_idx in range (self.getMessageCount()): + for mess_idx in range(self.getMessageCount()): if self.mailbox.getUidl(mess_idx) == mess_id: return mess_idx raise IndexError @@ -448,7 +448,7 @@ """Return the flags of the message @param mess_uid: message unique identifier @return: list of strings""" - id = self.maildir.getIdFromUid(self.name,mess_uid, profile=self.profile) + id = self.maildir.getIdFromUid(self.name, mess_uid, profile=self.profile) return self.maildir.getFlags(self.name, id, profile=self.profile) def setFlags(self, mess_idx, flags): @@ -464,14 +464,14 @@ @param mess_uid: message unique identifier @param flags: list of strings """ - id = self.maildir.getIdFromUid(self.name,mess_uid, profile=self.profile) + id = self.maildir.getIdFromUid(self.name, mess_uid, profile=self.profile) return self.maildir.setFlags(self.name, id, flags, profile=self.profile) def getMessageIdsWithFlag(self, flag): """Return ids of messages where a flag is set @param flag: flag to check @return: list of id (as given by MaildirMailbox)""" - return self.maildir.getMessageIdsWithFlag(self.name,flag, profile=self.profile) + return self.maildir.getMessageIdsWithFlag(self.name, flag, profile=self.profile) def removeDeleted(self): """Actually delete message flagged "\\Deleted" @@ -480,11 +480,10 @@ for mess_id in self.getMessageIdsWithFlag("\\Deleted"): print ("Deleting %s" % mess_id) self.mailbox.deleteMessage(self.getIdxFromId(mess_id)) - self.mailbox = maildir.MaildirMailbox(self.mailbox_path) #We need to reparse the dir to have coherent indexing + self.mailbox = maildir.MaildirMailbox(self.mailbox_path) # We need to reparse the dir to have coherent indexing self.maildir.purgeDeleted(self.name, profile=self.profile) def emptyTrash(self): """Delete everything in the .Trash dir""" import shutils pdb.set_trace() -