Browse Source

Merge pull request #21 from bwrsandman/7.0-fix-flakes8

7.0 fix flakes8 (complete)
pull/22/merge
Pedro M. Baeza 11 years ago
parent
commit
a28edaaeff
  1. 2
      auth_admin_passkey/model/res_users.py
  2. 3
      auth_from_http_basic/__init__.py
  3. 20
      base_external_dbsource/base_external_dbsource.py
  4. 2
      configuration_helper/config.py
  5. 18
      dbfilter_from_header/__openerp__.py
  6. 11
      email_template_template/__openerp__.py
  7. 4
      email_template_template/model/email_template.py
  8. 2
      server_environment_files/__init__.py
  9. 26
      super_calendar/__openerp__.py
  10. 84
      super_calendar/super_calendar.py
  11. 33
      users_ldap_groups/__openerp__.py
  12. 121
      users_ldap_groups/users_ldap_groups.py
  13. 33
      users_ldap_groups/users_ldap_groups_operators.py
  14. 21
      users_ldap_mail/__openerp__.py
  15. 12
      users_ldap_mail/users_ldap_model.py
  16. 6
      users_ldap_populate/model/populate_wizard.py
  17. 12
      users_ldap_populate/model/users_ldap.py
  18. 4
      web_context_tunnel/__openerp__.py

2
auth_admin_passkey/model/res_users.py

@ -35,7 +35,7 @@ class res_users(Model):
# Private Function section # Private Function section
def _get_translation(self, cr, lang, text): def _get_translation(self, cr, lang, text):
context = {'lang': lang}
context = {'lang': lang} # noqa: _() checks page for locals
return _(text) return _(text)
def _send_email_passkey(self, cr, user_id, user_agent_env): def _send_email_passkey(self, cr, user_id, user_agent_env):

3
auth_from_http_basic/__init__.py

@ -36,7 +36,8 @@ def init(self, params):
base_location=self.httprequest.url_root.rstrip('/'), base_location=self.httprequest.url_root.rstrip('/'),
HTTP_HOST=self.httprequest.environ['HTTP_HOST'], HTTP_HOST=self.httprequest.environ['HTTP_HOST'],
REMOTE_ADDR=self.httprequest.environ['REMOTE_ADDR'] REMOTE_ADDR=self.httprequest.environ['REMOTE_ADDR']
))
)
)
WebRequest.init = init WebRequest.init = init

20
base_external_dbsource/base_external_dbsource.py

@ -34,13 +34,15 @@ try:
try: try:
import pymssql import pymssql
CONNECTORS.append(('mssql', 'Microsoft SQL Server')) CONNECTORS.append(('mssql', 'Microsoft SQL Server'))
except:
assert pymssql
except ImportError, AssertionError:
_logger.info('MS SQL Server not available. Please install "pymssql"\ _logger.info('MS SQL Server not available. Please install "pymssql"\
python package.') python package.')
try: try:
import MySQLdb import MySQLdb
CONNECTORS.append(('mysql', 'MySQL')) CONNECTORS.append(('mysql', 'MySQL'))
except:
assert MySQLdb
except ImportError, AssertionError:
_logger.info('MySQL not available. Please install "mysqldb"\ _logger.info('MySQL not available. Please install "mysqldb"\
python package.') python package.')
except: except:
@ -90,15 +92,15 @@ Sample connection strings:
} }
def conn_open(self, cr, uid, id1): def conn_open(self, cr, uid, id1):
#Get dbsource record
# Get dbsource record
data = self.browse(cr, uid, id1) data = self.browse(cr, uid, id1)
#Build the full connection string
# Build the full connection string
connStr = data.conn_string connStr = data.conn_string
if data.password: if data.password:
if '%s' not in data.conn_string: if '%s' not in data.conn_string:
connStr += ';PWD=%s' connStr += ';PWD=%s'
connStr = connStr % data.password connStr = connStr % data.password
#Try to connect
# Try to connect
if data.connector == 'cx_Oracle': if data.connector == 'cx_Oracle':
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8' os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8'
conn = cx_Oracle.connect(connStr) conn = cx_Oracle.connect(connStr)
@ -134,13 +136,13 @@ Sample connection strings:
for obj in data: for obj in data:
conn = self.conn_open(cr, uid, obj.id) conn = self.conn_open(cr, uid, obj.id)
if obj.connector in ["sqlite", "mysql", "mssql"]: if obj.connector in ["sqlite", "mysql", "mssql"]:
#using sqlalchemy
# using sqlalchemy
cur = conn.execute(sqlquery, sqlparams) cur = conn.execute(sqlquery, sqlparams)
if metadata: if metadata:
cols = cur.keys() cols = cur.keys()
rows = [r for r in cur] rows = [r for r in cur]
else: else:
#using other db connectors
# using other db connectors
cur = conn.cursor() cur = conn.cursor()
cur.execute(sqlquery, sqlparams) cur.execute(sqlquery, sqlparams)
if metadata: if metadata:
@ -168,8 +170,6 @@ Sample connection strings:
except Exception: except Exception:
# ignored, just a consequence of the previous exception # ignored, just a consequence of the previous exception
pass pass
#TODO: if OK a (wizard) message box should be displayed
# TODO: if OK a (wizard) message box should be displayed
raise orm.except_orm(_("Connection test succeeded!"), raise orm.except_orm(_("Connection test succeeded!"),
_("Everything seems properly set up!")) _("Everything seems properly set up!"))
#EOF

2
configuration_helper/config.py

@ -40,7 +40,7 @@ class AbstractConfigSettings(orm.AbstractModel):
super(AbstractConfigSettings, self).__init__(pool, cr) super(AbstractConfigSettings, self).__init__(pool, cr)
if self._companyObject: if self._companyObject:
for field_key in self._companyObject._columns: for field_key in self._companyObject._columns:
#allows to exclude some field
# allows to exclude some field
if self._filter_field(field_key): if self._filter_field(field_key):
args = ('company_id', field_key) args = ('company_id', field_key)
kwargs = { kwargs = {

18
dbfilter_from_header/__openerp__.py

@ -19,14 +19,14 @@
# #
############################################################################## ##############################################################################
{ {
"name" : "dbfilter_from_header",
"version" : "1.0",
"author" : "Therp BV",
"name": "dbfilter_from_header",
"version": "1.0",
"author": "Therp BV",
"complexity": "normal", "complexity": "normal",
"description": """ "description": """
This addon lets you pass a dbfilter as a HTTP header. This addon lets you pass a dbfilter as a HTTP header.
This is interesting for setups where database names can't be mapped to
This is interesting for setups where database names can't be mapped to
proxied host names. proxied host names.
In nginx, use In nginx, use
@ -34,11 +34,11 @@
The addon has to be loaded as server-wide module. The addon has to be loaded as server-wide module.
""", """,
"category" : "Tools",
"depends" : [
"category": "Tools",
"depends": [
'web', 'web',
], ],
"data" : [
"data": [
], ],
"js": [ "js": [
], ],
@ -46,7 +46,7 @@
], ],
"auto_install": False, "auto_install": False,
"installable": True, "installable": True,
"external_dependencies" : {
'python' : [],
"external_dependencies": {
'python': [],
}, },
} }

11
email_template_template/__openerp__.py

@ -60,7 +60,7 @@ Then in your template you write
:: ::
Dear ${object.partner_id.name}, Dear ${object.partner_id.name},
Your order has been booked on date ${object.date} for a total amount of ${object.sum}. Your order has been booked on date ${object.date} for a total amount of ${object.sum}.
And it will be evaluated to And it will be evaluated to
@ -77,13 +77,18 @@ And it will be evaluated to
Example city Example city
Example Corp footer Example Corp footer
Given the way evaluation works internally (body_text of the template template is evaluated two times, first with the instance of email.template of your own template, then with the object your template refers to), you can do some trickery if you know that a template template is always used with the same kind of model (that is, models that have the same field name):
Given the way evaluation works internally (body_text of the template template
is evaluated two times, first with the instance of email.template of your own
template, then with the object your template refers to), you can do some
trickery if you know that a template template is always used with the same
kind of model (that is, models that have the same field name):
In your template template: In your template template:
:: ::
Dear ${'${object.name}'}, <-- gets evaluated to "${object.name}" in the first step, then to the content of object.name
Dear ${'${object.name}'}, <-- gets evaluated to "${object.name}" in the
first step, then to the content of object.name
${object.body_html} ${object.body_html}
Best, Best,
Example Corp Example Corp

4
email_template_template/model/email_template.py

