summaryrefslogtreecommitdiff
path: root/addons/fetchmail
diff options
context:
space:
mode:
authorThibault Francois <tfr@openerp.com>2010-11-12 14:44:40 +0100
committerThibault Francois <tfr@openerp.com>2010-11-12 14:44:40 +0100
commitcd2af4bb80ed730f7e6ec6c6c0c21dcdf39e15f5 (patch)
treea05146180ce42b8aff18bd35e4bfc50a360004ea /addons/fetchmail
parentb82ad6d02201a832152dc3998d75477d579a8d8d (diff)
parent8ad87d0d946ecc5fcfc75f665409828921d2299b (diff)
[FIX,IMP] addons1 : 16 Bugs fix
Plugin improvement Demo user has user right crm leads logs stages changes bzr revid: tfr@openerp.com-20101112134440-drbjwz4in82irkav
Diffstat (limited to 'addons/fetchmail')
-rw-r--r--addons/fetchmail/__init__.py6
-rw-r--r--addons/fetchmail/__openerp__.py6
-rw-r--r--addons/fetchmail/fetchmail.py81
-rw-r--r--addons/fetchmail/fetchmail_view.xml152
4 files changed, 132 insertions, 113 deletions
diff --git a/addons/fetchmail/__init__.py b/addons/fetchmail/__init__.py
index 0f50df83255..d58bfd1d81b 100644
--- a/addons/fetchmail/__init__.py
+++ b/addons/fetchmail/__init__.py
@@ -7,16 +7,16 @@
# mga@tinyerp.com
#
# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
+# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# GNU Affero General Public License for more details.
#
-# You should have received a copy of the GNU General Public License
+# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
diff --git a/addons/fetchmail/__openerp__.py b/addons/fetchmail/__openerp__.py
index e9050fda075..8fe375997aa 100644
--- a/addons/fetchmail/__openerp__.py
+++ b/addons/fetchmail/__openerp__.py
@@ -7,16 +7,16 @@
# mga@tinyerp.com
#
# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
+# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# GNU Affero General Public License for more details.
#
-# You should have received a copy of the GNU General Public License
+# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index 0f58419d1e1..77748adf017 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -42,7 +42,7 @@ class email_server(osv.osv):
'active':fields.boolean('Active', required=False),
'state':fields.selection([
('draft', 'Not Confirmed'),
- ('wating', 'Waiting for Verification'),
+ ('waiting', 'Waiting for Verification'),
('done', 'Confirmed'),
], 'State', select=True, readonly=True),
'server' : fields.char('Server', size=256, required=True, readonly=True, states={'draft':[('readonly', False)]}),
@@ -52,15 +52,17 @@ class email_server(osv.osv):
('imap', 'IMAP Server'),
], 'Server Type', select=True, readonly=False),
'is_ssl':fields.boolean('SSL ?', required=False),
- 'attach':fields.boolean('Add Attachments ?', required=False),
+ 'attach':fields.boolean('Add Attachments ?', required=False, help="Fetches mail with attachments if true."),
'date': fields.date('Date', readonly=True, states={'draft':[('readonly', False)]}),
'user' : fields.char('User Name', size=256, required=True, readonly=True, states={'draft':[('readonly', False)]}),
'password' : fields.char('Password', size=1024, invisible=True, required=True, readonly=True, states={'draft':[('readonly', False)]}),
'note': fields.text('Description'),
- 'action_id':fields.many2one('ir.actions.server', 'Reply Email', required=False, domain="[('state','=','email')]"),
- 'object_id': fields.many2one('ir.model', "Model", required=True),
+ 'action_id':fields.many2one('ir.actions.server', 'Reply Email', required=False, domain="[('state','=','email')]",
+ help="An Email Server Action. It will be run whenever an e-mail is fetched from server."),
+ 'object_id': fields.many2one('ir.model', "Model", required=True, help="OpenObject Model. Generates a record of this model."),
'priority': fields.integer('Server Priority', readonly=True, states={'draft':[('readonly', False)]}, help="Priority between 0 to 10, select define the order of Processing"),
'user_id':fields.many2one('res.users', 'User', required=False),
+ 'message_ids': fields.one2many('mailgate.message', 'server_id', 'Messages', readonly=True),
}
_defaults = {
'state': lambda *a: "draft",
@@ -96,20 +98,8 @@ class email_server(osv.osv):
def set_draft(self, cr, uid, ids, context={}):
self.write(cr, uid, ids , {'state':'draft'})
return True
-
- def button_fetch_mail(self, cr, uid, ids, context={}):
- self.fetch_mail(cr, uid, ids)
- return True
-
- def _fetch_mails(self, cr, uid, ids=False, context={}):
- if not ids:
- ids = self.search(cr, uid, [])
- return self.fetch_mail(cr, uid, ids, context)
-
- def fetch_mail(self, cr, uid, ids, context=None):
- if not context:
- context = {}
- email_tool = self.pool.get('email.server.tools')
+
+ def button_confirm_login(self, cr, uid, ids, context={}):
for server in self.browse(cr, uid, ids, context):
logger.notifyChannel('imap', netsvc.LOG_INFO, 'fetchmail start checking for new emails on %s' % (server.name))
context.update({'server_id': server.id, 'server_type': server.type})
@@ -123,13 +113,52 @@ class email_server(osv.osv):
imap_server = IMAP4(server.server, int(server.port))
imap_server.login(server.user, server.password)
+ ret_server = imap_server
+
+ elif server.type == 'pop':
+ pop_server = None
+ if server.is_ssl:
+ pop_server = POP3_SSL(server.server, int(server.port))
+ else:
+ pop_server = POP3(server.server, int(server.port))
+
+ #TODO: use this to remove only unread messages
+ #pop_server.user("recent:"+server.user)
+ pop_server.user(server.user)
+ pop_server.pass_(server.password)
+ ret_server = pop_server
+
+ self.write(cr, uid, [server.id], {'state':'done'})
+ if context.get('get_server',False):
+ return ret_server
+ except Exception, e:
+ logger.notifyChannel(server.type, netsvc.LOG_WARNING, '%s' % (e))
+ return True
+
+ def button_fetch_mail(self, cr, uid, ids, context={}):
+ self.fetch_mail(cr, uid, ids, context=context)
+ return True
+
+ def _fetch_mails(self, cr, uid, ids=False, context={}):
+ if not ids:
+ ids = self.search(cr, uid, [])
+ return self.fetch_mail(cr, uid, ids, context=context)
+
+ def fetch_mail(self, cr, uid, ids, context={}):
+ email_tool = self.pool.get('email.server.tools')
+ action_pool = self.pool.get('ir.actions.server')
+ context.update({'get_server': True})
+ for server in self.browse(cr, uid, ids, context):
+ count = 0
+ try:
+ if server.type == 'imap':
+ imap_server = self.button_confirm_login(cr, uid, [server.id], context=context)
imap_server.select()
result, data = imap_server.search(None, '(UNSEEN)')
for num in data[0].split():
result, data = imap_server.fetch(num, '(RFC822)')
res_id = email_tool.process_email(cr, uid, server.object_id.model, data[0][1], attach=server.attach, context=context)
if res_id and server.action_id:
- action_pool = self.pool.get('ir.actions.server')
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
imap_server.store(num, '+FLAGS', '\\Seen')
@@ -139,25 +168,14 @@ class email_server(osv.osv):
imap_server.close()
imap_server.logout()
elif server.type == 'pop':
- pop_server = None
- if server.is_ssl:
- pop_server = POP3_SSL(server.server, int(server.port))
- else:
- pop_server = POP3(server.server, int(server.port))
-
- #TODO: use this to remove only unread messages
- #pop_server.user("recent:"+server.user)
- pop_server.user(server.user)
- pop_server.pass_(server.password)
+ pop_server = self.button_confirm_login(cr, uid, [server.id], context=context)
pop_server.list()
-
(numMsgs, totalSize) = pop_server.stat()
for num in range(1, numMsgs + 1):
(header, msges, octets) = pop_server.retr(num)
msg = '\n'.join(msges)
res_id = email_tool.process_email(cr, uid, server.object_id.model, msg, attach=server.attach, context=context)
if res_id and server.action_id:
- action_pool = self.pool.get('ir.actions.server')
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
pop_server.dele(num)
@@ -166,7 +184,6 @@ class email_server(osv.osv):
logger.notifyChannel('imap', netsvc.LOG_INFO, 'fetchmail fetch %s email(s) from %s' % (numMsgs, server.name))
- self.write(cr, uid, [server.id], {'state':'done'})
except Exception, e:
logger.notifyChannel(server.type, netsvc.LOG_WARNING, '%s' % (e))
diff --git a/addons/fetchmail/fetchmail_view.xml b/addons/fetchmail/fetchmail_view.xml
index 7f751f7c5a2..ecdb4acfb3b 100644
--- a/addons/fetchmail/fetchmail_view.xml
+++ b/addons/fetchmail/fetchmail_view.xml
@@ -8,11 +8,13 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree colors="blue:state in ('draft');black:state in ('wating');gray:state in('done')" string="POP/IMAP Servers">
- <field name="name" select="1"/>
- <field name="type" select="1"/>
- <field name="user" select="1"/>
- <field name="is_ssl" select="1"/>
- <field name="state" select="1"/>
+ <field name="name"/>
+ <field name="type"/>
+ <field name="user"/>
+ <field name="is_ssl"/>
+ <field name="object_id"/>
+ <field name="message_ids" string="# of emails"/>
+ <field name="state"/>
</tree>
</field>
</record>
@@ -58,99 +60,99 @@
</notebook>
<group col="6" colspan="4">
<field name="state" select="1"/>
- <button string="Fetch Emails" type="object" name="button_fetch_mail"/>
+ <button string="Confirm" type="object" name="button_confirm_login" states="draft"/>
+ <button string="Fetch Emails" type="object" name="button_fetch_mail" states="done"/>
<button string="Set to Draft" type="object" name="set_draft"/>
</group>
</form>
</field>
</record>
+ <record model="ir.ui.view" id="view_email_server_search">
+ <field name="name">email.server.search</field>
+ <field name="model">email.server</field>
+ <field name="type">search</field>
+ <field name="arch" type="xml">
+ <search string="Search Email Servers">
+ <filter string="IMAP" icon="terp-folder-green" domain="[('type','=','imap')]" help="Server type IMAP."/>
+ <filter string="POP" icon="terp-folder-orange" domain="[('type','=','pop')]" help="Server type POP."/>
+ <separator orientation="vertical"/>
+ <filter string="SSL" icon="terp-camera_test" domain="[('is_ssl','=',True)]" help="If SSL required."/>
+ <separator orientation="vertical"/>
+ <field name="name"/>
+ <field name="object_id"/>
+ <newline/>
+ <group expand="0" string="Group By..." groups="base.group_extended">
+ <filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type'}"/>
+ <separator orientation="vertical"/>
+ <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
<record model="ir.actions.act_window" id="action_email_server_tree">
- <field name="name">POP Servers</field>
+ <field name="name">Email Servers</field>
<field name="res_model">email.server</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_email_server_tree"/>
- <field name="context">{'type':'pop'}</field>
- <field name="domain">[('type','=','pop')]</field>
+ <field name="search_view_id" ref="view_email_server_search"/>
</record>
<menuitem
- parent="base.menu_config"
- id="menu_action_fetchmail_server_tree"
- name="Fetchmail Services"
- />
-
- <menuitem
- parent="menu_action_fetchmail_server_tree"
- id="menu_action_email_server_tree"
- action="action_email_server_tree"
+ parent="base.menu_mail_gateway"
+ id="menu_action_fetchmail_server_tree"
+ action="action_email_server_tree"
+ name="Email Servers"
/>
- <record model="ir.actions.act_window" id="action_email_server_tree_imap">
- <field name="name">IMAP Servers</field>
- <field name="res_model">email.server</field>
+ <record model="ir.ui.view" id="mailgate_message_tree_view">
+ <field name="name">mailgate.message.tree</field>
+ <field name="model">mailgate.message</field>
+ <field name="type">tree</field>
+ <field name="inherit_id" ref="mail_gateway.view_mailgate_message_tree"/>
+ <field name="arch" type="xml">
+ <field name="user_id" position="after">
+ <field name="server_id" select="1"/>
+ <field name="ref_id"/>
+ </field>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="mailgate_message_search_view">
+ <field name="name">mailgate.message.inherit.search</field>
+ <field name="model">mailgate.message</field>
+ <field name="type">search</field>
+ <field name="inherit_id" ref="mail_gateway.view_mailgate_message_search"/>
+ <field name="arch" type="xml">
+ <xpath expr="/search/field[@name='name']" position="before">
+ <filter string="Emails" name="emails" domain="[('server_id','!=',False)]" icon="terp-mail-message-new"/>
+ <separator orientation="vertical"/>
+ </xpath>
+ <xpath expr="/search/group/filter[@string='Thread']" position="before">
+ <filter string="Mail Server" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'server_id'}"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="action_view_mail_message_emails" model="ir.actions.act_window">
+ <field name="name">Messages</field>
+ <field name="res_model">mailgate.message</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
- <field name="view_id" ref="view_email_server_tree"/>
- <field name="context">{'type':'imap'}</field>
- <field name="domain">[('type','=','imap')]</field>
- </record>
-
- <menuitem
- parent="menu_action_fetchmail_server_tree"
- id="menu_action_email_server_tree_imap"
- action="action_email_server_tree_imap"
- />
+ <field name="context">{'search_default_emails': 1}</field>
+ <field name="search_view_id" ref="mailgate_message_search_view"/>
+ </record>
- <record model="ir.ui.view" id="mailgate_message_tree_view">
- <field name="name">mailgate.message.tree</field>
- <field name="model">mailgate.message</field>
- <field name="type">tree</field>
- <field name="inherit_id" ref="mail_gateway.view_mailgate_message_tree"/>
- <field name="arch" type="xml">
- <field name="user_id" position="after">
- <field name="server_id" select="1"/>
- <field name="ref_id"/>
- </field>
- </field>
- </record>
+ <menuitem id="base.menu_email_gateway_form"
+ parent="base.menu_mail_gateway" action="action_view_mail_message_emails" />
- <act_window
+ <act_window
context="{'server_id': active_id}"
domain="[('server_id', '=', active_id)]"
- id="act_server_history" name="Email History"
+ id="act_server_history" name="Emails"
res_model="mailgate.message" src_model="email.server"/>
- <record model="ir.actions.act_window" id="action_mailgate_message_tree">
- <field name="name">Received Email History</field>
- <field name="res_model">mailgate.message</field>
- <field name="view_type">form</field>
- <field name="view_mode">tree,form</field>
- <field name="view_id" ref="mailgate_message_tree_view"/>
- <field name="context">{'server_type':'imap'}</field>
- <field name="domain">[('server_type','=','imap')]</field>
- </record>
-
- <menuitem
- parent="menu_action_email_server_tree_imap"
- id="menu_action_mailgate_message_tree"
- action="action_mailgate_message_tree"/>
-
- <record model="ir.actions.act_window" id="action_mailgate_message_tree_pop">
- <field name="name">Received Email History</field>
- <field name="res_model">mailgate.message</field>
- <field name="view_type">form</field>
- <field name="view_mode">tree,form</field>
- <field name="view_id" ref="mailgate_message_tree_view"/>
- <field name="context">{'server_type':'pop'}</field>
- <field name="domain">[('server_type','=','pop')]</field>
- </record>
-
- <menuitem
- parent="menu_action_email_server_tree"
- id="menu_action_mailgate_message_tree_pop"
- action="action_mailgate_message_tree_pop"/>
-
</data>
</openerp>