From d29ee343b52b865308288a295233e84d073e6a21 Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 17 Jul 2014 08:40:58 -0400 Subject: [PATCH 1/6] [PEP8] users_ldap_groups --- users_ldap_groups/__openerp__.py | 33 +++-- users_ldap_groups/users_ldap_groups.py | 121 ++++++++++-------- .../users_ldap_groups_operators.py | 33 ++--- 3 files changed, 99 insertions(+), 88 deletions(-) diff --git a/users_ldap_groups/__openerp__.py b/users_ldap_groups/__openerp__.py index 98acddbab..044301a31 100644 --- a/users_ldap_groups/__openerp__.py +++ b/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. Usage: @@ -35,7 +35,7 @@ ldap server]. 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 '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. 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)) 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]. """, -"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: diff --git a/users_ldap_groups/users_ldap_groups.py b/users_ldap_groups/users_ldap_groups.py index 71db80338..9aaa1e71b 100644 --- a/users_ldap_groups/users_ldap_groups.py +++ b/users_ldap_groups/users_ldap_groups.py @@ -23,76 +23,85 @@ from openerp.osv import fields, orm import logging import users_ldap_groups_operators import inspect -import sys + 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' - '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' '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' - 'For active directory, use the dn of the desired group', + 'For active directory, use the dn of the desired group', required=True), - 'group': fields.many2one('res.groups', 'OpenERP group', + 'group': fields.many2one( + 'res.groups', 'OpenERP group', help='The OpenERP group to assign', required=True), } + 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 diff --git a/users_ldap_groups/users_ldap_groups_operators.py b/users_ldap_groups/users_ldap_groups_operators.py index 9706459e9..4de745fbf 100644 --- a/users_ldap_groups/users_ldap_groups_operators.py +++ b/users_ldap_groups/users_ldap_groups_operators.py @@ -20,25 +20,28 @@ ############################################################################## from string import Template + class LDAPOperator: - pass + pass + 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): - 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): - 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) From dfd92bb466321ce2daa20a7a1fb6eae4b717fe89 Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 17 Jul 2014 08:41:14 -0400 Subject: [PATCH 2/6] [PEP8] super_calendar --- super_calendar/__openerp__.py | 26 +++++++--- super_calendar/super_calendar.py | 84 +++++++++++++++++++++----------- 2 files changed, 73 insertions(+), 37 deletions(-) diff --git a/super_calendar/__openerp__.py b/super_calendar/__openerp__.py index 16c25ad99..63a8a42e3 100644 --- a/super_calendar/__openerp__.py +++ b/super_calendar/__openerp__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # Copyright (C) 2012 Agile Business Group sagl () # Copyright (C) 2012 Domsense srl () # @@ -26,9 +26,13 @@ 'description': """ 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 ============= @@ -37,7 +41,8 @@ After installing the module you can go to 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 :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 :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. @@ -59,13 +65,17 @@ And here is the weekly one: .. image:: http://planet.domsense.com/wp-content/uploads/2012/04/week_calendar.png :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', 'website': 'http://www.agilebg.com', 'license': 'AGPL-3', - 'depends' : ['base'], - "data" : [ + 'depends': ['base'], + "data": [ 'super_calendar_view.xml', 'cron_data.xml', 'security/ir.model.access.csv', diff --git a/super_calendar/super_calendar.py b/super_calendar/super_calendar.py index 83cc9bd1e..be1520252 100644 --- a/super_calendar/super_calendar.py +++ b/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 _ import logging from mako.template import Template @@ -27,19 +27,21 @@ from datetime import datetime from openerp import tools from openerp.tools.safe_eval import safe_eval + def _models_get(self, cr, uid, context=None): obj = self.pool.get('ir.model') ids = obj.search(cr, uid, []) res = obj.read(cr, uid, ids, ['model', 'name'], context) return [(r['model'], r['name']) for r in res] + class super_calendar_configurator(orm.Model): _logger = logging.getLogger('super.calendar') _name = 'super.calendar.configurator' - _columns = { + _columns = { 'name': fields.char('Name', size=64, required=True), 'line_ids': fields.one2many('super.calendar.configurator.line', 'configurator_id', 'Lines'), - } + } def generate_calendar_records(self, cr, uid, ids, context=None): configurator_ids = self.search(cr, uid, []) @@ -59,20 +61,30 @@ class super_calendar_configurator(orm.Model): context=context) 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") % (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 - 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 elif line.duration_field_id: duration = current_record[line.duration_field_id.name] @@ -81,13 +93,18 @@ class super_calendar_configurator(orm.Model): else: parse_dict = {'o': current_record} mytemplate = Template(line.description_code) - name= mytemplate.render(**parse_dict) + name = mytemplate.render(**parse_dict) super_calendar_values = { 'name': name, 'model_description': line.description, 'date_start': current_record[line.date_start_field_id.name], '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, 'res_id': line.name.model+','+str(current_record['id']), 'model_id': line.name.id, @@ -99,7 +116,7 @@ class super_calendar_configurator(orm.Model): class super_calendar_configurator_line(orm.Model): _name = 'super.calendar.configurator.line' - _columns = { + _columns = { 'name': fields.many2one('ir.model', 'Model', required=True), 'description': fields.char('Description', size=128, required=True), 'domain': fields.char('Domain', size=512), @@ -108,30 +125,39 @@ class super_calendar_configurator_line(orm.Model): ('field', 'Field'), ('code', 'Code'), ], 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')]"), - '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)]", 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)]"), - '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)]"), - } + } class super_calendar(orm.Model): _name = 'super.calendar' - _columns = { + _columns = { 'name': fields.char('Description', size=512, 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'), 'configurator_id': fields.many2one('super.calendar.configurator', 'Configurator'), 'res_id': fields.reference('Resource', selection=_models_get, size=128), 'model_id': fields.many2one('ir.model', 'Model'), - } + } From 50af2cc47e88cdfb86138b47dd00f4899b3d30c3 Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 17 Jul 2014 08:41:26 -0400 Subject: [PATCH 3/6] [PEP8] users_ldap_populate --- users_ldap_populate/model/populate_wizard.py | 6 +++--- users_ldap_populate/model/users_ldap.py | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/users_ldap_populate/model/populate_wizard.py b/users_ldap_populate/model/populate_wizard.py index 6677e2245..ea1ea4ac9 100644 --- a/users_ldap_populate/model/populate_wizard.py +++ b/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' _description = 'Populate users from LDAP' _columns = { @@ -34,7 +35,6 @@ class CompanyLDAPPopulateWizard(osv.TransientModel): def create(self, cr, uid, vals, context=None): ldap_pool = self.pool.get('res.company.ldap') - users_pool = self.pool.get('res.users') if 'ldap_id' in vals: vals['users_created'] = ldap_pool.action_populate( cr, uid, vals['ldap_id'], context=context) diff --git a/users_ldap_populate/model/users_ldap.py b/users_ldap_populate/model/users_ldap.py index f58388e8a..5b5f47fbb 100644 --- a/users_ldap_populate/model/users_ldap.py +++ b/users_ldap_populate/model/users_ldap.py @@ -21,18 +21,18 @@ import re from ldap.filter import filter_format -from openerp.osv import orm, fields -import openerp.exceptions +from openerp.osv import orm import logging + class CompanyLDAP(orm.Model): _inherit = 'res.company.ldap' - + def action_populate(self, cr, uid, ids, context=None): """ 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. Return the number of users created (as far as we can tell). @@ -54,7 +54,7 @@ class CompanyLDAP(orm.Model): if attribute_match: login_attr = attribute_match.group(1) else: - raise osv.except_osv( + raise orm.except_orm( "No login attribute found", "Could not extract login attribute from filter %s" % conf['ldap_filter']) From a2b37d8d2ef9e7adfdd41b02796cac26d0e333df Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 17 Jul 2014 08:41:36 -0400 Subject: [PATCH 4/6] [PEP8] users_ldap_mail --- users_ldap_mail/__openerp__.py | 21 ++++++++++----------- users_ldap_mail/users_ldap_model.py | 12 +++++++----- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/users_ldap_mail/__openerp__.py b/users_ldap_mail/__openerp__.py index fd445f2e7..25d332066 100644 --- a/users_ldap_mail/__openerp__.py +++ b/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. The default attribute used for the name is "cn". For Active Directory, you might prefer to use "displayName" instead. 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: diff --git a/users_ldap_mail/users_ldap_model.py b/users_ldap_mail/users_ldap_model.py index 0bb72a2de..e4a8bd815 100644 --- a/users_ldap_mail/users_ldap_model.py +++ b/users_ldap_mail/users_ldap_model.py @@ -24,13 +24,16 @@ from openerp.osv import fields, orm import logging _log = logging.getLogger(__name__) + class CompanyLDAP(orm.Model): _inherit = 'res.company.ldap' _columns = { - 'name_attribute': fields.char('Name Attribute', size=64, + 'name_attribute': fields.char( + 'Name Attribute', size=64, help="By default 'cn' is used. " "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."), } _defaults = { @@ -39,7 +42,7 @@ class CompanyLDAP(orm.Model): } def get_ldap_dicts(self, cr, ids=None): - """ + """ Copy of auth_ldap's funtion, changing only the SQL, so that it returns all fields in the table. """ @@ -58,7 +61,7 @@ class CompanyLDAP(orm.Model): def map_ldap_attributes(self, cr, uid, conf, login, ldap_entry): values = super(CompanyLDAP, self).map_ldap_attributes(cr, uid, conf, - login, ldap_entry) + login, ldap_entry) mapping = [ ('name', 'name_attribute'), ('email', 'mail_attribute'), @@ -71,4 +74,3 @@ class CompanyLDAP(orm.Model): _log.warning('No LDAP attribute "%s" found for login "%s"' % ( conf.get(conf_name), values.get('login'))) return values - From d82b1574f696a4cf157769e2bbd19507bb8aa5e5 Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 17 Jul 2014 08:41:50 -0400 Subject: [PATCH 5/6] [PEP8] email_template_template --- email_template_template/__openerp__.py | 11 ++++++++--- email_template_template/model/email_template.py | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/email_template_template/__openerp__.py b/email_template_template/__openerp__.py index a193404c1..e3dddb5b3 100644 --- a/email_template_template/__openerp__.py +++ b/email_template_template/__openerp__.py @@ -60,7 +60,7 @@ Then in your template you write :: Dear ${object.partner_id.name}, - + Your order has been booked on date ${object.date} for a total amount of ${object.sum}. And it will be evaluated to @@ -77,13 +77,18 @@ And it will be evaluated to Example city 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: :: - 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} Best, Example Corp diff --git a/email_template_template/model/email_template.py b/email_template_template/model/email_template.py index 2d1b2091c..e2b67ab1a 100644 --- a/email_template_template/model/email_template.py +++ b/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, context=None): - cr.execute('''select + cr.execute('''select id, (select count(*) > 0 from email_template e where email_template_id=email_template.id) from email_template @@ -45,7 +45,7 @@ class email_template(Model): def get_email_template(self, cr, uid, template_id=False, record_id=None, context=None): 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: for field in ['body_html']: From 49975648a8a7119450a28534836df282f0d5a98e Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 17 Jul 2014 08:41:59 -0400 Subject: [PATCH 6/6] [PEP8] Misc --- auth_admin_passkey/model/res_users.py | 2 +- auth_from_http_basic/__init__.py | 3 ++- .../base_external_dbsource.py | 20 +++++++++---------- configuration_helper/config.py | 2 +- dbfilter_from_header/__openerp__.py | 18 ++++++++--------- server_environment_files/__init__.py | 2 +- web_context_tunnel/__openerp__.py | 4 ++-- 7 files changed, 26 insertions(+), 25 deletions(-) diff --git a/auth_admin_passkey/model/res_users.py b/auth_admin_passkey/model/res_users.py index 6d050108c..d0a5a8aa2 100644 --- a/auth_admin_passkey/model/res_users.py +++ b/auth_admin_passkey/model/res_users.py @@ -35,7 +35,7 @@ class res_users(Model): # Private Function section def _get_translation(self, cr, lang, text): - context = {'lang': lang} + context = {'lang': lang} # noqa: _() checks page for locals return _(text) def _send_email_passkey(self, cr, user_id, user_agent_env): diff --git a/auth_from_http_basic/__init__.py b/auth_from_http_basic/__init__.py index 34a0d9550..4458cc282 100644 --- a/auth_from_http_basic/__init__.py +++ b/auth_from_http_basic/__init__.py @@ -36,7 +36,8 @@ def init(self, params): base_location=self.httprequest.url_root.rstrip('/'), HTTP_HOST=self.httprequest.environ['HTTP_HOST'], REMOTE_ADDR=self.httprequest.environ['REMOTE_ADDR'] - )) + ) + ) WebRequest.init = init diff --git a/base_external_dbsource/base_external_dbsource.py b/base_external_dbsource/base_external_dbsource.py index e9e4e787f..7353a1d9c 100644 --- a/base_external_dbsource/base_external_dbsource.py +++ b/base_external_dbsource/base_external_dbsource.py @@ -34,13 +34,15 @@ try: try: import pymssql CONNECTORS.append(('mssql', 'Microsoft SQL Server')) - except: + assert pymssql + except ImportError, AssertionError: _logger.info('MS SQL Server not available. Please install "pymssql"\ python package.') try: import MySQLdb CONNECTORS.append(('mysql', 'MySQL')) - except: + assert MySQLdb + except ImportError, AssertionError: _logger.info('MySQL not available. Please install "mysqldb"\ python package.') except: @@ -90,15 +92,15 @@ Sample connection strings: } def conn_open(self, cr, uid, id1): - #Get dbsource record + # Get dbsource record data = self.browse(cr, uid, id1) - #Build the full connection string + # Build the full connection string connStr = data.conn_string if data.password: if '%s' not in data.conn_string: connStr += ';PWD=%s' connStr = connStr % data.password - #Try to connect + # Try to connect if data.connector == 'cx_Oracle': os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8' conn = cx_Oracle.connect(connStr) @@ -134,13 +136,13 @@ Sample connection strings: for obj in data: conn = self.conn_open(cr, uid, obj.id) if obj.connector in ["sqlite", "mysql", "mssql"]: - #using sqlalchemy + # using sqlalchemy cur = conn.execute(sqlquery, sqlparams) if metadata: cols = cur.keys() rows = [r for r in cur] else: - #using other db connectors + # using other db connectors cur = conn.cursor() cur.execute(sqlquery, sqlparams) if metadata: @@ -168,8 +170,6 @@ Sample connection strings: except Exception: # ignored, just a consequence of the previous exception 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!"), _("Everything seems properly set up!")) - -#EOF diff --git a/configuration_helper/config.py b/configuration_helper/config.py index 187d683ab..73fd58e2f 100644 --- a/configuration_helper/config.py +++ b/configuration_helper/config.py @@ -40,7 +40,7 @@ class AbstractConfigSettings(orm.AbstractModel): super(AbstractConfigSettings, self).__init__(pool, cr) if self._companyObject: for field_key in self._companyObject._columns: - #allows to exclude some field + # allows to exclude some field if self._filter_field(field_key): args = ('company_id', field_key) kwargs = { diff --git a/dbfilter_from_header/__openerp__.py b/dbfilter_from_header/__openerp__.py index 7baf1f9e7..4570e55d5 100644 --- a/dbfilter_from_header/__openerp__.py +++ b/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", "description": """ 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. In nginx, use @@ -34,11 +34,11 @@ The addon has to be loaded as server-wide module. """, - "category" : "Tools", - "depends" : [ + "category": "Tools", + "depends": [ 'web', ], - "data" : [ + "data": [ ], "js": [ ], @@ -46,7 +46,7 @@ ], "auto_install": False, "installable": True, - "external_dependencies" : { - 'python' : [], + "external_dependencies": { + 'python': [], }, } diff --git a/server_environment_files/__init__.py b/server_environment_files/__init__.py index 31fea2953..98a6c9725 100644 --- a/server_environment_files/__init__.py +++ b/server_environment_files/__init__.py @@ -17,4 +17,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -############################################################################## \ No newline at end of file +############################################################################## diff --git a/web_context_tunnel/__openerp__.py b/web_context_tunnel/__openerp__.py index 3813782b6..ae463552e 100644 --- a/web_context_tunnel/__openerp__.py +++ b/web_context_tunnel/__openerp__.py @@ -3,7 +3,7 @@ 'category': 'Hidden', 'author': 'Akretion', 'license': 'AGPL-3', - 'description':""" + 'description': """ 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 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 -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. The solution