@ -28,7 +28,7 @@ class email_template(Model):
def _get_is_template_template(self, cr, uid, ids, fields_name, arg, def _get_is_template_template(self, cr, uid, ids, fields_name, arg,
context=None): context=None):
cr.execute('''select
cr.execute('''select
id, (select count(*) > 0 from email_template e id, (select count(*) > 0 from email_template e
where email_template_id=email_template.id) where email_template_id=email_template.id)
from email_template from email_template
@ -45,7 +45,7 @@ class email_template(Model):
def get_email_template(self, cr, uid, template_id=False, record_id=None, def get_email_template(self, cr, uid, template_id=False, record_id=None,
context=None): context=None):
this = super(email_template, self).get_email_template( this = super(email_template, self).get_email_template(
cr, uid, template_id, record_id, context)
cr, uid, template_id, record_id, context)
if this.email_template_id and not this.is_template_template: if this.email_template_id and not this.is_template_template:
for field in ['body_html']: for field in ['body_html']:

2
server_environment_files/__init__.py

@ -17,4 +17,4 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
##############################################################################
##############################################################################

26
super_calendar/__openerp__.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################## ##############################################################################
#
#
# Copyright (C) 2012 Agile Business Group sagl (<http://www.agilebg.com>) # Copyright (C) 2012 Agile Business Group sagl (<http://www.agilebg.com>)
# Copyright (C) 2012 Domsense srl (<http://www.domsense.com>) # Copyright (C) 2012 Domsense srl (<http://www.domsense.com>)
# #
@ -26,9 +26,13 @@
'description': """ 'description': """
This module allows to create configurable calendars. This module allows to create configurable calendars.
Through the 'calendar configurator' object, you can specify which models have to be merged in the super calendar. For each model, you have to define the 'description' and 'date_start' fields at least. Then you can define 'duration' and the 'user_id' fields.
Through the 'calendar configurator' object, you can specify which models have
to be merged in the super calendar. For each model, you have to define the
'description' and 'date_start' fields at least. Then you can define 'duration'
and the 'user_id' fields.
The 'super.calendar' object contains the the merged calendars. The 'super.calendar' can be updated by 'ir.cron' or manually.
The 'super.calendar' object contains the the merged calendars. The
'super.calendar' can be updated by 'ir.cron' or manually.
Configuration Configuration
============= =============
@ -37,7 +41,8 @@ After installing the module you can go to
Super calendar Configuration Configurators Super calendar Configuration Configurators
and create a new configurator. For instance, if you want to see meetings and phone calls, you can create the following lines
and create a new configurator. For instance, if you want to see meetings and
phone calls, you can create the following lines
.. image:: http://planet.domsense.com/wp-content/uploads/2012/04/meetings.png .. image:: http://planet.domsense.com/wp-content/uploads/2012/04/meetings.png
:width: 400 px :width: 400 px
@ -45,7 +50,8 @@ and create a new configurator. For instance, if you want to see meetings and pho
.. image:: http://planet.domsense.com/wp-content/uploads/2012/04/phone_calls.png .. image:: http://planet.domsense.com/wp-content/uploads/2012/04/phone_calls.png
:width: 400 px :width: 400 px
Then, you can use the Generate Calendar button or wait for the scheduled action (Generate Calendar Records) to be run.
Then, you can use the Generate Calendar button or wait for the scheduled
action (Generate Calendar Records) to be run.
When the calendar is generated, you can visualize it by the super calendar main menu. When the calendar is generated, you can visualize it by the super calendar main menu.
@ -59,13 +65,17 @@ And here is the weekly one:
.. image:: http://planet.domsense.com/wp-content/uploads/2012/04/week_calendar.png .. image:: http://planet.domsense.com/wp-content/uploads/2012/04/week_calendar.png
:width: 400 px :width: 400 px
As you can see, several filters are available. A typical usage consists in filtering by Configurator (if you have several configurators, Scheduled calls and meetings can be one of them) and by your user. Once you filtered, you can save the filter as Advanced filter or even add it to a dashboard.
As you can see, several filters are available. A typical usage consists in
filtering by Configurator (if you have several configurators,
Scheduled calls and meetings can be one of them) and by your user.
Once you filtered, you can save the filter as Advanced filter or even
add it to a dashboard.
""", """,
'author': 'Agile Business Group', 'author': 'Agile Business Group',
'website': 'http://www.agilebg.com', 'website': 'http://www.agilebg.com',
'license': 'AGPL-3', 'license': 'AGPL-3',
'depends' : ['base'],
"data" : [
'depends': ['base'],
"data": [
'super_calendar_view.xml', 'super_calendar_view.xml',
'cron_data.xml', 'cron_data.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',

84
super_calendar/super_calendar.py

@ -19,7 +19,7 @@
# #
############################################################################## ##############################################################################
from openerp.osv import fields, osv, orm
from openerp.osv import fields, orm
from openerp.tools.translate import _ from openerp.tools.translate import _
import logging import logging
from mako.template import Template from mako.template import Template
@ -27,19 +27,21 @@ from datetime import datetime
from openerp import tools from openerp import tools
from openerp.tools.safe_eval import safe_eval from openerp.tools.safe_eval import safe_eval
def _models_get(self, cr, uid, context=None): def _models_get(self, cr, uid, context=None):
obj = self.pool.get('ir.model') obj = self.pool.get('ir.model')
ids = obj.search(cr, uid, []) ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, ids, ['model', 'name'], context) res = obj.read(cr, uid, ids, ['model', 'name'], context)
return [(r['model'], r['name']) for r in res] return [(r['model'], r['name']) for r in res]
class super_calendar_configurator(orm.Model): class super_calendar_configurator(orm.Model):
_logger = logging.getLogger('super.calendar') _logger = logging.getLogger('super.calendar')
_name = 'super.calendar.configurator' _name = 'super.calendar.configurator'
_columns = {
_columns = {
'name': fields.char('Name', size=64, required=True), 'name': fields.char('Name', size=64, required=True),
'line_ids': fields.one2many('super.calendar.configurator.line', 'configurator_id', 'Lines'), 'line_ids': fields.one2many('super.calendar.configurator.line', 'configurator_id', 'Lines'),
}
}
def generate_calendar_records(self, cr, uid, ids, context=None): def generate_calendar_records(self, cr, uid, ids, context=None):
configurator_ids = self.search(cr, uid, []) configurator_ids = self.search(cr, uid, [])
@ -59,20 +61,30 @@ class super_calendar_configurator(orm.Model):
context=context) context=context)
for current_record_id in current_record_ids: for current_record_id in current_record_ids:
current_record = current_pool.browse(cr, uid, current_record_id, context=context)
if line.user_field_id and \
current_record[line.user_field_id.name] and current_record[line.user_field_id.name]._table_name != 'res.users':
raise osv.except_osv(_('Error'),
current_record = current_pool.browse(cr, uid, current_record_id, context=context)
if (line.user_field_id and
current_record[line.user_field_id.name] and
current_record[line.user_field_id.name]._table_name != 'res.users'):
raise orm.except_orm(
_('Error'),
_("The 'User' field of record %s (%s) does not refer to res.users") _("The 'User' field of record %s (%s) does not refer to res.users")
% (current_record[line.description_field_id.name], line.name.model)) % (current_record[line.description_field_id.name], line.name.model))
if (((line.description_field_id
and current_record[line.description_field_id.name])
or line.description_code)
and current_record[line.date_start_field_id.name]):
if (((line.description_field_id and current_record[line.description_field_id.name]) or
line.description_code) and
current_record[line.date_start_field_id.name]):
duration = False duration = False
if not line.duration_field_id and line.date_stop_field_id and current_record[line.date_start_field_id.name] and current_record[line.date_stop_field_id.name]:
date_start= datetime.strptime(current_record[line.date_start_field_id.name], tools.DEFAULT_SERVER_DATETIME_FORMAT)
date_stop= datetime.strptime(current_record[line.date_stop_field_id.name], tools.DEFAULT_SERVER_DATETIME_FORMAT)
if (not line.duration_field_id and
line.date_stop_field_id and
current_record[line.date_start_field_id.name] and
current_record[line.date_stop_field_id.name]):
date_start = datetime.strptime(
current_record[line.date_start_field_id.name],
tools.DEFAULT_SERVER_DATETIME_FORMAT
)
date_stop = datetime.strptime(
current_record[line.date_stop_field_id.name],
tools.DEFAULT_SERVER_DATETIME_FORMAT
)
duration = (date_stop - date_start).total_seconds() / 3600 duration = (date_stop - date_start).total_seconds() / 3600
elif line.duration_field_id: elif line.duration_field_id:
duration = current_record[line.duration_field_id.name] duration = current_record[line.duration_field_id.name]
@ -81,13 +93,18 @@ class super_calendar_configurator(orm.Model):
else: else:
parse_dict = {'o': current_record} parse_dict = {'o': current_record}
mytemplate = Template(line.description_code) mytemplate = Template(line.description_code)
name= mytemplate.render(**parse_dict)
name = mytemplate.render(**parse_dict)
super_calendar_values = { super_calendar_values = {
'name': name, 'name': name,
'model_description': line.description, 'model_description': line.description,
'date_start': current_record[line.date_start_field_id.name], 'date_start': current_record[line.date_start_field_id.name],
'duration': duration, 'duration': duration,
'user_id': line.user_field_id and current_record[line.user_field_id.name] and current_record[line.user_field_id.name].id or False,
'user_id': (
line.user_field_id and
current_record[line.user_field_id.name] and
current_record[line.user_field_id.name].id or
False
),
'configurator_id': configurator.id, 'configurator_id': configurator.id,
'res_id': line.name.model+','+str(current_record['id']), 'res_id': line.name.model+','+str(current_record['id']),
'model_id': line.name.id, 'model_id': line.name.id,
@ -99,7 +116,7 @@ class super_calendar_configurator(orm.Model):
class super_calendar_configurator_line(orm.Model): class super_calendar_configurator_line(orm.Model):
_name = 'super.calendar.configurator.line' _name = 'super.calendar.configurator.line'
_columns = {
_columns = {
'name': fields.many2one('ir.model', 'Model', required=True), 'name': fields.many2one('ir.model', 'Model', required=True),
'description': fields.char('Description', size=128, required=True), 'description': fields.char('Description', size=128, required=True),
'domain': fields.char('Domain', size=512), 'domain': fields.char('Domain', size=512),
@ -108,30 +125,39 @@ class super_calendar_configurator_line(orm.Model):
('field', 'Field'), ('field', 'Field'),
('code', 'Code'), ('code', 'Code'),
], string="Description Type"), ], string="Description Type"),
'description_field_id': fields.many2one('ir.model.fields', 'Description field',
'description_field_id': fields.many2one(
'ir.model.fields', 'Description field',
domain="[('model_id', '=', name),('ttype', '=', 'char')]"), domain="[('model_id', '=', name),('ttype', '=', 'char')]"),
'description_code': fields.text('Description field', help="Use '${o}' to refer to the involved object. E.g.: '${o.project_id.name}'"),
'date_start_field_id': fields.many2one('ir.model.fields', 'Start date field',
'description_code': fields.text(
'Description field',
help="Use '${o}' to refer to the involved object. E.g.: '${o.project_id.name}'"
),
'date_start_field_id': fields.many2one(
'ir.model.fields', 'Start date field',
domain="['&','|',('ttype', '=', 'datetime'),('ttype', '=', 'date'),('model_id', '=', name)]", domain="['&','|',('ttype', '=', 'datetime'),('ttype', '=', 'date'),('model_id', '=', name)]",
required=True), required=True),
'date_stop_field_id': fields.many2one('ir.model.fields', 'End date field',
domain="['&',('ttype', '=', 'datetime'),('model_id', '=', name)]"),
'duration_field_id': fields.many2one('ir.model.fields', 'Duration field',
'date_stop_field_id': fields.many2one(
'ir.model.fields', 'End date field',
domain="['&',('ttype', '=', 'datetime'),('model_id', '=', name)]"
),
'duration_field_id': fields.many2one(
'ir.model.fields', 'Duration field',
domain="['&',('ttype', '=', 'float'),('model_id', '=', name)]"), domain="['&',('ttype', '=', 'float'),('model_id', '=', name)]"),
'user_field_id': fields.many2one('ir.model.fields', 'User field',
'user_field_id': fields.many2one(
'ir.model.fields', 'User field',
domain="['&',('ttype', '=', 'many2one'),('model_id', '=', name)]"), domain="['&',('ttype', '=', 'many2one'),('model_id', '=', name)]"),
}
}
class super_calendar(orm.Model): class super_calendar(orm.Model):
_name = 'super.calendar' _name = 'super.calendar'
_columns = {
_columns = {
'name': fields.char('Description', size=512, required=True), 'name': fields.char('Description', size=512, required=True),
'model_description': fields.char('Model Description', size=128, required=True), 'model_description': fields.char('Model Description', size=128, required=True),
'date_start':fields.datetime('Start date', required=True),
'duration':fields.float('Duration'),
'date_start': fields.datetime('Start date', required=True),
'duration': fields.float('Duration'),
'user_id': fields.many2one('res.users', 'User'), 'user_id': fields.many2one('res.users', 'User'),
'configurator_id': fields.many2one('super.calendar.configurator', 'Configurator'), 'configurator_id': fields.many2one('super.calendar.configurator', 'Configurator'),
'res_id': fields.reference('Resource', selection=_models_get, size=128), 'res_id': fields.reference('Resource', selection=_models_get, size=128),
'model_id': fields.many2one('ir.model', 'Model'), 'model_id': fields.many2one('ir.model', 'Model'),
}
}

