Guewen Baconnier
8 years ago
committed by
Alexandre Fayolle
9 changed files with 152 additions and 282 deletions
-
6mail_environment/README.rst
-
2mail_environment/__init__.py
-
26mail_environment/__manifest__.py
-
232mail_environment/env_mail.py
-
24mail_environment/mail_view.xml
-
3mail_environment/models/__init__.py
-
74mail_environment/models/fetchmail_server.py
-
46mail_environment/models/ir_mail_server.py
-
21mail_environment/views/fetchmail_server_views.xml
@ -1,2 +1,2 @@ |
|||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||
from . import env_mail |
|
||||
|
from . import models |
@ -1,232 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi |
|
||||
# Copyright 2012 Camptocamp SA |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# 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 Affero General Public License for more details. |
|
||||
# |
|
||||
# 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/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm, fields |
|
||||
|
|
||||
from openerp.addons.server_environment import serv_config |
|
||||
|
|
||||
|
|
||||
class IrMail(orm.Model): |
|
||||
_inherit = "ir.mail_server" |
|
||||
|
|
||||
def _get_smtp_conf(self, cr, uid, ids, name, args, context=None): |
|
||||
""" |
|
||||
Return configuration |
|
||||
""" |
|
||||
res = {} |
|
||||
for mail_server in self.browse(cr, uid, ids, context=context): |
|
||||
global_section_name = 'outgoing_mail' |
|
||||
|
|
||||
# default vals |
|
||||
config_vals = {'smtp_port': 587} |
|
||||
if serv_config.has_section(global_section_name): |
|
||||
config_vals.update((serv_config.items(global_section_name))) |
|
||||
|
|
||||
custom_section_name = '.'.join((global_section_name, |
|
||||
mail_server.name)) |
|
||||
if serv_config.has_section(custom_section_name): |
|
||||
config_vals.update(serv_config.items(custom_section_name)) |
|
||||
|
|
||||
if config_vals.get('smtp_port'): |
|
||||
config_vals['smtp_port'] = int(config_vals['smtp_port']) |
|
||||
|
|
||||
res[mail_server.id] = config_vals |
|
||||
return res |
|
||||
|
|
||||
_columns = { |
|
||||
'smtp_host': fields.function( |
|
||||
_get_smtp_conf, |
|
||||
string='SMTP Server', |
|
||||
type="char", |
|
||||
multi='outgoing_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="Hostname or IP of SMTP server"), |
|
||||
'smtp_port': fields.function( |
|
||||
_get_smtp_conf, |
|
||||
string='SMTP Port', |
|
||||
type="integer", |
|
||||
multi='outgoing_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="SMTP Port. Usually 465 for SSL, " |
|
||||
"and 25 or 587 for other cases.", |
|
||||
size=5), |
|
||||
'smtp_user': fields.function( |
|
||||
_get_smtp_conf, |
|
||||
string='Username', |
|
||||
type="char", |
|
||||
multi='outgoing_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="Optional username for SMTP authentication", |
|
||||
size=64), |
|
||||
'smtp_pass': fields.function( |
|
||||
_get_smtp_conf, |
|
||||
string='Password', |
|
||||
type="char", |
|
||||
multi='outgoing_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="Optional password for SMTP authentication", |
|
||||
size=64), |
|
||||
'smtp_encryption': fields.function( |
|
||||
_get_smtp_conf, |
|
||||
string='smtp_encryption', |
|
||||
type="selection", |
|
||||
multi='outgoing_mail_config', |
|
||||
selection=[('none', 'None'), |
|
||||
('starttls', 'TLS (STARTTLS)'), |
|
||||
('ssl', 'SSL/TLS')], |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="Choose the connection encryption scheme:\n" |
|
||||
"- none: SMTP sessions are done in cleartext.\n" |
|
||||
"- starttls: TLS encryption is requested at start " |
|
||||
"of SMTP session (Recommended)\n" |
|
||||
"- ssl: SMTP sessions are encrypted with SSL/TLS " |
|
||||
"through a dedicated port (default: 465)") |
|
||||
} |
|
||||
|
|
||||
|
|
||||
class FetchmailServer(orm.Model): |
|
||||
"""Incoming POP/IMAP mail server account""" |
|
||||
_inherit = 'fetchmail.server' |
|
||||
|
|
||||
def _get_incom_conf(self, cr, uid, ids, name, args, context=None): |
|
||||
""" |
|
||||
Return configuration |
|
||||
""" |
|
||||
res = {} |
|
||||
for fetchmail in self.browse(cr, uid, ids, context=context): |
|
||||
global_section_name = 'incoming_mail' |
|
||||
|
|
||||
key_types = {'port': int, |
|
||||
'is_ssl': lambda a: bool(int(a)), |
|
||||
'attach': lambda a: bool(int(a)), |
|
||||
'original': lambda a: bool(int(a)), |
|
||||
} |
|
||||
|
|
||||
# default vals |
|
||||
config_vals = {'port': 993, |
|
||||
'is_ssl': 0, |
|
||||
'attach': 0, |
|
||||
'original': 0, |
|
||||
} |
|
||||
if serv_config.has_section(global_section_name): |
|
||||
config_vals.update(serv_config.items(global_section_name)) |
|
||||
|
|
||||
custom_section_name = '.'.join((global_section_name, |
|
||||
fetchmail.name)) |
|
||||
if serv_config.has_section(custom_section_name): |
|
||||
config_vals.update(serv_config.items(custom_section_name)) |
|
||||
|
|
||||
for key, to_type in key_types.iteritems(): |
|
||||
if config_vals.get(key): |
|
||||
config_vals[key] = to_type(config_vals[key]) |
|
||||
res[fetchmail.id] = config_vals |
|
||||
return res |
|
||||
|
|
||||
def _type_search(self, cr, uid, obj, name, args, context=None): |
|
||||
result_ids = [] |
|
||||
# read all incoming servers values |
|
||||
all_ids = self.search(cr, uid, [], context=context) |
|
||||
results = self.read(cr, uid, all_ids, ['id', 'type'], context=context) |
|
||||
args = args[:] |
|
||||
i = 0 |
|
||||
while i < len(args): |
|
||||
operator = args[i][1] |
|
||||
if operator == '=': |
|
||||
for res in results: |
|
||||
if (res['type'] == args[i][2] and |
|
||||
res['id'] not in result_ids): |
|
||||
result_ids.append(res['id']) |
|
||||
elif operator == 'in': |
|
||||
for search_vals in args[i][2]: |
|
||||
for res in results: |
|
||||
if (res['type'] == search_vals and |
|
||||
res['id'] not in result_ids): |
|
||||
result_ids.append(res['id']) |
|
||||
else: |
|
||||
continue |
|
||||
i += 1 |
|
||||
return [('id', 'in', result_ids)] |
|
||||
|
|
||||
_columns = { |
|
||||
'server': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Server', |
|
||||
type="char", |
|
||||
multi='income_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="Hostname or IP of the mail server"), |
|
||||
'port': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Port', |
|
||||
type="integer", |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
multi='income_mail_config'), |
|
||||
'type': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Type', |
|
||||
type="selection", |
|
||||
selection=[('pop', 'POP Server'), |
|
||||
('imap', 'IMAP Server'), |
|
||||
('local', 'Local Server'), |
|
||||
], |
|
||||
multi='income_mail_config', |
|
||||
fnct_search=_type_search, |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="pop, imap, local"), |
|
||||
'is_ssl': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Is SSL', |
|
||||
type="boolean", |
|
||||
multi='income_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help='Connections are encrypted with SSL/TLS through' |
|
||||
' a dedicated port (default: IMAPS=993, POP3S=995)'), |
|
||||
'attach': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Keep Attachments', |
|
||||
type="boolean", |
|
||||
multi='income_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
help="Whether attachments should be downloaded. " |
|
||||
"If not enabled, incoming emails will be stripped of any " |
|
||||
"attachments before being processed"), |
|
||||
'original': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Keep Original', |
|
||||
type="boolean", |
|
||||
multi='income_mail_config', |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
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."), |
|
||||
'user': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='Username', |
|
||||
type="char", |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
multi='income_mail_config'), |
|
||||
'password': fields.function( |
|
||||
_get_incom_conf, |
|
||||
string='password', |
|
||||
type="char", |
|
||||
states={'draft': [('readonly', True)]}, |
|
||||
multi='income_mail_config') |
|
||||
} |
|
@ -1,24 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
<record model="ir.ui.view" id="inherit_fetchmail"> |
|
||||
<field name="name">inherit_fetchmail_for_env_support</field> |
|
||||
<field name="model">fetchmail.server</field> |
|
||||
<field name="inherit_id" ref="fetchmail.view_email_server_form"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<field name="server" position="attributes"> |
|
||||
<attribute name="attrs" eval="False"/> |
|
||||
</field> |
|
||||
<field name="port" position="attributes"> |
|
||||
<attribute name="attrs" eval="False"/> |
|
||||
</field> |
|
||||
<field name="user" position="attributes"> |
|
||||
<attribute name="attrs" eval="False"/> |
|
||||
</field> |
|
||||
<field name="password" position="attributes"> |
|
||||
<attribute name="attrs" eval="False"/> |
|
||||
</field> |
|
||||
</field> |
|
||||
</record> |
|
||||
</data> |
|
||||
</openerp> |
|
@ -0,0 +1,3 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from . import ir_mail_server |
||||
|
from . import fetchmail_server |
@ -0,0 +1,74 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2012-2016 Camptocamp SA |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) |
||||
|
|
||||
|
import operator |
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
from odoo.addons.server_environment import serv_config |
||||
|
|
||||
|
|
||||
|
class FetchmailServer(models.Model): |
||||
|
"""Incoming POP/IMAP mail server account""" |
||||
|
_inherit = 'fetchmail.server' |
||||
|
|
||||
|
server = fields.Char(compute='_compute_server_env', |
||||
|
states={}) |
||||
|
port = fields.Integer(compute='_compute_server_env', |
||||
|
states={}) |
||||
|
type = fields.Selection(compute='_compute_server_env', |
||||
|
search='_search_type', |
||||
|
states={}) |
||||
|
user = fields.Char(compute='_compute_server_env', |
||||
|
states={}) |
||||
|
password = fields.Char(compute='_compute_server_env', |
||||
|
states={}) |
||||
|
is_ssl = fields.Boolean(compute='_compute_server_env') |
||||
|
attach = fields.Boolean(compute='_compute_server_env') |
||||
|
original = fields.Boolean(compute='_compute_server_env') |
||||
|
|
||||
|
@api.depends() |
||||
|
def _compute_server_env(self): |
||||
|
for fetchmail in self: |
||||
|
global_section_name = 'incoming_mail' |
||||
|
|
||||
|
key_types = {'port': int, |
||||
|
'is_ssl': lambda a: bool(int(a or 0)), |
||||
|
'attach': lambda a: bool(int(a or 0)), |
||||
|
'original': lambda a: bool(int(a or 0)), |
||||
|
} |
||||
|
|
||||
|
# default vals |
||||
|
config_vals = {'port': 993, |
||||
|
'is_ssl': 0, |
||||
|
'attach': 0, |
||||
|
'original': 0, |
||||
|
} |
||||
|
if serv_config.has_section(global_section_name): |
||||
|
config_vals.update(serv_config.items(global_section_name)) |
||||
|
|
||||
|
custom_section_name = '.'.join((global_section_name, |
||||
|
fetchmail.name)) |
||||
|
if serv_config.has_section(custom_section_name): |
||||
|
config_vals.update(serv_config.items(custom_section_name)) |
||||
|
|
||||
|
for key, to_type in key_types.iteritems(): |
||||
|
if config_vals.get(key): |
||||
|
config_vals[key] = to_type(config_vals[key]) |
||||
|
|
||||
|
fetchmail.update(config_vals) |
||||
|
|
||||
|
@api.model |
||||
|
def _search_type(self, oper, value): |
||||
|
operators = { |
||||
|
'=': operator.eq, |
||||
|
'!=': operator.ne, |
||||
|
'in': operator.contains, |
||||
|
'not in': lambda a, b: not operator.contains(a, b), |
||||
|
} |
||||
|
if oper not in operators: |
||||
|
return [('id', 'in', [])] |
||||
|
servers = self.search([]).filtered( |
||||
|
lambda s: operators[oper](value, s.type) |
||||
|
) |
||||
|
return [('id', 'in', servers.ids)] |
@ -0,0 +1,46 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2012-2016 Camptocamp SA |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) |
||||
|
|
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
from odoo.addons.server_environment import serv_config |
||||
|
|
||||
|
|
||||
|
class IrMailServer(models.Model): |
||||
|
_inherit = "ir.mail_server" |
||||
|
|
||||
|
smtp_host = fields.Char(compute='_compute_server_env', |
||||
|
required=False, |
||||
|
readonly=True) |
||||
|
smtp_port = fields.Integer(compute='_compute_server_env', |
||||
|
required=False, |
||||
|
readonly=True) |
||||
|
smtp_user = fields.Char(compute='_compute_server_env', |
||||
|
required=False, |
||||
|
readonly=True) |
||||
|
smtp_pass = fields.Char(compute='_compute_server_env', |
||||
|
required=False, |
||||
|
readonly=True) |
||||
|
smtp_encryption = fields.Selection(compute='_compute_server_env', |
||||
|
required=False, |
||||
|
readonly=True) |
||||
|
|
||||
|
@api.depends() |
||||
|
def _compute_server_env(self): |
||||
|
for server in self: |
||||
|
global_section_name = 'outgoing_mail' |
||||
|
|
||||
|
# default vals |
||||
|
config_vals = {'smtp_port': 587} |
||||
|
if serv_config.has_section(global_section_name): |
||||
|
config_vals.update((serv_config.items(global_section_name))) |
||||
|
|
||||
|
custom_section_name = '.'.join((global_section_name, server.name)) |
||||
|
if serv_config.has_section(custom_section_name): |
||||
|
config_vals.update(serv_config.items(custom_section_name)) |
||||
|
|
||||
|
if config_vals.get('smtp_port'): |
||||
|
config_vals['smtp_port'] = int(config_vals['smtp_port']) |
||||
|
|
||||
|
server.update(config_vals) |
@ -0,0 +1,21 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<record model="ir.ui.view" id="inherit_fetchmail"> |
||||
|
<field name="model">fetchmail.server</field> |
||||
|
<field name="inherit_id" ref="fetchmail.view_email_server_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="server" position="attributes"> |
||||
|
<attribute name="attrs" eval="False"/> |
||||
|
</field> |
||||
|
<field name="port" position="attributes"> |
||||
|
<attribute name="attrs" eval="False"/> |
||||
|
</field> |
||||
|
<field name="user" position="attributes"> |
||||
|
<attribute name="attrs" eval="False"/> |
||||
|
</field> |
||||
|
<field name="password" position="attributes"> |
||||
|
<attribute name="attrs" eval="False"/> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue