[MERGE] fetchmail local mta option by stw

bzr revid: al@openerp.com-20111004222640-ako0cjw414c5lz72
This commit is contained in:
Antony Lesuisse 2011-10-05 00:26:40 +02:00
commit 69b916b144
5 changed files with 52 additions and 31 deletions

View File

@ -25,6 +25,14 @@ from imaplib import IMAP4
from imaplib import IMAP4_SSL from imaplib import IMAP4_SSL
from poplib import POP3 from poplib import POP3
from poplib import POP3_SSL from poplib import POP3_SSL
try:
import cStringIO as StringIO
except ImportError:
import StringIO
import zipfile
import base64
import addons
import netsvc import netsvc
from osv import osv, fields from osv import osv, fields
@ -46,11 +54,12 @@ class fetchmail_server(osv.osv):
('draft', 'Not Confirmed'), ('draft', 'Not Confirmed'),
('done', 'Confirmed'), ('done', 'Confirmed'),
], 'State', select=True, readonly=True), ], 'State', select=True, readonly=True),
'server' : fields.char('Server Name', size=256, required=True, readonly=True, help="Hostname or IP of the mail server", states={'draft':[('readonly', False)]}), 'server' : fields.char('Server Name', size=256, readonly=True, help="Hostname or IP of the mail server", states={'draft':[('readonly', False)]}),
'port' : fields.integer('Port', required=True, readonly=True, states={'draft':[('readonly', False)]}), 'port' : fields.integer('Port', readonly=True, states={'draft':[('readonly', False)]}),
'type':fields.selection([ 'type':fields.selection([
('pop', 'POP Server'), ('pop', 'POP Server'),
('imap', 'IMAP Server'), ('imap', 'IMAP Server'),
('local', 'Local Server'),
], 'Server Type', select=True, required=True, readonly=False), ], 'Server Type', select=True, required=True, readonly=False),
'is_ssl':fields.boolean('SSL/TLS', help="Connections are encrypted with SSL/TLS through a dedicated port (default: IMAPS=993, POP3S=995)"), 'is_ssl':fields.boolean('SSL/TLS', help="Connections are encrypted with SSL/TLS through a dedicated port (default: IMAPS=993, POP3S=995)"),
'attach':fields.boolean('Keep Attachments', help="Whether attachments should be downloaded. " 'attach':fields.boolean('Keep Attachments', help="Whether attachments should be downloaded. "
@ -58,8 +67,8 @@ class fetchmail_server(osv.osv):
'original':fields.boolean('Keep Original', help="Whether a full original copy of each email should be kept for reference" 'original':fields.boolean('Keep Original', help="Whether a full original copy of each email should be kept for reference"
"and attached to each processed message. This will usually double the size of your message database."), "and attached to each processed message. This will usually double the size of your message database."),
'date': fields.datetime('Last Fetch Date', readonly=True), 'date': fields.datetime('Last Fetch Date', readonly=True),
'user' : fields.char('Username', size=256, required=True, readonly=True, states={'draft':[('readonly', False)]}), 'user' : fields.char('Username', size=256, readonly=True, states={'draft':[('readonly', False)]}),
'password' : fields.char('Password', size=1024, required=True, readonly=True, states={'draft':[('readonly', False)]}), 'password' : fields.char('Password', size=1024, readonly=True, states={'draft':[('readonly', False)]}),
'action_id':fields.many2one('ir.actions.server', 'Server Action', help="Optional custom server action to trigger for each incoming mail, " 'action_id':fields.many2one('ir.actions.server', 'Server Action', help="Optional custom server action to trigger for each incoming mail, "
"on the record that was created or updated by this mail"), "on the record that was created or updated by this mail"),
'object_id': fields.many2one('ir.model', "Create a New Record", required=True, help="Process each incoming mail as part of a conversation " 'object_id': fields.many2one('ir.model', "Create a New Record", required=True, help="Process each incoming mail as part of a conversation "
@ -69,6 +78,8 @@ class fetchmail_server(osv.osv):
'priority': fields.integer('Server Priority', readonly=True, states={'draft':[('readonly', False)]}, help="Defines the order of processing, " 'priority': fields.integer('Server Priority', readonly=True, states={'draft':[('readonly', False)]}, help="Defines the order of processing, "
"lower values mean higher priority"), "lower values mean higher priority"),
'message_ids': fields.one2many('mail.message', 'fetchmail_server_id', 'Messages', readonly=True), 'message_ids': fields.one2many('mail.message', 'fetchmail_server_id', 'Messages', readonly=True),
'configuration' : fields.text('Configuration'),
'script' : fields.char('Script', readonly=True, size=64),
} }
_defaults = { _defaults = {
'state': "draft", 'state': "draft",
@ -76,31 +87,36 @@ class fetchmail_server(osv.osv):
'active': True, 'active': True,
'priority': 5, 'priority': 5,
'attach': True, 'attach': True,
'script': '/mail/static/scripts/openerp_mailgate.py',
} }
def default_get(self, cr, uid, fields, context=None):
if context is None:
context = {}
result = super(fetchmail_server, self).default_get(cr, uid, fields, context=context) def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False, object_id=False):
model = context.pop('fetchmail_model', False) or False
if isinstance(model, basestring):
model_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', model)], context=context)
result.update(
object_id = model_id[0],
)
return result
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False):
port = 0 port = 0
values = {}
if server_type == 'pop': if server_type == 'pop':
port = ssl and 995 or 110 port = ssl and 995 or 110
elif server_type == 'imap': elif server_type == 'imap':
port = ssl and 993 or 143 port = ssl and 993 or 143
return {'value':{'port':port}} else:
values['server'] = ''
values['port'] = port
conf = {
'dbname' : cr.dbname,
'uid' : uid,
'model' : 'MODELNAME',
}
if object_id:
m = self.pool.get('ir.model')
r = m.read(cr,uid,[object_id],['model'])
conf['model']=r[0]['model']
values['configuration'] = """Use the below script with the following command line options with your Mail Transport Agent (MTA)
openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOSTNAME --port=PORT
""" % conf
return {'value':values}
def set_draft(self, cr, uid, ids, context=None): def set_draft(self, cr, uid, ids, context=None):
self.write(cr, uid, ids , {'state':'draft'}) self.write(cr, uid, ids , {'state':'draft'})

