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 -*- |
|||
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