33
users_ldap_groups/__openerp__.py

@ -20,11 +20,11 @@
############################################################################## ##############################################################################
{ {
"name" : "Groups assignment",
"version" : "1.2",
"depends" : ["auth_ldap"],
"author" : "Therp BV",
"description": """
"name": "Groups assignment",
"version": "1.2",
"depends": ["auth_ldap"],
"author": "Therp BV",
"description": """
Adds user accounts to groups based on rules defined by the administrator. Adds user accounts to groups based on rules defined by the administrator.
Usage: Usage:
@ -35,7 +35,7 @@ ldap server].
Decide whether you want only groups mapped from ldap (Only ldap groups=y) or a Decide whether you want only groups mapped from ldap (Only ldap groups=y) or a
mix of manually set groups and ldap groups (Only ldap groups=n). Setting this to mix of manually set groups and ldap groups (Only ldap groups=n). Setting this to
'no' will result in users never losing privileges when you remove them from a 'no' will result in users never losing privileges when you remove them from a
ldap group, so that's a potential security issue. It is still the default to
ldap group, so that's a potential security issue. It is still the default to
prevent losing group information by accident. prevent losing group information by accident.
For active directory, use LDAP attribute 'memberOf' and operator 'contains'. For active directory, use LDAP attribute 'memberOf' and operator 'contains'.
@ -46,17 +46,16 @@ For posix accounts, use operator 'query' and a value like
(&(cn=bzr)(objectClass=posixGroup)(memberUid=$uid)) (&(cn=bzr)(objectClass=posixGroup)(memberUid=$uid))
The operator query matches if the filter in value returns something, and value The operator query matches if the filter in value returns something, and value
can contain $[attribute] which will be replaced by the first value of the
can contain $[attribute] which will be replaced by the first value of the
user's ldap record's attribute named [attribute]. user's ldap record's attribute named [attribute].
""", """,
"category" : "Tools",
"data" : [
'users_ldap_groups.xml',
'security/ir.model.access.csv',
],
"installable": True,
"external_dependencies" : {
'python' : ['ldap'],
},
"category": "Tools",
"data": [
'users_ldap_groups.xml',
'security/ir.model.access.csv',
],
"installable": True,
"external_dependencies": {
'python': ['ldap'],
},
} }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