View File

@ -25,29 +25,34 @@
<field name="type">form</field> <field name="type">form</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Incoming Mail Server"> <form string="Incoming Mail Server">
<group col="6" colspan="4"> <group colspan="4" col="6">
<field name="name" select="1"/> <field name="name" select="1"/>
<field name="type" select="1" on_change="onchange_server_type(type, is_ssl)"/> <field name="type" select="1" on_change="onchange_server_type(type, is_ssl, object_id)"/>
<field name="date" select="1"/> <field name="date" select="1"/>
</group> </group>
<notebook colspan="4"> <notebook colspan="4">
<page string="Server &amp; Login"> <page string="Server &amp; Login">
<group col="4" colspan="2"> <group col="4" colspan="2" attrs="{'invisible' : [('type', '=', 'local')]}">
<separator string="Server Information" colspan="2"/> <separator string="Server Information" colspan="2"/>
<field name="server" colspan="4"/> <field name="server" colspan="4" attrs="{'required' : [('type', '!=', 'local')]}" />
<field name="port" /> <field name="port" required="1" attrs="{'required' : [('type', '!=', 'local')]}" />
<field name="is_ssl" select="1" on_change="onchange_server_type(type, is_ssl)"/> <field name="is_ssl" select="1" on_change="onchange_server_type(type, is_ssl)"/>
</group> </group>
<group col="2" colspan="2"> <group col="2" colspan="2" attrs="{'invisible' : [('type', '=', 'local')]}">
<separator string="Login Information" colspan="2"/> <separator string="Login Information" colspan="2"/>
<field name="user" /> <field name="user" attrs="{'required' : [('type', '!=', 'local')]}"/>
<field name="password" password="True" /> <field name="password" password="True" attrs="{'required' : [('type', '!=', 'local')]}"/>
</group> </group>
<group col="2" colspan="2"> <group col="2" colspan="2">
<separator string="Actions to Perform on Incoming Mails" colspan="2"/> <separator string="Actions to Perform on Incoming Mails" colspan="2"/>
<field name="object_id"/> <field name="object_id" on_change="onchange_server_type(type, is_ssl, object_id)"/>
<field name="action_id" groups="base.group_extended"/> <field name="action_id" groups="base.group_extended"/>
</group> </group>
<group attrs="{'invisible' : [('type', '!=', 'local')]}" colspan="4" col="4">
<separator string="Configuration" colspan="4"/>
<field name="configuration" colspan="4"/>
<field name="script" colspan="4" widget="url"/>
</group>
</page> </page>
<page string="Advanced" groups="base.group_extended"> <page string="Advanced" groups="base.group_extended">
<group colspan="2" col="2"> <group colspan="2" col="2">
@ -59,7 +64,7 @@
</group> </group>
</page> </page>
</notebook> </notebook>
<group col="6" colspan="4"> <group colspan="4" col="6" attrs="{'invisible' : [('type', '=', 'local')]}">
<field name="state"/> <field name="state"/>
<button string="Reset Confirmation" type="object" name="set_draft" icon="gtk-convert" states="done"/> <button string="Reset Confirmation" type="object" name="set_draft" icon="gtk-convert" states="done"/>
<button string="Test &amp; Confirm" type="object" name="button_confirm_login" states="draft" icon="gtk-apply"/> <button string="Test &amp; Confirm" type="object" name="button_confirm_login" states="draft" icon="gtk-apply"/>