diff --git a/base_address_category/__init__.py b/base_address_category/__init__.py deleted file mode 100644 index 6b065bf74..000000000 --- a/base_address_category/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010-2013 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Joel Grand-Guillaume -# -# 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 . -# -############################################################################## -import base_address diff --git a/base_address_category/__openerp__.py b/base_address_category/__openerp__.py deleted file mode 100644 index 0ad5ce3f5..000000000 --- a/base_address_category/__openerp__.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010-2013 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Joel Grand-Guillaume -# -# 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 . -# -############################################################################## - -{ - "name": "Partner Address Category", - "description": """\ - res.partner.address.category - ---------------------------- - - This module is deprecated as of OpenERP 7.0, because that version - deprecated res.partner.address, and res.partner already has multi - category support (visible as Tags in the user interface). - - The port of this module to OpenERP 7 keeps the model definitions, but - removes the views (for which the base views are no longer - available). The migration process should ensure that the - res.partner.address.category records are migrated to - res.partner.category records. - """, - "version": "1.2", - "author": "Camptocamp", - "category": "Generic Modules/Base", - "website": "http://www.camptocamp.com", - "depends": [ - "base", - ], - "data": [ - "security/security.xml" - 'security/ir.model.access.csv', - ], - "installable": True -} diff --git a/base_address_category/base_address.py b/base_address_category/base_address.py deleted file mode 100644 index 0a5c9b457..000000000 --- a/base_address_category/base_address.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010-2013 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Joel Grand-Guillaume -# -# 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 . -# -# -############################################################################## - - -from openerp.osv import fields, orm - - -class ResPartnerAdressCategory(orm.Model): - def name_get(self, cr, uid, ids, context=None): - if not len(ids): - return [] - reads = self.read(cr, uid, ids, ['name', 'parent_id'], context) - res = [] - for record in reads: - name = record['name'] - if record['parent_id']: - name = '%s / %s ' % (record['parent_id'][1], name) - res.append((record['id'], name)) - return res - - def _name_get_fnc(self, cr, uid, ids, prop, unknow_none, unknow_dict): - res = self.name_get(cr, uid, ids) - return dict(res) - - def _check_recursion(self, cr, uid, ids): - level = 100 - while ids: - cr.execute('select distinct parent_id ' - 'from res_partner_address_category ' - 'where id in %s', ids) - ids = [parent_id for (parent_id,) in cr.fetchall() if parent_id] - if not level: - return False - level -= 1 - return True - - _name = 'res.partner.address.category' - _description = 'Partner address Categories' - _columns = { - 'name': fields.char('Category Name', required=True, size=64), - 'parent_id': fields.many2one('res.partner.address.category', - 'Parent Category', - select=True), - 'complete_name': fields.function(_name_get_fnc, - type="char", - string='Name'), - 'child_ids': fields.one2many('res.partner.address.category', - 'parent_id', - 'Children Category'), - 'active': fields.boolean('Active'), - } - _constraints = [ - (_check_recursion, - 'Error: you can not create recursive categories.', - ['parent_id']) - ] - _defaults = { - 'active': lambda *a: 1, - } - _order = 'parent_id,name' - - -class ResPartnerAddress(orm.Model): - _inherit = "res.partner.address" - - _columns = { - 'category_id': fields.many2many('res.partner.address.category', - 'res_partner_address_category_rel', - 'adress_id', - 'category_id', - 'Address categories'), - } diff --git a/base_address_category/base_address_view.xml b/base_address_category/base_address_view.xml deleted file mode 100644 index b020c6a30..000000000 --- a/base_address_category/base_address_view.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/base_address_category/security/ir.model.access.csv b/base_address_category/security/ir.model.access.csv deleted file mode 100644 index 07cf78394..000000000 --- a/base_address_category/security/ir.model.access.csv +++ /dev/null @@ -1,3 +0,0 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_res_partner_address_category_group_user","res.partner.address.category","model_res_partner_address_category",base.group_user,1,0,0,0 -"access_res_partner_address_category_partner_manager","res.partner.address.category","model_res_partner_address_category","base.group_partner_manager",1,1,1,1 diff --git a/base_address_category/security/security.xml b/base_address_category/security/security.xml deleted file mode 100644 index 35855a3de..000000000 --- a/base_address_category/security/security.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/partner_address_ldap/__init__.py b/partner_address_ldap/__init__.py deleted file mode 100644 index c2f7c76b8..000000000 --- a/partner_address_ldap/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Thanks to Laurent Lauden for his code adaptation -# Contribution : Joel Grand-Guillaume -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -import address -import partner -import company -import wizard diff --git a/partner_address_ldap/__openerp__.py b/partner_address_ldap/__openerp__.py deleted file mode 100644 index dc867792c..000000000 --- a/partner_address_ldap/__openerp__.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Thanks to Laurent Lauden for his code adaptation -# Active directory Donor: M. Benadiba (Informatique Assistances.fr) -# Contribution : Joel Grand-Guillaume -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -{ - "name": "Partner synchronization from OpenERP to ldap", - "version": "1.2", - "author": "Camptocamp", - "depends": ["base"], - "category": "Generic Modules/Misc", - "website": "http://www.camptocamp.com", - "description": """ - -Live partner address synchronization through a LDAP module (inetOrgPerson). -OpenERP becomes the master of the LDAP. Each time an address is deleted, -created or updated the same is done in the ldap (a new record is pushed). -The LDAP configuration is done in the company view. There can be one different -LDAP per company. Do not forget to activate -the LDAP link in the configuration. -The used LDAP depends on the current user company. - -This module does not allows bulk batching synchronisation into the LDAP and is -thus not suitable for an instant use with an existing LDAP. -In order to use it with an existing LDAP you have to alter the uid of contact -in your LDAP. The uid should be terp_ plus the OpenERP -contact id (for example terp_10). - -N.B: -The module requires the python-ldap library -Unicode support --> As python ldap does not support unicode we try to decode -string if it fails we transliterate values. -Active Directory Support for Windows server 2003, try 2008 at your own risk -(AD support not tested for Version 6 of OpenERP looking for active dir test infra) - -""", - "data": [ - "security/security.xml" - 'company_view.xml', - 'address_view.xml', - "wizard.xml", - ], - "installable": False -} diff --git a/partner_address_ldap/address.py b/partner_address_ldap/address.py deleted file mode 100644 index 6806dd8fb..000000000 --- a/partner_address_ldap/address.py +++ /dev/null @@ -1,457 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010-2011 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Thanks to Laurent Lauden for his code adaptation -# Active directory Donor: M. Benadiba (Informatique Assistances.fr) -# Contribution : Joel Grand-Guillaume -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## -# TODO Find why company parameter are cached - -import re -import unicodedata -from openerp import netsvc -try: - import ldap - import ldap.modlist -except: - print('python ldap not installed please install it in order to use this module') - - -from openerp.osv import orm, fields -from openerp.tools.translate import _ - -logger = netsvc.Logger() - - -class LdapConnMApper(object): - """LdapConnMApper: push specific fields from the Terp Partner_contacts to the - LDAP schema inetOrgPerson. Ldap bind options are stored in company.r""" - def __init__(self, cursor, uid, osv_obj, context=None): - """Initialize connexion to ldap by using parameter set in the current user compagny""" - logger.notifyChannel("MY TOPIC", netsvc.LOG_DEBUG, - _('Initalize LDAP CONN')) - self.USER_DN = '' - self.CONTACT_DN = '' - self.LDAP_SERVER = '' - self.PASS = '' - self.OU = '' - self.connexion = '' - self.ACTIVDIR = False - - # Reading ldap pref - user = osv_obj.pool.get('res.users').browse(cursor, uid, uid, context=context) - company = osv_obj.pool.get('res.company').browse(cursor, - uid, - user.company_id.id, - context=context) - self.USER_DN = company.base_dn - self.CONTACT_DN = company.contact_dn - self.LDAP_SERVER = company.ldap_server - self.PASS = company.passwd - self.PORT = company.ldap_port - self.OU = company.ounit - self.ACTIVDIR = company.is_activedir - - mand = (self.USER_DN, self.CONTACT_DN, self.LDAP_SERVER, self.PASS, self.OU) - if company.ldap_active: - for param in mand: - if not param: - raise orm.except_orm(_('Warning !'), - _('An LDAP parameter is missing for company %s') % (company.name, )) - - def get_connexion(self): - """create a new ldap connexion""" - logger.notifyChannel("LDAP Address", netsvc.LOG_DEBUG, - _('connecting to server ldap %s') % (self.LDAP_SERVER, )) - if self.PORT: - self.connexion = ldap.open(self.LDAP_SERVER, self.PORT) - else: - self.connexion = ldap.open(self.LDAP_SERVER) - self.connexion.simple_bind_s(self.USER_DN, self.PASS) - return self.connexion - - -class LDAPAddress(orm.Model): - """Override the CRUD of the objet in order to dynamically bind to ldap""" - _inherit = 'res.partner.address' - ldapMapper = None - - def init(self, cr): - logger = netsvc.Logger() - try: - logger.notifyChannel(_('LDAP address init'), - netsvc.LOG_INFO, - _('try to ALTER TABLE res_partner_address RENAME ' - 'column name to lastname ;')) - cr.execute('ALTER TABLE res_partner_address RENAME column name to lastname ;') - - except Exception: - cr.rollback() - logger.notifyChannel(_('LDAP address init'), - netsvc.LOG_INFO, - _('Warning ! impossible to rename column name' - ' into lastname, this is probabely aleready' - ' done or does not exist')) - - def _compute_name(self, firstname, lastname): - firstname = firstname or u'' - lastname = lastname or u'' - firstname = (u' ' + firstname).rstrip() - return u"%s%s" % (lastname, firstname) - - def _name_get_fnc(self, cursor, uid, ids, name, arg, context=None): - """Get the name (lastname + firstname), otherwise ''""" - if not ids: - return [] - reads = self.read(cursor, uid, ids, ['lastname', 'firstname']) - res = [] - for record in reads: - # We want to have " firstname" or "" - name = self._compute_name(record['firstname'], record['lastname']) - res.append((record['id'], name)) - return dict(res) - - # TODO get the new version of name search not vulnerable to sql injections - # def name_search(self, cursor, user, name, args=None, operator='ilike', context=None, limit=100): - # if not context: context = {} - # prep_name = '.*%s.*' %(name) - # cursor.execute(("select id from res_partner_address where" - # " (to_ascii(convert( lastname, 'UTF8', 'LATIN1'),'LATIN-1') ~* '%s'" - # " or to_ascii(convert( firstname, 'UTF8', 'LATIN1'),'LATIN-1') ~* '%s')" - # " limit %s") % (prep_name, prep_name, limit)) - # res = cursor.fetchall() - # if res: - # res = [x[0] for x in res] - # else: - # res = [] - # # search in partner name to know if we are searching partner... - # partner_obj=self.pool.get('res.partner') - # part_len = len(res)-limit - # if part_len > 0: - # partner_res = partner_obj.search(cursor, user, [('name', 'ilike', name)], - # limit=part_len, context=context) - # for p in partner_res: - # addresses = partner_obj.browse(cursor, user, p).address - # # Take each contact and add it to - # for add in addresses: - # res.append(add.id) - # return self.name_get(cursor, user, res, context) - - _columns = { - 'firstname': fields.char('First name', size=256), - 'lastname': fields.char('Last name', size=256), - 'name': fields.function(_name_get_fnc, method=True, - type="char", size=512, - store=True, string='Contact Name', - help='Name generated from the first name and last name', - nodrop=True), - 'private_phone': fields.char('Private phone', size=128), - } - - def create(self, cursor, uid, vals, context={}): - self.getconn(cursor, uid, {}) - ids = None - self.validate_entries(vals, cursor, uid, ids) - tmp_id = super(LDAPAddress, self).create(cursor, uid, - vals, context) - if self.ldaplinkactive(cursor, uid, context): - self.saveLdapContact(tmp_id, vals, cursor, uid, context) - return tmp_id - - def write(self, cursor, uid, ids, vals, context=None): - context = context or {} - self.getconn(cursor, uid, {}) - if not isinstance(ids, list): - ids = [ids] - if ids: - self.validate_entries(vals, cursor, uid, ids) - if context.get('init_mode'): - success = True - else: - success = super(LDAPAddress, self).write(cursor, uid, ids, - vals, context) - if self.ldaplinkactive(cursor, uid, context): - for address_id in ids: - self.updateLdapContact(address_id, vals, cursor, uid, context) - return success - - def unlink(self, cursor, uid, ids, context=None): - if context is None: - context = {} - if ids: - self.getconn(cursor, uid, {}) - if not isinstance(ids, list): - ids = [ids] - if self.ldaplinkactive(cursor, uid, context): - for id in ids: - self.removeLdapContact(id, cursor, uid) - return super(LDAPAddress, self).unlink(cursor, uid, ids) - - def validate_entries(self, vals, cursor, uid, ids): - """Validate data of an address based on the inetOrgPerson schema""" - for val in vals: - try: - if isinstance(vals[val], basestring): - vals[val] = unicode(vals[val].decode('utf8')) - except UnicodeError: - logger.notifyChannel('LDAP encode', netsvc.LOG_DEBUG, - 'cannot unicode ' + vals[val]) - pass - - if ids is not None: - if isinstance(ids, (int, long)): - ids = [ids] - if len(ids) == 1: - self.addNeededFields(ids[0], vals, cursor, uid) - email = vals.get('email', False) - phone = vals.get('phone', False) - fax = vals.get('fax', False) - mobile = vals.get('mobile', False) - private_phone = vals.get('private_phone', False) - if email: - if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", - email) is None: - raise orm.except_orm(_('Warning !'), - _('Please enter a valid e-mail')) - phones = (('phone', phone), ('fax', fax), ('mobile', mobile), - ('private_phone', private_phone)) - for phone_tuple in phones: - phone_number = phone_tuple[1] - if phone_number: - if not phone_number.startswith('+'): - raise orm.except_orm(_('Warning !'), - _('Please enter a valid phone number in %s' - ' international format (i.e. leading +)') % phone_tuple[0]) - - def getVals(self, att_name, key, vals, dico, uid, ids, cursor, context=None): - """map to values to dict""" - if not context: - context = {} - # We explicitly test False value - if vals.get(key, False) is not False: - dico[att_name] = vals[key] - else: - if context.get('init_mode'): - return False - tmp = self.read(cursor, uid, ids, [key], context={}) - if tmp.get(key, False): - dico[att_name] = tmp[key] - - def _un_unicodize_buf(self, in_buf): - if isinstance(in_buf, unicode): - try: - return in_buf.encode() - except Exception: - return unicodedata.normalize("NFKD", in_buf).encode('ascii', 'ignore') - return in_buf - - def unUnicodize(self, indict): - """remove unicode data of modlist as unicode is not supported - by python-ldap library till version 2.7 - """ - for key in indict: - if not isinstance(indict[key], list): - indict[key] = self._un_unicodize_buf(indict[key]) - else: - nonutfArray = [] - for val in indict[key]: - nonutfArray.append(self._un_unicodize_buf(val)) - indict[key] = nonutfArray - - def addNeededFields(self, id, vals, cursor, uid): - previousvalue = self.browse(cursor, uid, [id])[0] - if not vals.get('partner_id'): - vals['partner_id'] = previousvalue.partner_id.id - values_to_check = ('email', 'phone', 'fax', 'mobile', 'firstname', - 'lastname', 'private_phone', 'street', 'street2') - for val in values_to_check: - if not vals.get(val): - vals[val] = previousvalue[val] - - def mappLdapObject(self, id, vals, cursor, uid, context): - """Mapp ResPArtner adress to moddlist""" - self.addNeededFields(id, vals, cursor, uid) - conn = self.getconn(cursor, uid, {}) - partner_obj = self.pool.get('res.partner') - part_name = partner_obj.browse(cursor, uid, vals['partner_id']).name - vals['partner'] = part_name - name = self._compute_name(vals.get('firstname'), vals.get('lastname')) - if name: - cn = name - else: - cn = part_name - if not vals.get('lastname'): - vals['lastname'] = part_name - contact_obj = {'objectclass': ['inetOrgPerson'], - 'uid': ['terp_' + str(id)], - 'ou': [conn.OU], - 'cn': [cn], - 'sn': [vals['lastname']]} - if not vals.get('street'): - vals['street'] = u'' - if not vals.get('street2'): - vals['street2'] = u'' - street_key = 'street' - if self.getconn(cursor, uid, {}).ACTIVDIR: - # ENTERING THE M$ Realm and it is weird - # We manage the address - street_key = 'streetAddress' - contact_obj[street_key] = vals['street'] + "\r\n" + vals['street2'] - # we modifiy the class - contact_obj['objectclass'] = ['top', 'person', 'organizationalPerson', 'inetOrgPerson', 'user'] - # we handle the country - if vals.get('country_id'): - country = self.browse(cursor, uid, id, context=context).country_id - if country: - vals['country_id'] = country.name - vals['c'] = country.code - else: - vals['country_id'] = False - vals['c'] = False - if vals.get('country_id', False): - self.getVals('co', 'country_id', vals, contact_obj, uid, id, cursor, context) - self.getVals('c', 'c', vals, contact_obj, uid, id, cursor, context) - # we compute the display name - vals['display'] = '%s %s' % (vals['partner'], contact_obj['cn'][0]) - # we get the title - if self.browse(cursor, uid, id).function: - contact_obj['description'] = self.browse(cursor, uid, id).function.name - # we replace carriage return - if vals.get('comment', False): - vals['comment'] = vals['comment'].replace("\n", "\r\n") - # Active directory specific fields - self.getVals('company', 'partner', vals, contact_obj, uid, id, cursor, context) - self.getVals('info', 'comment', vals, contact_obj, uid, id, cursor, context) - self.getVals('displayName', 'partner', vals, contact_obj, uid, id, cursor, context) - # Web site management - if self.browse(cursor, uid, id).partner_id.website: - vals['website'] = self.browse(cursor, uid, id).partner_id.website - self.getVals('wWWHomePage', 'website', vals, contact_obj, uid, id, cursor, context) - del(vals['website']) - self.getVals('title', 'title', vals, contact_obj, uid, id, cursor, context) - else: - contact_obj[street_key] = vals['street'] + u"\n" + vals['street2'] - self.getVals('o', 'partner', vals, contact_obj, uid, id, cursor, context) - - # Common attributes - self.getVals('givenName', 'firstname', vals, contact_obj, uid, id, cursor, context) - self.getVals('mail', 'email', vals, contact_obj, uid, id, cursor, context) - self.getVals('telephoneNumber', 'phone', vals, contact_obj, uid, id, cursor, context) - self.getVals('l', 'city', vals, contact_obj, uid, id, cursor, context) - self.getVals('facsimileTelephoneNumber', 'fax', vals, contact_obj, uid, id, cursor, context) - self.getVals('mobile', 'mobile', vals, contact_obj, uid, id, cursor, context) - self.getVals('homePhone', 'private_phone', vals, contact_obj, uid, id, cursor, context) - self.getVals('postalCode', 'zip', vals, contact_obj, uid, id, cursor, context) - self.unUnicodize(contact_obj) - return contact_obj - - def saveLdapContact(self, id, vals, cursor, uid, context=None): - """save openerp adress to ldap""" - contact_obj = self.mappLdapObject(id, vals, cursor, uid, context) - conn = self.connectToLdap(cursor, uid, context=context) - try: - if self.getconn(cursor, uid, context).ACTIVDIR: - conn.connexion.add_s("CN=%s,OU=%s,%s" % (contact_obj['cn'][0], conn.OU, conn.CONTACT_DN), - ldap.modlist.addModlist(contact_obj)) - else: - conn.connexion.add_s("uid=terp_%s,OU=%s,%s" % (str(id), conn.OU, conn.CONTACT_DN), - ldap.modlist.addModlist(contact_obj)) - except Exception: - raise - conn.connexion.unbind_s() - - def updateLdapContact(self, id, vals, cursor, uid, context): - """update an existing contact with the data of OpenERP""" - conn = self.connectToLdap(cursor, uid, context={}) - try: - old_contatc_obj = self.getLdapContact(conn, id) - except ldap.NO_SUCH_OBJECT: - self.saveLdapContact(id, vals, cursor, uid, context) - return - contact_obj = self.mappLdapObject(id, vals, cursor, uid, context) - if conn.ACTIVDIR: - modlist = [] - for key, val in contact_obj.items(): - if key in ('cn', 'uid', 'objectclass'): - continue - if isinstance(val, list): - val = val[0] - modlist.append((ldap.MOD_REPLACE, key, val)) - else: - modlist = ldap.modlist.modifyModlist(old_contatc_obj[1], contact_obj) - try: - conn.connexion.modify_s(old_contatc_obj[0], modlist) - conn.connexion.unbind_s() - except Exception: - raise - - def removeLdapContact(self, id, cursor, uid): - """Remove a contact from ldap""" - conn = self.connectToLdap(cursor, uid, context={}) - to_delete = None - try: - to_delete = self.getLdapContact(conn, id) - except ldap.NO_SUCH_OBJECT: - logger.notifyChannel("Warning", netsvc.LOG_INFO, - _("'no object to delete in ldap' %s") % (id)) - except Exception: - raise - try: - if to_delete: - conn.connexion.delete_s(to_delete[0]) - conn.connexion.unbind_s() - except Exception: - raise - - def getLdapContact(self, conn, id): - result = conn.connexion.search_ext_s("ou=%s, %s" % (conn.OU, conn.CONTACT_DN), - ldap.SCOPE_SUBTREE, - "(&(objectclass=*)(uid=terp_" + str(id) + "))") - if not result: - raise ldap.NO_SUCH_OBJECT - return result[0] - - def ldaplinkactive(self, cursor, uid, context=None): - """Check if ldap is activated for this company""" - user = self.pool.get('res.users').browse(cursor, uid, uid, context=context) - company = self.pool.get('res.company').browse(cursor, uid, user.company_id.id, context=context) - return company.ldap_active - - def getconn(self, cursor, uid, context=None): - """LdapConnMApper""" - if not self.ldapMapper: - self.ldapMapper = LdapConnMApper(cursor, uid, self) - return self.ldapMapper - - def connectToLdap(self, cursor, uid, context=None): - """Reinitialize ldap connection""" - # getting ldap pref - if not self.ldapMapper: - self.getconn(cursor, uid, context) - self.ldapMapper.get_connexion() - return self.ldapMapper diff --git a/partner_address_ldap/address_view.xml b/partner_address_ldap/address_view.xml deleted file mode 100644 index e2f6a61af..000000000 --- a/partner_address_ldap/address_view.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - #--------------------------------------------------------------------------------------------------------- - # Partner form->contact and tree view of address - #--------------------------------------------------------------------------------------------------------- - - res.partner.address.tree - res.partner.address - tree - - - - - - - - - - - - - - - - - res.partner.address.form1.c2c_partner_adress - res.partner.address - form - - - - - - - - - - - - - - res.partner.address.form1.c2c_partner_adress - res.partner.address - form - - - - - - - - - - - - - - res.partner.address.form2_c2c_partner_address - res.partner.address - form - - - - - - - - - - - - - - - res.partner.address.form2_c2c_partner_address - res.partner.address - form - - - - - - - - - - - - - res.partner.form2_partner_address - res.partner - form - - - - - - - - - - - - - - - diff --git a/partner_address_ldap/company.py b/partner_address_ldap/company.py deleted file mode 100644 index 6300c4dc0..000000000 --- a/partner_address_ldap/company.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Thanks to Laurent Lauden for his code adaptation -# Active directory Donor: M. Benadiba (Informatique Assistances.fr) -# Contribution : Joel Grand-Guillaume -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -from openerp.osv import orm, fields - - -class Res_company(orm.Model): - """Define ldap connexion parameters""" - - _inherit = 'res.company' - _columns = { - 'base_dn': fields.char( - 'User dn', - size=128, - help="Example: cn=contacts_admin,dc=ldap,dc=dcc2c" - ), - 'contact_dn': fields.char( - 'Bind dn', - size=128, - help="Example: dc=ldap,dc=dcc2c -- watch out " - "the OU will be automatically included inside" - ), - 'ounit': fields.char( - 'Contact Organizational unit of the contacts', - size=128, - help="Example: Contacts" - ), - 'ldap_server': fields.char( - 'Server address', - size=128, - help="Example: ldap.camptocamp.com" - ), - 'passwd': fields.char('ldap password', size=128, help="Example: Mypassword1234"), - 'ldap_active': fields.boolean( - 'Activate ldap link for this company', - help='If not check nothing will be reported into the ldap' - ), - 'is_activedir': fields.boolean( - 'Active Directory ?', - help='The ldap is part of an Active Directory' - ), - 'ldap_port': fields.integer('LDAP Port', - help="If not specified, the default port" - "(389), will be used") - } diff --git a/partner_address_ldap/company_view.xml b/partner_address_ldap/company_view.xml deleted file mode 100755 index 69fee3ce8..000000000 --- a/partner_address_ldap/company_view.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - res.company.form - res.company - - form - - - - - - - - - - - - - - - - - diff --git a/partner_address_ldap/i18n/fr_FR.po b/partner_address_ldap/i18n/fr_FR.po deleted file mode 100644 index 3b66eea80..000000000 --- a/partner_address_ldap/i18n/fr_FR.po +++ /dev/null @@ -1,82 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * c2c_contact_to_ldap -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.7\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2010-02-01 15:06:40+0000\n" -"PO-Revision-Date: 2010-02-01 15:06:40+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: c2c_contact_to_ldap -#: field:res.company,is_activedir:0 -msgid "Active Directory ?" -msgstr "" - -#. module: c2c_contact_to_ldap -#: model:ir.actions.wizard,name:c2c_contact_to_ldap.ldap_import_adresses -msgid "Export addresses to company LDAP" -msgstr "Exporte les adresses de OpenERP vers LDAP" - -#. module: c2c_contact_to_ldap -#: wizard_field:ldap.import_adresses,importadd,errors:0 -msgid "Error report" -msgstr "Rapport d'erreur" - -#. module: c2c_contact_to_ldap -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML non valide pour l'architecture de la vue" - -#. module: c2c_contact_to_ldap -#: wizard_button:ldap.import_adresses,init,importadd:0 -msgid "Export adresses into company LDAP" -msgstr "Exportation des adresses vers le ldap spécifié dans la société" - -#. module: c2c_contact_to_ldap -#: wizard_view:ldap.import_adresses,importadd:0 -msgid "Export log" -msgstr "Log d'exportation" - -#. module: c2c_contact_to_ldap -#: wizard_view:ldap.import_adresses,importadd:0 -msgid "Clic on 'Save as' to save the log file :" -msgstr "Cliquez sur save as pour sauvegarder le fichier" - -#. module: c2c_contact_to_ldap -#: help:res.company,is_activedir:0 -msgid "The ldap is part of an Active Directory" -msgstr "Le ldap est un ldap Active Directory" - -#. module: c2c_contact_to_ldap -#: wizard_button:ldap.import_adresses,importadd,end:0 -msgid "OK" -msgstr "" - -#. module: c2c_contact_to_ldap -#: wizard_view:ldap.import_adresses,init:0 -msgid "Export adresses to ldap" -msgstr "Exporter les adresses dans le ldap" - -#. module: c2c_contact_to_ldap -#: wizard_button:ldap.import_adresses,init,end:0 -msgid "Cancel" -msgstr "Annuler" - -#. module: c2c_contact_to_ldap -#: field:res.company,ounit:0 -msgid "Contact Organizational unit of the contacts" -msgstr "OU (organizational unit des adresses)" - -#. module: c2c_contact_to_ldap -#: help:res.company,ounit:0 -msgid "Exemple: Contacts" -msgstr "" - diff --git a/partner_address_ldap/partner.py b/partner_address_ldap/partner.py deleted file mode 100644 index c980c84be..000000000 --- a/partner_address_ldap/partner.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Nicolas Bessi (Camptocamp), Thanks to Laurent Lauden for his code adaptation -# Active directory Donor: M. Benadiba (Informatique Assistances.fr) -# Contribution : Joel Grand-Guillaume -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -from openerp.osv import orm - - -class LdapPartner(orm.Model): - """Ensure that when deleting a partner unlink function is called on all - related addresses""" - _inherit = 'res.partner' - - def unlink(self, cursor, uid, ids, context=None): - context = context or {} - addr_obj = self.pool.get('res.partner.address') - if not isinstance(ids, list): - ids = [ids] - addr_ids = addr_obj.search(cursor, uid, [('partner_id', 'in', ids)]) - addr_obj.unlink(cursor, uid, addr_ids, context=context) - return super(LdapPartner, self).unlink(cursor, uid, ids, context=context) diff --git a/partner_address_ldap/security/security.xml b/partner_address_ldap/security/security.xml deleted file mode 100644 index 35855a3de..000000000 --- a/partner_address_ldap/security/security.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/partner_address_ldap/wizard.xml b/partner_address_ldap/wizard.xml deleted file mode 100755 index ca909ee27..000000000 --- a/partner_address_ldap/wizard.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/partner_address_ldap/wizard/__init__.py b/partner_address_ldap/wizard/__init__.py deleted file mode 100644 index ffecac956..000000000 --- a/partner_address_ldap/wizard/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Vincent Renaville -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -import wiz_import_adresses diff --git a/partner_address_ldap/wizard/wiz_import_adresses.py b/partner_address_ldap/wizard/wiz_import_adresses.py deleted file mode 100644 index e3e1e5b2c..000000000 --- a/partner_address_ldap/wizard/wiz_import_adresses.py +++ /dev/null @@ -1,161 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) -# All Right Reserved -# -# Author : Vincent Renaville -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company -# -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -############################################################################## - -# init_import.py -# -# Created by Nicolas Bessi on 28.04.09. -# Copyright (c) 2009 CamptoCamp. All rights reserved. -# - -import base64 -import unicodedata -import re -import wizard -from openerp import pooler -from openerp import netsvc - -_FORM = ''' -
-
''' - - -_FORM1 = """ -
- - - -""" - -_FIELDS = { - 'errors': { - 'string': 'Error report', - 'type': 'binary', - 'readonly': True, - }, -} - - -# As this is a bulk batch wizard the performance process was not really taken in account ### -# The ideal way of doing would be to modify the connexion settings in order to have a connexion singleton -# in the file partner.py it will avoid connexion renegotiation for each partner. -def _action_import_addresses(self, cr, uid, data, context): - """ This function create or update each addresses present in the database. - It will also generate an error report""" - logger = netsvc.Logger() - error_report = [u'Error report'] - add_obj = pooler.get_pool(cr.dbname).get('res.partner.address') - add_ids = add_obj.search(cr, uid, []) - addresses = add_obj.browse(cr, uid, add_ids) - phone_fields = ['phone', 'fax', 'mobile', 'private_phone'] - for add in addresses: - vals = { - 'partner_id': add.partner_id.id, - 'email': add.email, - 'phone': add.phone, - 'fax': add.fax, - 'mobile': add.mobile, - 'firstname': add.firstname, - 'lastname': add.lastname, - 'private_phone': add.private_phone, - 'street': add.street, - 'street2': add.street2, - 'city': add.city, - } - # Validating the mail - if add.email: - if re.match( - "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", add.email) is None or\ - re.search(u"[éèàêöüäï&]", add.email) is not None: - msg = u'Address %s for partner %s has email that is invalid %s' % ( - unicode(vals['firstname']) + ' ' + unicode(vals['lastname']), - add.partner_id.name, - unicode(add.email) - ) - logger.notifyChannel('ldap export', netsvc.LOG_INFO, msg) - error_report.append(msg) - vals['email'] = False - # Validating the Phone - for key in phone_fields: - if (not unicode(vals[key]).startswith('+') or unicode(vals[key]).find("\n") != -1 - or re.search(u"[éèàêöüä#&]", unicode(vals[key])) is not None): - vals[key] = False - msg = u'Addresse %s for partner %s has %s that is invalid ' % ( - unicode(vals['firstname']) + ' ' + unicode(vals['lastname']), - add.partner_id.name, - key - ) - logger.notifyChannel('ldap export', netsvc.LOG_INFO, msg) - error_report.append(msg) - # Validating the CN - if not add.lastname and add.firstname: - msg = (u'!!! Address %s for partner %s has no last name and first name that is valid partner name was used' - % (unicode(add.id), add.partner_id.name)) - logger.notifyChannel('ldap export', netsvc.LOG_INFO, msg) - error_report.append(msg) - # We save to LDAP - add.write(vals, {'init_mode': True}) - # we by pass the encoding errors - map(lambda x: unicodedata.normalize("NFKD", x).encode('ascii', 'ignore'), error_report) - error_report = "\n".join(error_report) - logger.notifyChannel("MY TOPIC", netsvc.LOG_ERROR, error_report) - try: - data = base64.encodestring(error_report.encode()) - except: - data = base64.encodestring("Could not generate report file. Please look in the log for details") - - return {'errors': data} - - -class Wiz_import_addresses(wizard.interface): - states = { - 'init': { - 'actions': [], - 'result': { - 'type': 'form', - 'arch': _FORM, - 'fields': {}, - 'state': [ - ('end', 'Cancel'), - ('importadd', 'Export adresses into company LDAP') - ] - } - }, - 'importadd': { - 'actions': [_action_import_addresses], - 'result': { - 'state': [('end', 'OK', 'gtk-ok', True)], - 'arch': _FORM1, - 'fields': _FIELDS, - 'type': 'form' - } - } - } -Wiz_import_addresses('ldap.import_adresses')