121
users_ldap_groups/users_ldap_groups.py

@ -23,76 +23,85 @@ from openerp.osv import fields, orm
import logging import logging
import users_ldap_groups_operators import users_ldap_groups_operators
import inspect import inspect
import sys
class CompanyLDAPGroupMapping(orm.Model): class CompanyLDAPGroupMapping(orm.Model):
_name='res.company.ldap.group_mapping'
_rec_name='ldap_attribute'
_order='ldap_attribute'
_name = 'res.company.ldap.group_mapping'
_rec_name = 'ldap_attribute'
_order = 'ldap_attribute'
def _get_operators(self, cr, uid, context=None):
operators=[]
for name, operator in inspect.getmembers(users_ldap_groups_operators,
lambda cls: inspect.isclass(cls)
and cls!=users_ldap_groups_operators.LDAPOperator):
operators.append((name, name))
return tuple(operators)
def _get_operators(self, cr, uid, context=None):
operators = []
members = inspect.getmembers(
users_ldap_groups_operators,
lambda cls: inspect.isclass(cls)
and cls != users_ldap_groups_operators.LDAPOperator)
for name, operator in members:
operators.append((name, name))
return tuple(operators)
_columns={
'ldap_id': fields.many2one('res.company.ldap', 'LDAP server',
required=True),
'ldap_attribute': fields.char('LDAP attribute', size=64,
_columns = {
'ldap_id': fields.many2one('res.company.ldap', 'LDAP server', required=True),
'ldap_attribute': fields.char(
'LDAP attribute', size=64,
help='The LDAP attribute to check.\n' help='The LDAP attribute to check.\n'
'For active directory, use memberOf.'),
'operator': fields.selection(_get_operators, 'Operator',
'For active directory, use memberOf.'),
'operator': fields.selection(
_get_operators, 'Operator',
help='The operator to check the attribute against the value\n' help='The operator to check the attribute against the value\n'
'For active directory, use \'contains\'', required=True), 'For active directory, use \'contains\'', required=True),
'value': fields.char('Value', size=1024,
'value': fields.char(
'Value', size=1024,
help='The value to check the attribute against.\n' help='The value to check the attribute against.\n'
'For active directory, use the dn of the desired group',
'For active directory, use the dn of the desired group',
required=True), required=True),
'group': fields.many2one('res.groups', 'OpenERP group',
'group': fields.many2one(
'res.groups', 'OpenERP group',
help='The OpenERP group to assign', required=True), help='The OpenERP group to assign', required=True),
} }
class CompanyLDAP(orm.Model): class CompanyLDAP(orm.Model):
_inherit='res.company.ldap'
_inherit = 'res.company.ldap'
_columns={
'group_mappings': fields.one2many('res.company.ldap.group_mapping',
'ldap_id', 'Group mappings',
help='Define how OpenERP groups are assigned to ldap users'),
'only_ldap_groups': fields.boolean('Only ldap groups',
help='If this is checked, manual changes to group membership are '
'undone on every login (so OpenERP groups are always synchronous '
'with LDAP groups). If not, manually added groups are preserved.')
}
_columns = {
'group_mappings': fields.one2many(
'res.company.ldap.group_mapping',
'ldap_id', 'Group mappings',
help='Define how OpenERP groups are assigned to ldap users'),
'only_ldap_groups': fields.boolean(
'Only ldap groups',
help='If this is checked, manual changes to group membership are '
'undone on every login (so OpenERP groups are always synchronous '
'with LDAP groups). If not, manually added groups are preserved.')
}
_default={
'only_ldap_groups': False
}
_default = {
'only_ldap_groups': False,
}
def get_or_create_user(self, cr, uid, conf, login, ldap_entry, context=None):
user_id=super(CompanyLDAP, self).get_or_create_user(cr, uid, conf, login,
ldap_entry, context)
if not user_id:
return user_id
logger=logging.getLogger('users_ldap_groups')
mappingobj=self.pool.get('res.company.ldap.group_mapping')
userobj=self.pool.get('res.users')
conf_all=self.read(cr, uid, conf['id'], ['only_ldap_groups'])
if(conf_all['only_ldap_groups']):
logger.debug('deleting all groups from user %d' % user_id)
userobj.write(cr, uid, [user_id], {'groups_id': [(5, )]})
def get_or_create_user(self, cr, uid, conf, login, ldap_entry, context=None):
user_id = super(CompanyLDAP, self).get_or_create_user(cr, uid, conf, login,
ldap_entry, context)
if not user_id:
return user_id
logger = logging.getLogger('users_ldap_groups')
mappingobj = self.pool.get('res.company.ldap.group_mapping')
userobj = self.pool.get('res.users')
conf_all = self.read(cr, uid, conf['id'], ['only_ldap_groups'])
if(conf_all['only_ldap_groups']):
logger.debug('deleting all groups from user %d' % user_id)
userobj.write(cr, uid, [user_id], {'groups_id': [(5, )]}, context=context)
for mapping in mappingobj.read(cr, uid, mappingobj.search(cr, uid,
[('ldap_id', '=', conf['id'])]), []):
operator=getattr(users_ldap_groups_operators, mapping['operator'])()
logger.debug('checking mapping %s' % mapping)
if operator.check_value(ldap_entry, mapping['ldap_attribute'],
mapping['value'], conf, self, logger):
logger.debug('adding user %d to group %s' %
(user_id, mapping['group'][1]))
userobj.write(cr, uid, [user_id],
{'groups_id': [(4, mapping['group'][0])]})
return user_id
for mapping in mappingobj.read(cr, uid, mappingobj.search(
cr, uid, [('ldap_id', '=', conf['id'])]), []):
operator = getattr(users_ldap_groups_operators, mapping['operator'])()
logger.debug('checking mapping %s' % mapping)
if operator.check_value(ldap_entry, mapping['ldap_attribute'],
mapping['value'], conf, self, logger):
logger.debug('adding user %d to group %s' %
(user_id, mapping['group'][1]))
userobj.write(cr, uid, [user_id],
{'groups_id': [(4, mapping['group'][0])]},
context=context)
return user_id

33
users_ldap_groups/users_ldap_groups_operators.py

@ -20,25 +20,28 @@
############################################################################## ##############################################################################
from string import Template from string import Template
class LDAPOperator: class LDAPOperator:
pass
pass
class contains(LDAPOperator): class contains(LDAPOperator):
def check_value(self, ldap_entry, attribute, value, ldap_config, company,
logger):
return (attribute in ldap_entry[1]) and (value in ldap_entry[1][attribute])
def check_value(self, ldap_entry, attribute, value, ldap_config, company, logger):
return (attribute in ldap_entry[1]) and (value in ldap_entry[1][attribute])
class equals(LDAPOperator): class equals(LDAPOperator):
def check_value(self, ldap_entry, attribute, value, ldap_config, company,
logger):
return (attribute in ldap_entry[1]) and (str(value)==str(ldap_entry[1][attribute]))
def check_value(self, ldap_entry, attribute, value, ldap_config, company, logger):
return attribute in ldap_entry[1] and unicode(value) == unicode(ldap_entry[1][attribute])
class query(LDAPOperator): class query(LDAPOperator):
def check_value(self, ldap_entry, attribute, value, ldap_config, company,
logger):
query_string=Template(value).safe_substitute(dict([(attribute,
ldap_entry[1][attribute][0]) for attribute in ldap_entry[1]]))
logger.debug('evaluating query group mapping, filter: %s'%query_string)
results=company.query(ldap_config, query_string)
logger.debug(results)
return bool(results)
def check_value(self, ldap_entry, attribute, value, ldap_config, company, logger):
query_string = Template(value).safe_substitute(dict(
[(attr, ldap_entry[1][attribute][0]) for attr in ldap_entry[1]]
)
)
logger.debug('evaluating query group mapping, filter: %s' % query_string)
results = company.query(ldap_config, query_string)
logger.debug(results)
return bool(results)

21
users_ldap_mail/__openerp__.py

@ -20,21 +20,20 @@
############################################################################## ##############################################################################
{ {
'name': "LDAP mapping for user name and e-mail",
'version': "1.0",
'depends': ["auth_ldap"],
'author': "Daniel Reis (https://launchpad.com/~dreis-pt)",
'description': """\
'name': "LDAP mapping for user name and e-mail",
'version': "1.0",
'depends': ["auth_ldap"],
'author': "Daniel Reis (https://launchpad.com/~dreis-pt)",
'description': """\
Allows to define the LDAP attributes to use to retrieve user name and e-mail address. Allows to define the LDAP attributes to use to retrieve user name and e-mail address.
The default attribute used for the name is "cn". The default attribute used for the name is "cn".
For Active Directory, you might prefer to use "displayName" instead. For Active Directory, you might prefer to use "displayName" instead.
AD also supports the "mail" attribute, so it can be mapped into OpenERP. AD also supports the "mail" attribute, so it can be mapped into OpenERP.
""", """,
'category': "Tools",
'data': [
'users_ldap_view.xml',
],
'installable': True,
'category': "Tools",
'data': [
'users_ldap_view.xml',
],
'installable': True,
} }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

12
users_ldap_mail/users_ldap_model.py

@ -24,13 +24,16 @@ from openerp.osv import fields, orm
import logging import logging
_log = logging.getLogger(__name__) _log = logging.getLogger(__name__)
class CompanyLDAP(orm.Model): class CompanyLDAP(orm.Model):
_inherit = 'res.company.ldap' _inherit = 'res.company.ldap'
_columns = { _columns = {
'name_attribute': fields.char('Name Attribute', size=64,
'name_attribute': fields.char(
'Name Attribute', size=64,
help="By default 'cn' is used. " help="By default 'cn' is used. "
"For ActiveDirectory you might use 'displayName' instead."), "For ActiveDirectory you might use 'displayName' instead."),
'mail_attribute': fields.char('E-mail attribute', size=64,
'mail_attribute': fields.char(
'E-mail attribute', size=64,
help="LDAP attribute to use to retrieve em-mail address."), help="LDAP attribute to use to retrieve em-mail address."),
} }
_defaults = { _defaults = {
@ -39,7 +42,7 @@ class CompanyLDAP(orm.Model):
} }
def get_ldap_dicts(self, cr, ids=None): def get_ldap_dicts(self, cr, ids=None):
"""
"""
Copy of auth_ldap's funtion, changing only the SQL, so that it returns Copy of auth_ldap's funtion, changing only the SQL, so that it returns
all fields in the table. all fields in the table.
""" """
@ -58,7 +61,7 @@ class CompanyLDAP(orm.Model):
def map_ldap_attributes(self, cr, uid, conf, login, ldap_entry): def map_ldap_attributes(self, cr, uid, conf, login, ldap_entry):
values = super(CompanyLDAP, self).map_ldap_attributes(cr, uid, conf, values = super(CompanyLDAP, self).map_ldap_attributes(cr, uid, conf,
login, ldap_entry)
login, ldap_entry)
mapping = [ mapping = [
('name', 'name_attribute'), ('name', 'name_attribute'),
('email', 'mail_attribute'), ('email', 'mail_attribute'),
@ -71,4 +74,3 @@ class CompanyLDAP(orm.Model):
_log.warning('No LDAP attribute "%s" found for login "%s"' % ( _log.warning('No LDAP attribute "%s" found for login "%s"' % (
conf.get(conf_name), values.get('login'))) conf.get(conf_name), values.get('login')))
return values return values

6
users_ldap_populate/model/populate_wizard.py

@ -19,9 +19,10 @@
# #
############################################################################## ##############################################################################
from osv import osv, fields
from osv import orm, fields
class CompanyLDAPPopulateWizard(osv.TransientModel):
class CompanyLDAPPopulateWizard(orm.TransientModel):
_name = 'res.company.ldap.populate_wizard' _name = 'res.company.ldap.populate_wizard'
_description = 'Populate users from LDAP' _description = 'Populate users from LDAP'
_columns = { _columns = {
@ -34,7 +35,6 @@ class CompanyLDAPPopulateWizard(osv.TransientModel):
def create(self, cr, uid, vals, context=None): def create(self, cr, uid, vals, context=None):
ldap_pool = self.pool.get('res.company.ldap') ldap_pool = self.pool.get('res.company.ldap')
users_pool = self.pool.get('res.users')
if 'ldap_id' in vals: if 'ldap_id' in vals:
vals['users_created'] = ldap_pool.action_populate( vals['users_created'] = ldap_pool.action_populate(
cr, uid, vals['ldap_id'], context=context) cr, uid, vals['ldap_id'], context=context)

12
users_ldap_populate/model/users_ldap.py

@ -21,18 +21,18 @@
import re import re
from ldap.filter import filter_format from ldap.filter import filter_format
from openerp.osv import orm, fields
import openerp.exceptions
from openerp.osv import orm
import logging import logging
class CompanyLDAP(orm.Model): class CompanyLDAP(orm.Model):
_inherit = 'res.company.ldap' _inherit = 'res.company.ldap'
def action_populate(self, cr, uid, ids, context=None): def action_populate(self, cr, uid, ids, context=None):
""" """
Prepopulate the user table from one or more LDAP resources. Prepopulate the user table from one or more LDAP resources.
Obviously, the option to create users must be toggled in
Obviously, the option to create users must be toggled in
the LDAP configuration. the LDAP configuration.
Return the number of users created (as far as we can tell). Return the number of users created (as far as we can tell).
@ -54,7 +54,7 @@ class CompanyLDAP(orm.Model):
if attribute_match: if attribute_match:
login_attr = attribute_match.group(1) login_attr = attribute_match.group(1)
else: else:
raise osv.except_osv(
raise orm.except_orm(
"No login attribute found", "No login attribute found",
"Could not extract login attribute from filter %s" % "Could not extract login attribute from filter %s" %
conf['ldap_filter']) conf['ldap_filter'])

4
web_context_tunnel/__openerp__.py

@ -3,7 +3,7 @@
'category': 'Hidden', 'category': 'Hidden',
'author': 'Akretion', 'author': 'Akretion',
'license': 'AGPL-3', 'license': 'AGPL-3',
'description':"""
'description': """
Web Context Tunnel. Web Context Tunnel.
=================== ===================
@ -15,7 +15,7 @@ arguments. This is annoying as modules often need to pass extra arguments
that are not present in the base on_change signatures. As soon as two modules that are not present in the base on_change signatures. As soon as two modules
try to alter this signature to add their extra arguments, they are incompatible try to alter this signature to add their extra arguments, they are incompatible
between them unless some extra glue module make them compatible again by between them unless some extra glue module make them compatible again by
taking all extra arguments into account. But this leads to a combinatorial
taking all extra arguments into account. But this leads to a combinatorial
explosion to make modules compatible again. explosion to make modules compatible again.
The solution The solution

Loading…
Cancel
Save