diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index 802a0510e28..a353344190f 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -75,6 +75,7 @@ 'security/base_security.xml', 'publisher_warranty/publisher_warranty_view.xml', 'security/ir.model.access.csv', + 'security/ir.model.access-1.csv', # res.partner.address is deprecated; it is still there for backward compability only and will be removed in next version 'res/res_widget_view.xml', 'res/res_widget_data.xml', 'publisher_warranty/publisher_warranty_data.xml', diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index a0e66de8dba..7f5b4dec109 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -1058,14 +1058,9 @@ Your Company - - - - - default - + @@ -1102,9 +1097,6 @@ - - - diff --git a/openerp/addons/base/base_demo.xml b/openerp/addons/base/base_demo.xml index 3d1eae3c4bc..a0149096902 100644 --- a/openerp/addons/base/base_demo.xml +++ b/openerp/addons/base/base_demo.xml @@ -2,8 +2,8 @@ - - Fabien Dupont + + Fabien D'souza Chaussee de Namur 1367 Gerompont diff --git a/openerp/addons/base/report/corporate_defaults.xml b/openerp/addons/base/report/corporate_defaults.xml index cef5acdd020..12e8bb5eeea 100644 --- a/openerp/addons/base/report/corporate_defaults.xml +++ b/openerp/addons/base/report/corporate_defaults.xml @@ -6,15 +6,13 @@ <name type="field" name="partner_id.name"/> - <address type="zoom" name="partner_id.address"> - <street type="field" name="street"/> - <zip type="field" name="zip"/> - <city type="field" name="city"/> - <state type="field" name="state_id.name"/> - <country type="field" name="country_id.name"/> - <phone type="field" name="phone"/> - <email type="field" name="email"/> - </address> + <street type="field" name="street"/> + <zip type="field" name="zip"/> + <city type="field" name="city"/> + <state type="field" name="state_id.name"/> + <country type="field" name="country_id.name"/> + <phone type="field" name="phone"/> + <email type="field" name="email"/> </corporation> <user> <name type="field" name="name"/> diff --git a/openerp/addons/base/report/corporate_defaults.xsl b/openerp/addons/base/report/corporate_defaults.xsl index 414071466af..e0f6918ec59 100644 --- a/openerp/addons/base/report/corporate_defaults.xsl +++ b/openerp/addons/base/report/corporate_defaults.xsl @@ -22,18 +22,18 @@ <setFont name="Helvetica" size="10"/> <drawRightString x="20cm" y="28.5cm"><xsl:value-of select="//corporate-header/corporation/rml_header1"/></drawRightString> - <drawString x="1cm" y="27cm"><xsl:value-of select="//corporate-header/corporation/address/street"/></drawString> + <drawString x="1cm" y="27cm"><xsl:value-of select="//corporate-header/corporation/street"/></drawString> <drawString x="1cm" y="26.5cm"> - <xsl:value-of select="//corporate-header/corporation/address/zip"/> + <xsl:value-of select="//corporate-header/corporation/zip"/> <xsl:text> </xsl:text> - <xsl:value-of select="//corporate-header/corporation/address/city"/> + <xsl:value-of select="//corporate-header/corporation/city"/> <xsl:text> - </xsl:text> - <xsl:value-of select="//corporate-header/corporation/address/country"/> + <xsl:value-of select="//corporate-header/corporation/country"/> </drawString> <drawString x="1cm" y="26cm">Phone:</drawString> - <drawRightString x="7cm" y="26cm"><xsl:value-of select="//corporate-header/corporation/address/phone"/></drawRightString> + <drawRightString x="7cm" y="26cm"><xsl:value-of select="//corporate-header/corporation/phone"/></drawRightString> <drawString x="1cm" y="25.5cm">Mail:</drawString> - <drawRightString x="7cm" y="25.5cm"><xsl:value-of select="//corporate-header/corporation/address/email"/></drawRightString> + <drawRightString x="7cm" y="25.5cm"><xsl:value-of select="//corporate-header/corporation/email"/></drawRightString> <!--page bottom--> @@ -57,18 +57,18 @@ <setFont name="Helvetica" size="10"/> <drawRightString x="1cm" y="27.5cm"><xsl:value-of select="//corporate-header/corporation/rml_header1"/></drawRightString> - <drawString x="1cm" y="27cm"><xsl:value-of select="//corporate-header/corporation/address/street"/></drawString> + <drawString x="1cm" y="27cm"><xsl:value-of select="//corporate-header/corporation/street"/></drawString> <drawString x="1cm" y="26.5cm"> - <xsl:value-of select="//corporate-header/corporation/address/zip"/> + <xsl:value-of select="//corporate-header/corporation/zip"/> <xsl:text> </xsl:text> - <xsl:value-of select="//corporate-header/corporation/address/city"/> + <xsl:value-of select="//corporate-header/corporation/city"/> <xsl:text> - </xsl:text> - <xsl:value-of select="//corporate-header/corporation/address/country"/> + <xsl:value-of select="//corporate-header/corporation/country"/> </drawString> <drawString x="1cm" y="26cm">Phone:</drawString> - <drawRightString x="7cm" y="26cm"><xsl:value-of select="//corporate-header/corporation/address/phone"/></drawRightString> + <drawRightString x="7cm" y="26cm"><xsl:value-of select="//corporate-header/corporation/phone"/></drawRightString> <drawString x="1cm" y="25.5cm">Mail:</drawString> - <drawRightString x="7cm" y="25.5cm"><xsl:value-of select="//corporate-header/corporation/address/email"/></drawRightString> + <drawRightString x="7cm" y="25.5cm"><xsl:value-of select="//corporate-header/corporation/email"/></drawRightString> <!--page bottom--> diff --git a/openerp/addons/base/report/corporate_sxw_header.xml b/openerp/addons/base/report/corporate_sxw_header.xml index 2f6f885f3ba..d752ffa91a5 100644 --- a/openerp/addons/base/report/corporate_sxw_header.xml +++ b/openerp/addons/base/report/corporate_sxw_header.xml @@ -204,8 +204,8 @@ </table:table-cell> </table:table-row> </table:table> - <text:p text:style-name="P3">[[ company.partner_id.address and company.partner_id.address[0].street ]]</text:p> - <text:p text:style-name="P3">[[ company.partner_id.address and company.partner_id.address[0].zip ]] [[ company.partner_id.address and company.partner_id.address[0].city ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name ]]</text:p> + <text:p text:style-name="P3">[[ company.partner_id.street ]]</text:p> + <text:p text:style-name="P3">[[ company.partner_id.zip ]] [[ company.partner_id.city ]] - [[ company.partner_id.country_id and company.partner_id.country_id.name ]]</text:p> <table:table table:name="Table3" table:style-name="Table3"> <table:table-column table:style-name="Table3.A"/> <table:table-column table:style-name="Table3.B"/> @@ -214,7 +214,7 @@ <text:p text:style-name="P4">Phone :</text:p> </table:table-cell> <table:table-cell table:style-name="Table3.A1" table:value-type="string"> - <text:p text:style-name="P5">[[ company.partner_id.address and company.partner_id.address[0].phone ]]</text:p> + <text:p text:style-name="P5">[[ company.partner_id.phone ]]</text:p> </table:table-cell> </table:table-row> <table:table-row> @@ -222,7 +222,7 @@ <text:p text:style-name="P4">Mail :</text:p> </table:table-cell> <table:table-cell table:style-name="Table3.A2" table:value-type="string"> - <text:p text:style-name="P5">[[ company.partner_id.address and company.partner_id.address[0].email ]]</text:p> + <text:p text:style-name="P5">[[ company.partner_id.email ]]</text:p> </table:table-cell> </table:table-row> </table:table> diff --git a/openerp/addons/base/report/mako_header.html b/openerp/addons/base/report/mako_header.html index 5bd3aaf18fb..02839e1ffb3 100644 --- a/openerp/addons/base/report/mako_header.html +++ b/openerp/addons/base/report/mako_header.html @@ -14,33 +14,33 @@ <tr> <td> - % if company['partner_id']['address'] and company['partner_id']['address'][0]['street']: - <small>${company.partner_id.address[0].street}</small></br> + % if company['partner_id']['street']: + <small>${company.partner_id.street}</small></br> %endif </td> </tr> <tr> <td> - % if company['partner_id']['address'] and company['partner_id']['address'][0]['zip']: - <small>${company.partner_id.address[0].zip} - ${company.partner_id.address[0].city}-${company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name}</small></br> + % if company['partner_id']['zip']: + <small>${company.partner_id.zip} + ${company.partner_id.city}-${company.partner_id.country_id and company.partner_id.country_id.name}</small></br> %endif </td> </tr> <tr> <td> - % if company['partner_id']['address'] and company['partner_id']['address'][0]['phone']: - <small><b>Phone:</b>${company.partner_id.address and company.partner_id.address[0].phone}</small></br> + % if company['partner_id']['phone']: + <small><b>Phone:</b>${company.partner_id.phone}</small></br> %endif </td> </tr> <tr> <td> - % if company['partner_id']['address'] and company['partner_id']['address'][0]['email']: - <small><b>Mail:</b>${company.partner_id.address and company.partner_id.address[0].email}</small></br></<address> + % if company['partner_id']['email']: + <small><b>Mail:</b>${company.partner_id.email}</small></br></<address> %endif </td> </tr> diff --git a/openerp/addons/base/res/company_icon.png b/openerp/addons/base/res/company_icon.png new file mode 100644 index 00000000000..2995ba12644 Binary files /dev/null and b/openerp/addons/base/res/company_icon.png differ diff --git a/openerp/addons/base/res/photo.png b/openerp/addons/base/res/photo.png new file mode 100644 index 00000000000..1d124127b2b Binary files /dev/null and b/openerp/addons/base/res/photo.png differ diff --git a/openerp/addons/base/res/report/partner_address.xml b/openerp/addons/base/res/report/partner_address.xml index 2a413f4e3c6..1449eb5bc0c 100644 --- a/openerp/addons/base/res/report/partner_address.xml +++ b/openerp/addons/base/res/report/partner_address.xml @@ -3,16 +3,12 @@ <address type="fields" name="id"> <company-title type="field" name="title.name"/> <company-name type="field" name="name"/> - <contact type="zoom" name="address"> - <type type="field" name="type"/> - <title type="field" name="title.name"/> - <name type="field" name="name"/> - <street type="field" name="street"/> - <street2 type="field" name="street2"/> - <zip type="field" name="zip"/> - <city type="field" name="city"/> - <state type="field" name="state_id.name"/> - <country type="field" name="country_id.name"/> - </contact> + <type type="field" name="type"/> + <street type="field" name="street"/> + <street2 type="field" name="street2"/> + <zip type="field" name="zip"/> + <city type="field" name="city"/> + <state type="field" name="state_id.name"/> + <country type="field" name="country_id.name"/> </address> </addresses> diff --git a/openerp/addons/base/res/report/partner_address.xsl b/openerp/addons/base/res/report/partner_address.xsl index 01fcc120c23..ca212f2d2b0 100644 --- a/openerp/addons/base/res/report/partner_address.xsl +++ b/openerp/addons/base/res/report/partner_address.xsl @@ -58,31 +58,17 @@ <xsl:template match="address" mode="story"> <para style="nospace"><xsl:value-of select="company-name"/><xsl:text> </xsl:text><xsl:value-of select="company-title"/></para> - <xsl:choose> - <xsl:when test="count(contact[type='default']) >= 1"> - <!-- apply the first 'contact' node with the type 'default' --> - <xsl:apply-templates select="contact[type='default'][1]"/> - </xsl:when> - <xsl:when test="count(contact[type='']) >= 1"> - <!-- apply the first 'contact' node with an empty type --> - <xsl:apply-templates select="contact[type=''][1]"/> - </xsl:when> - <xsl:otherwise> - <!-- apply the first 'contact' node --> - <xsl:apply-templates select="contact[1]"/> - </xsl:otherwise> - </xsl:choose> + <para style="nospace"><xsl:value-of select="street"/></para> + <para style="nospace"><xsl:value-of select="street2"/></para> + <para style="nospace"><xsl:value-of select="zip"/><xsl:text> </xsl:text><xsl:value-of select="city"/></para> + <para style="nospace"><xsl:value-of select="state"/></para> + <para style="nospace"><xsl:value-of select="country"/></para> <xsl:if test="position() < last()"> <nextFrame/> </xsl:if> </xsl:template> <xsl:template match="contact"> - <para style="nospace"><xsl:value-of select="title"/><xsl:text> </xsl:text><xsl:value-of select="name"/></para> - <para style="nospace"><xsl:value-of select="street"/></para> - <para style="nospace"><xsl:value-of select="street2"/></para> - <para style="nospace"><xsl:value-of select="zip"/><xsl:text> </xsl:text><xsl:value-of select="city"/></para> - <para style="nospace"><xsl:value-of select="state"/></para> - <para style="nospace"><xsl:value-of select="country"/></para> + </xsl:template> </xsl:stylesheet> diff --git a/openerp/addons/base/res/res_bank.py b/openerp/addons/base/res/res_bank.py index b9e449284e1..891794cb99c 100644 --- a/openerp/addons/base/res/res_bank.py +++ b/openerp/addons/base/res/res_bank.py @@ -219,11 +219,11 @@ class res_partner_bank(osv.osv): if partner_id: part = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context) result['owner_name'] = part.name - result['street'] = part.address and part.address[0].street or False - result['city'] = part.address and part.address[0].city or False - result['zip'] = part.address and part.address[0].zip or False - result['country_id'] = part.address and part.address[0].country_id and part.address[0].country_id.id or False - result['state_id'] = part.address and part.address[0].state_id and part.address[0].state_id.id or False + result['street'] = part.street or False + result['city'] = part.city or False + result['zip'] = part.zip or False + result['country_id'] = part.country_id.id + result['state_id'] = part.state_id.id return {'value': result} res_partner_bank() diff --git a/openerp/addons/base/res/res_company.py b/openerp/addons/base/res/res_company.py index f04e28832a0..7778f6a055a 100644 --- a/openerp/addons/base/res/res_company.py +++ b/openerp/addons/base/res/res_company.py @@ -77,13 +77,12 @@ class res_company(osv.osv): """ Read the 'address' functional fields. """ result = {} part_obj = self.pool.get('res.partner') - address_obj = self.pool.get('res.partner.address') for company in self.browse(cr, uid, ids, context=context): result[company.id] = {}.fromkeys(field_names, False) if company.partner_id: address_data = part_obj.address_get(cr, uid, [company.partner_id.id], adr_pref=['default']) if address_data['default']: - address = address_obj.read(cr, uid, address_data['default'], field_names, context=context) + address = part_obj.read(cr, uid, address_data['default'], field_names, context=context) for field in field_names: result[company.id][field] = address[field] or False return result @@ -105,13 +104,12 @@ class res_company(osv.osv): company = self.browse(cr, uid, company_id, context=context) if company.partner_id: part_obj = self.pool.get('res.partner') - address_obj = self.pool.get('res.partner.address') address_data = part_obj.address_get(cr, uid, [company.partner_id.id], adr_pref=['default']) address = address_data['default'] if address: - address_obj.write(cr, uid, [address], {name: value or False}) + part_obj.write(cr, uid, [address], {name: value or False}) else: - address_obj.create(cr, uid, {name: value or False, 'partner_id': company.partner_id.id}, context=context) + part_obj.create(cr, uid, {name: value or False, 'parent_id': company.partner_id.id}, context=context) return True @@ -126,7 +124,7 @@ class res_company(osv.osv): 'rml_header': fields.text('RML Header', required=True), 'rml_header2': fields.text('RML Internal Header', required=True), 'rml_header3': fields.text('RML Internal Header', required=True), - 'logo': fields.binary('Logo'), + 'logo': fields.related('partner_id', 'photo', string="Logo", type="binary"), 'currency_id': fields.many2one('res.currency', 'Currency', required=True), 'currency_ids': fields.one2many('res.currency', 'company_id', 'Currency'), 'user_ids': fields.many2many('res.users', 'res_company_users_rel', 'cid', 'user_id', 'Accepted Users'), @@ -229,7 +227,7 @@ class res_company(osv.osv): self.cache_restart(cr) return super(res_company, self).create(cr, uid, vals, context=context) obj_partner = self.pool.get('res.partner') - partner_id = obj_partner.create(cr, uid, {'name': vals['name']}, context=context) + partner_id = obj_partner.create(cr, uid, {'name': vals['name'], 'is_company':True}, context=context) vals.update({'partner_id': partner_id}) self.cache_restart(cr) company_id = super(res_company, self).create(cr, uid, vals, context=context) @@ -296,12 +294,12 @@ class res_company(osv.osv): <drawString x="1.3cm" y="%s">[[ company.partner_id.name ]]</drawString> - <drawString x="1.3cm" y="%s">[[ company.partner_id.address and company.partner_id.address[0].street or '' ]]</drawString> - <drawString x="1.3cm" y="%s">[[ company.partner_id.address and company.partner_id.address[0].zip or '' ]] [[ company.partner_id.address and company.partner_id.address[0].city or '' ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name or '']]</drawString> + <drawString x="1.3cm" y="%s">[[ company.partner_id.street or '' ]]</drawString> + <drawString x="1.3cm" y="%s">[[ company.partner_id.city or '' ]] - [[ company.partner_id.country_id and company.partner_id.country_id.name or '']]</drawString> <drawString x="1.3cm" y="%s">Phone:</drawString> - <drawRightString x="7cm" y="%s">[[ company.partner_id.address and company.partner_id.address[0].phone or '' ]]</drawRightString> + <drawRightString x="7cm" y="%s">[[ company.partner_id.phone or '' ]]</drawRightString> <drawString x="1.3cm" y="%s">Mail:</drawString> - <drawRightString x="7cm" y="%s">[[ company.partner_id.address and company.partner_id.address[0].email or '' ]]</drawRightString> + <drawRightString x="7cm" y="%s">[[ company.partner_id.email or '' ]]</drawRightString> <lines>1.3cm %s 7cm %s</lines> <!--page bottom--> diff --git a/openerp/addons/base/res/res_country.py b/openerp/addons/base/res/res_country.py index c32302a0783..32980428068 100644 --- a/openerp/addons/base/res/res_country.py +++ b/openerp/addons/base/res/res_country.py @@ -63,7 +63,7 @@ addresses belonging to this country.\n\nYou can use the python-style string pate 'The code of the country must be unique !') ] _defaults = { - 'address_format': "%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s\n%(country_name)s", + 'address_format': "%(company_name)s\n%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s\n%(country_name)s", } _order='name' diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 9c98521e86c..6f04c3483cd 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -19,12 +19,13 @@ # ############################################################################## +import os import math - -from osv import fields,osv +from osv import osv, fields import tools -import pooler from tools.translate import _ +import logging +import pooler class res_payterm(osv.osv): _description = 'Payment term' @@ -33,7 +34,6 @@ class res_payterm(osv.osv): _columns = { 'name': fields.char('Payment Term (short name)', size=64), } -res_payterm() class res_partner_category(osv.osv): @@ -45,7 +45,7 @@ class res_partner_category(osv.osv): used to select the short version of the category name (without the direct parent), when set to ``'short'``. The default is - the long version.""" + the long version.""" if context is None: context = {} if context.get('partner_category_display') == 'short': @@ -98,7 +98,6 @@ class res_partner_category(osv.osv): _parent_store = True _parent_order = 'name' _order = 'parent_left' -res_partner_category() class res_partner_title(osv.osv): _name = 'res.partner.title' @@ -108,33 +107,41 @@ class res_partner_title(osv.osv): 'domain': fields.selection([('partner','Partner'),('contact','Contact')], 'Domain', required=True, size=24) } _order = 'name' -res_partner_title() def _lang_get(self, cr, uid, context=None): - obj = self.pool.get('res.lang') - ids = obj.search(cr, uid, [], context=context) - res = obj.read(cr, uid, ids, ['code', 'name'], context) + lang_pool = self.pool.get('res.lang') + ids = lang_pool.search(cr, uid, [], context=context) + res = lang_pool.read(cr, uid, ids, ['code', 'name'], context) return [(r['code'], r['name']) for r in res] + [('','')] +POSTAL_ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id') +ADDRESS_FIELDS = POSTAL_ADDRESS_FIELDS + ('email', 'phone', 'fax', 'mobile', 'website', 'ref', 'lang') class res_partner(osv.osv): _description='Partner' _name = "res.partner" + + def _address_display(self, cr, uid, ids, name, args, context=None): + res={} + for partner in self.browse(cr, uid, ids, context=context): + res[partner.id] =self._display_address(cr, uid, partner, context=context) + return res + _order = "name" _columns = { 'name': fields.char('Name', size=128, required=True, select=True), 'date': fields.date('Date', select=1), - 'title': fields.many2one('res.partner.title','Partner Firm'), + 'title': fields.many2one('res.partner.title','Title'), 'parent_id': fields.many2one('res.partner','Parent Partner'), - 'child_ids': fields.one2many('res.partner', 'parent_id', 'Partner Ref.'), + 'child_ids': fields.one2many('res.partner', 'parent_id', 'Contacts'), 'ref': fields.char('Reference', size=64, select=1), 'lang': fields.selection(_lang_get, 'Language', help="If the selected language is loaded in the system, all documents related to this partner will be printed in this language. If not, it will be english."), 'user_id': fields.many2one('res.users', 'Salesman', help='The internal user that is in charge of communicating with this partner if any.'), 'vat': fields.char('VAT',size=32 ,help="Value Added Tax number. Check the box if the partner is subjected to the VAT. Used by the VAT legal statement."), 'bank_ids': fields.one2many('res.partner.bank', 'partner_id', 'Banks'), - 'website': fields.char('Website',size=64, help="Website of Partner."), + 'website': fields.char('Website',size=64, help="Website of Partner or Company"), 'comment': fields.text('Notes'), - 'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'), + 'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'), # should be removed in version 7, but kept until then for backward compatibility 'category_id': fields.many2many('res.partner.category', 'res_partner_category_rel', 'partner_id', 'category_id', 'Categories'), 'events': fields.one2many('res.partner.event', 'partner_id', 'Events'), 'credit_limit': fields.float(string='Credit Limit'), @@ -142,41 +149,84 @@ class res_partner(osv.osv): 'active': fields.boolean('Active'), 'customer': fields.boolean('Customer', help="Check this box if the partner is a customer."), 'supplier': fields.boolean('Supplier', help="Check this box if the partner is a supplier. If it's not checked, purchase people will not see it when encoding a purchase order."), - 'city': fields.related('address', 'city', type='char', string='City'), - 'function': fields.related('address', 'function', type='char', string='function'), - 'subname': fields.related('address', 'name', type='char', string='Contact Name'), - 'phone': fields.related('address', 'phone', type='char', string='Phone'), - 'mobile': fields.related('address', 'mobile', type='char', string='Mobile'), - 'country': fields.related('address', 'country_id', type='many2one', relation='res.country', string='Country'), 'employee': fields.boolean('Employee', help="Check this box if the partner is an Employee."), - 'email': fields.related('address', 'email', type='char', size=240, string='E-mail'), + 'function': fields.char('Function', size=128), + 'type': fields.selection( [('default','Default'),('invoice','Invoice'), + ('delivery','Delivery'), ('contact','Contact'), + ('other','Other')], + 'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."), + 'street': fields.char('Street', size=128), + 'street2': fields.char('Street2', size=128), + 'zip': fields.char('Zip', change_default=True, size=24), + 'city': fields.char('City', size=128), + 'state_id': fields.many2one("res.country.state", 'Fed. State', domain="[('country_id','=',country_id)]"), + 'country_id': fields.many2one('res.country', 'Country'), + 'country': fields.related('country_id', type='many2one', relation='res.country', string='Country'), # for backward compatibility + 'email': fields.char('E-Mail', size=240), + 'phone': fields.char('Phone', size=64), + 'fax': fields.char('Fax', size=64), + 'mobile': fields.char('Mobile', size=64), + 'birthdate': fields.char('Birthdate', size=64), + 'is_company': fields.boolean('Company', help="Check if the contact is a company, otherwise it is a person"), + 'use_parent_address': fields.boolean('Use Company Address', help="Select this if you want to set company's address information for this contact"), + 'photo': fields.binary('Photo'), 'company_id': fields.many2one('res.company', 'Company', select=1), 'color': fields.integer('Color Index'), + 'contact_address': fields.function(_address_display, type='char', string='Complete Address'), } + def _default_category(self, cr, uid, context=None): if context is None: context = {} - if 'category_id' in context and context['category_id']: + if context.get('category_id'): return [context['category_id']] - return [] + return False + + def _get_photo(self, cr, uid, is_company, context=None): + if is_company: + path = os.path.join( tools.config['root_path'], 'addons', 'base', 'res', 'company_icon.png') + else: + path = os.path.join( tools.config['root_path'], 'addons', 'base', 'res', 'photo.png') + return open(path, 'rb').read().encode('base64') _defaults = { - 'active': lambda *a: 1, - 'customer': lambda *a: 1, + 'active': True, + 'customer': True, 'category_id': _default_category, 'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'res.partner', context=c), 'color': 0, + 'is_company': False, + 'type': 'default', + 'use_parent_address': True, + 'photo': lambda self, cr, uid, context: self._get_photo(cr, uid, False, context), } def copy(self, cr, uid, id, default=None, context=None): if default is None: default = {} name = self.read(cr, uid, [id], ['name'], context)[0]['name'] - default.update({'name': name+ _(' (copy)'), 'events':[]}) + default.update({'name': _('%s (copy)')%(name), 'events':[]}) return super(res_partner, self).copy(cr, uid, id, default, context) - def do_share(self, cr, uid, ids, *args): - return True + def onchange_type(self, cr, uid, ids, is_company, context=None): + value = {'title': False, + 'photo': self._get_photo(cr, uid, is_company, context)} + if is_company: + value['parent_id'] = False + domain = {'title': [('domain', '=', 'partner')]} + else: + domain = {'title': [('domain', '=', 'contact')]} + return {'value': value, 'domain': domain} + + def onchange_address(self, cr, uid, ids, use_parent_address, parent_id, context=None): + def value_or_id(val): + """ return val or val.id if val is a browse record """ + return val if isinstance(val, (bool, int, long, float, basestring)) else val.id + + if use_parent_address and parent_id: + parent = self.browse(cr, uid, parent_id, context=context) + return {'value': dict((key, value_or_id(parent[key])) for key in ADDRESS_FIELDS)} + return {} def _check_ean_key(self, cr, uid, ids, context=None): for partner_o in pooler.get_pool(cr.dbname).get('res.partner').read(cr, uid, ids, ['ean13',]): @@ -196,6 +246,43 @@ class res_partner(osv.osv): # _constraints = [(_check_ean_key, 'Error: Invalid ean code', ['ean13'])] + def write(self, cr, uid, ids, vals, context=None): + # Update parent and siblings or children records + if isinstance(ids, (int, long)): + ids = [ids] + if vals.get('is_company')==False: + vals.update({'child_ids' : [(5,)]}) + for partner in self.browse(cr, uid, ids, context=context): + update_ids = [] + if partner.is_company: + domain_children = [('parent_id', '=', partner.id), ('use_parent_address', '=', True)] + update_ids = self.search(cr, uid, domain_children, context=context) + elif partner.parent_id: + if vals.get('use_parent_address')==True: + domain_siblings = [('parent_id', '=', partner.parent_id.id), ('use_parent_address', '=', True)] + update_ids = [partner.parent_id.id] + self.search(cr, uid, domain_siblings, context=context) + if 'use_parent_address' not in vals and partner.use_parent_address: + domain_siblings = [('parent_id', '=', partner.parent_id.id), ('use_parent_address', '=', True)] + update_ids = [partner.parent_id.id] + self.search(cr, uid, domain_siblings, context=context) + self.update_address(cr, uid, update_ids, vals, context) + return super(res_partner,self).write(cr, uid, ids, vals, context=context) + + def create(self, cr, uid, vals, context=None): + if context is None: + context={} + # Update parent and siblings records + if vals.get('parent_id') and vals.get('use_parent_address'): + domain_siblings = [('parent_id', '=', vals['parent_id']), ('use_parent_address', '=', True)] + update_ids = [vals['parent_id']] + self.search(cr, uid, domain_siblings, context=context) + self.update_address(cr, uid, update_ids, vals, context) + if 'photo' not in vals : + vals['photo'] = self._get_photo(cr, uid, vals.get('is_company', False) or context.get('default_is_company'), context) + return super(res_partner,self).create(cr, uid, vals, context=context) + + def update_address(self, cr, uid, ids, vals, context=None): + addr_vals = dict((key, vals[key]) for key in POSTAL_ADDRESS_FIELDS if vals.get(key)) + return super(res_partner, self).write(cr, uid, ids, addr_vals, context) + def name_get(self, cr, uid, ids, context=None): if context is None: context = {} @@ -205,16 +292,28 @@ class res_partner(osv.osv): rec_name = 'ref' else: rec_name = 'name' - - res = [(r['id'], r[rec_name]) for r in self.read(cr, uid, ids, [rec_name], context)] + reads = self.read(cr, uid, ids, [rec_name,'parent_id'], context=context) + res = [] + for record in reads: + name = record.get('name', '/') + if record['parent_id']: + name = "%s (%s)"%(name, record['parent_id'][1]) + res.append((record['id'], name)) return res def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100): if not args: args = [] - # short-circuit ref match when possible if name and operator in ('=', 'ilike', '=ilike', 'like'): - ids = self.search(cr, uid, [('ref', '=', name)] + args, limit=limit, context=context) + # search on the name of the contacts and of its company + name2 = operator == '=' and name or '%' + name + '%' + cr.execute('''SELECT partner.id FROM res_partner partner + LEFT JOIN res_partner company ON partner.parent_id = company.id + WHERE partner.name || ' (' || COALESCE(company.name,'') || ')' + ''' + operator + ''' %s ''', (name2,)) + ids = map(lambda x: x[0], cr.fetchall()) + if args: + ids = self.search(cr, uid, [('id', 'in', ids)] + args, limit=limit, context=context) if ids: return self.name_get(cr, uid, ids, context) return super(res_partner,self).name_search(cr, uid, name, args, operator=operator, context=context, limit=limit) @@ -222,9 +321,8 @@ class res_partner(osv.osv): def _email_send(self, cr, uid, ids, email_from, subject, body, on_error=None): partners = self.browse(cr, uid, ids) for partner in partners: - if len(partner.address): - if partner.address[0].email: - tools.email_send(email_from, [partner.address[0].email], subject, body, on_error) + if partner.email: + tools.email_send(email_from, [partner.email], subject, body, on_error) return True def email_send(self, cr, uid, ids, email_from, subject, body, on_error=''): @@ -232,7 +330,6 @@ class res_partner(osv.osv): self.pool.get('ir.cron').create(cr, uid, { 'name': 'Send Partner Emails', 'user_id': uid, -# 'nextcall': False, 'model': 'res.partner', 'function': '_email_send', 'args': repr([ids[:16], email_from, subject, body, on_error]) @@ -243,20 +340,22 @@ class res_partner(osv.osv): def address_get(self, cr, uid, ids, adr_pref=None): if adr_pref is None: adr_pref = ['default'] - address_obj = self.pool.get('res.partner.address') - address_ids = address_obj.search(cr, uid, [('partner_id', 'in', ids)]) - address_rec = address_obj.read(cr, uid, address_ids, ['type']) - res = list((addr['type'],addr['id']) for addr in address_rec) - adr = dict(res) + result = {} + # retrieve addresses from the partner itself and its children + res = [] + # need to fix the ids ,It get False value in list like ids[False] + if ids and ids[0]!=False: + for p in self.browse(cr, uid, ids): + res.append((p.type, p.id)) + res.extend((c.type, c.id) for c in p.child_ids) + address_dict = dict(reversed(res)) # get the id of the (first) default address if there is one, # otherwise get the id of the first address in the list + default_address = False if res: - default_address = adr.get('default', res[0][1]) - else: - default_address = False - result = {} - for a in adr_pref: - result[a] = adr.get(a, default_address) + default_address = address_dict.get('default', res[0][1]) + for adr in adr_pref: + result[adr] = address_dict.get(adr, default_address) return result def gen_next_ref(self, cr, uid, ids): @@ -282,23 +381,55 @@ class res_partner(osv.osv): if (not context.get('category_id', False)): return False return _('Partners: ')+self.pool.get('res.partner.category').browse(cr, uid, context['category_id'], context).name + def main_partner(self, cr, uid): ''' Return the id of the main partner ''' model_data = self.pool.get('ir.model.data') - return model_data.browse( - cr, uid, - model_data.search(cr, uid, [('module','=','base'), - ('name','=','main_partner')])[0], - ).res_id -res_partner() + return model_data.browse(cr, uid, + model_data.search(cr, uid, [('module','=','base'), + ('name','=','main_partner')])[0], + ).res_id + def _display_address(self, cr, uid, address, context=None): + + ''' + The purpose of this function is to build and return an address formatted accordingly to the + standards of the country where it belongs. + + :param address: browse record of the res.partner.address to format + :returns: the address formatted in a display that fit its country habits (or the default ones + if not country is specified) + :rtype: string + ''' + + # get the information that will be injected into the display format + # get the address format + address_format = address.country_id and address.country_id.address_format or \ + '%(company_name)s\n%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s' + args = { + 'state_code': address.state_id and address.state_id.code or '', + 'state_name': address.state_id and address.state_id.name or '', + 'country_code': address.country_id and address.country_id.code or '', + 'country_name': address.country_id and address.country_id.name or '', + 'company_name': address.parent_id and address.parent_id.name or '', + } + address_field = ['title', 'street', 'street2', 'zip', 'city'] + for field in address_field : + args[field] = getattr(address, field) or '' + + return address_format % args + + + +# res.partner.address is deprecated; it is still there for backward compability only and will be removed in next version class res_partner_address(osv.osv): - _description ='Partner Addresses' + _table = "res_partner" _name = 'res.partner.address' _order = 'type, name' _columns = { - 'partner_id': fields.many2one('res.partner', 'Partner Name', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."), + 'parent_id': fields.many2one('res.partner', 'Company', ondelete='set null', select=True), + 'partner_id': fields.related('parent_id', type='many2one', relation='res.partner', string='Partner'), # for backward compatibility 'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."), 'function': fields.char('Function', size=128), 'title': fields.many2one('res.partner.title','Title'), @@ -317,97 +448,29 @@ class res_partner_address(osv.osv): 'is_customer_add': fields.related('partner_id', 'customer', type='boolean', string='Customer'), 'is_supplier_add': fields.related('partner_id', 'supplier', type='boolean', string='Supplier'), 'active': fields.boolean('Active', help="Uncheck the active field to hide the contact."), -# 'company_id': fields.related('partner_id','company_id',type='many2one',relation='res.company',string='Company', store=True), 'company_id': fields.many2one('res.company', 'Company',select=1), 'color': fields.integer('Color Index'), } + _defaults = { - 'active': lambda *a: 1, - 'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'res.partner.address', context=c), + 'active': True, + 'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'res.partner', context=c), + 'color': 0, + 'type': 'default', } - def name_get(self, cr, user, ids, context=None): - if context is None: - context = {} - if not len(ids): - return [] - res = [] - for r in self.read(cr, user, ids, ['name','zip','country_id', 'city','partner_id', 'street']): - if context.get('contact_display', 'contact')=='partner' and r['partner_id']: - res.append((r['id'], r['partner_id'][1])) - else: - # make a comma-separated list with the following non-empty elements - elems = [r['name'], r['country_id'] and r['country_id'][1], r['city'], r['street']] - addr = ', '.join(filter(bool, elems)) - if (context.get('contact_display', 'contact')=='partner_address') and r['partner_id']: - res.append((r['id'], "%s: %s" % (r['partner_id'][1], addr or '/'))) - else: - res.append((r['id'], addr or '/')) - return res - def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): - if not args: - args = [] - if context is None: - context = {} - - if not name: - ids = self.search(cr, user, args, limit=limit, context=context) - elif context.get('contact_display', 'contact') == 'partner': - ids = self.search(cr, user, [('partner_id', operator, name)] + args, limit=limit, context=context) - else: - # first lookup zip code, as it is a common and efficient way to search on these data - ids = self.search(cr, user, [('zip', '=', name)] + args, limit=limit, context=context) - # then search on other fields: - if context.get('contact_display', 'contact') == 'partner_address': - fields = ['partner_id', 'name', 'country_id', 'city', 'street'] - else: - fields = ['name', 'country_id', 'city', 'street'] - # Here we have to search the records that satisfy the domain: - # OR([[(f, operator, name)] for f in fields])) + args - # Searching on such a domain can be dramatically inefficient, due to the expansion made - # for field translations, and the handling of the disjunction by the DB engine itself. - # So instead, we search field by field until the search limit is reached. - while len(ids) < limit and fields: - f = fields.pop(0) - new_ids = self.search(cr, user, [(f, operator, name)] + args, limit=limit, context=context) - # extend ids with the ones in new_ids that are not in ids yet (and keep order) - old_ids = set(ids) - ids.extend([id for id in new_ids if id not in old_ids]) - - ids = ids[:limit] - return self.name_get(cr, user, ids, context=context) - - def get_city(self, cr, uid, id): - return self.browse(cr, uid, id).city - - def _display_address(self, cr, uid, address, context=None): - ''' - The purpose of this function is to build and return an address formatted accordingly to the - standards of the country where it belongs. - - :param address: browse record of the res.partner.address to format - :returns: the address formatted in a display that fit its country habits (or the default ones - if not country is specified) - :rtype: string - ''' - # get the address format - address_format = address.country_id and address.country_id.address_format or \ - '%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s' - # get the information that will be injected into the display format - args = { - 'state_code': address.state_id and address.state_id.code or '', - 'state_name': address.state_id and address.state_id.name or '', - 'country_code': address.country_id and address.country_id.code or '', - 'country_name': address.country_id and address.country_id.name or '', - } - address_field = ['title', 'street', 'street2', 'zip', 'city'] - for field in address_field : - args[field] = getattr(address, field) or '' - - return address_format % args - -res_partner_address() + def write(self, cr, uid, ids, vals, context=None): + logging.getLogger('res.partner').warning("Deprecated use of res.partner.address") + if 'partner_id' in vals: + vals['parent_id'] = vals.get('partner_id') + del(vals['partner_id']) + return self.pool.get('res.partner').write(cr, uid, ids, vals, context=context) + def create(self, cr, uid, vals, context=None): + logging.getLogger('res.partner').warning("Deprecated use of res.partner.address") + if 'partner_id' in vals: + vals['parent_id'] = vals.get('partner_id') + del(vals['partner_id']) + return self.pool.get('res.partner').create(cr, uid, vals, context=context) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index d38a6a68511..441b64a66fd 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -64,25 +64,22 @@ <!-- Resource: res.partner.category for training --> - <record id="res_partner_category_consumers0" model="res.partner.category"> - <field name="name">Consumers</field> + <record id="res_partner_category_consumers0" model="res.partner.category"> + <field name="name">Consumers</field> <field name="parent_id" ref="res_partner_category_0"/> - </record> - <record id="res_partner_category_retailers0" model="res.partner.category"> - <field name="name">Retailers</field> + </record> + <record id="res_partner_category_retailers0" model="res.partner.category"> + <field name="name">Retailers</field> <field name="parent_id" ref="res_partner_category_0"/> - </record> - - <record id="res_partner_category_miscellaneoussuppliers0" model="res.partner.category"> - <field name="name">Miscellaneous Suppliers</field> + </record> + <record id="res_partner_category_miscellaneoussuppliers0" model="res.partner.category"> + <field name="name">Miscellaneous Suppliers</field> <field name="parent_id" ref="res_partner_category_8"/> - </record> - - - <record id="res_partner_category_woodsuppliers0" model="res.partner.category"> - <field name="name">Wood Suppliers</field> + </record> + <record id="res_partner_category_woodsuppliers0" model="res.partner.category"> + <field name="name">Wood Suppliers</field> <field name="parent_id" ref="res_partner_category_8"/> - </record> + </record> <!-- Resource: res.partner @@ -93,53 +90,110 @@ <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> <field name="supplier">1</field> <field eval="0" name="customer"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Taiwan</field> + <field name="zip">23410</field> + <field model="res.country" name="country_id" search="[('name','=','Taiwan')]"/> + <field name="street">31 Hong Kong street</field> + <field name="email">info@asustek.com</field> + <field name="phone">+ 1 64 61 04 01</field> <field name="website">www.asustek.com</field> </record> <record id="res_partner_agrolait" model="res.partner"> <field name="name">Agrolait</field> <field eval="[(6, 0, [ref('base.res_partner_category_0')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Wavre</field> + <field name="zip">5478</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="street">69 rue de Chimay</field> + <field name="email">s.l@agrolait.be</field> + <field name="phone">003281588558</field> <field name="website">www.agrolait.com</field> </record> <record id="res_partner_c2c" model="res.partner"> <field name="name">Camptocamp</field> <field eval="[(6, 0, [ref('res_partner_category_10'), ref('res_partner_category_5')])]" name="category_id"/> <field name="supplier">1</field> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Le Bourget du Lac</field> + <field name="zip">73377</field> + <field name="phone">+41 21 619 10 04 </field> + <field model="res.country" name="country_id" search="[('name','=','France')]"/> + <field name="street">Savoie Technolac, BP 352</field> + <field name="email">openerp@camptocamp.com</field> <field name="website">www.camptocamp.com</field> </record> <record id="res_partner_sednacom" model="res.partner"> <field name="website">www.syleam.fr</field> <field name="name">Syleam</field> <field eval="[(6, 0, [ref('res_partner_category_5')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="city">Alencon</field> + <field name="zip">61000</field> + <field name="email">contact@syleam.fr</field> + <field name="street">1 place de l'Église</field> + <field name="phone">+33 (0) 2 33 31 22 10</field> + <field model="res.country" name="country_id" search="[('name','=','France')]"/> + <field name="is_company">1</field> </record> <record id="res_partner_thymbra" model="res.partner"> <field name="name">SmartBusiness</field> + <field name="is_company">1</field> + <field name="city">Buenos Aires</field> + <field name="zip">1659</field> + <field name="email">contact@smartbusiness.ar</field> + <field name="street">Palermo, Capital Federal </field> + <field name="street2">C1414CMS Capital Federal </field> + <field name="phone">(5411) 4773-9666 </field> + <field model="res.country" name="country_id" search="[('name','=','Argentina')]"/> <field eval="[(6, 0, [ref('res_partner_category_4')])]" name="category_id"/> </record> <record id="res_partner_desertic_hispafuentes" model="res.partner"> <field name="name">Axelor</field> <field eval="[(6, 0, [ref('res_partner_category_4')])]" name="category_id"/> <field name="supplier">1</field> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Champs sur Marne</field> + <field name="zip">77420</field> + <field model="res.country" name="country_id" search="[('name','=','France')]"/> + <field name="email">info@axelor.com</field> + <field name="phone">+33 1 64 61 04 01</field> + <field name="street">12 rue Albert Einstein</field> <field name="website">www.axelor.com/</field> </record> <record id="res_partner_tinyatwork" model="res.partner"> <field name="name">Tiny AT Work</field> + <field name="is_company">1</field> <field eval="[(6, 0, [ref('res_partner_category_5'), ref('res_partner_category_10')])]" name="category_id"/> + <field name="city">Boston</field> + <field name="zip">5501</field> + <field name="email">info@tinyatwork.com</field> + <field name="phone">+33 (0) 2 33 31 22 10</field> + <field model="res.country" name="country_id" search="[('name','=','United States')]"/> + <field name="street">One Lincoln Street</field> <field name="website">www.tinyatwork.com/</field> </record> <record id="res_partner_2" model="res.partner"> <field name="name">Bank Wealthy and sons</field> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Paris</field> + <field name="zip">75016</field> + <field model="res.country" name="country_id" search="[('name','=','France')]"/> + <field name="street">1 rue Rockfeller</field> + <field name="email">a.g@wealthyandsons.com</field> + <field name="phone">003368978776</field> <field name="website">www.wealthyandsons.com/</field> </record> <record id="res_partner_3" model="res.partner"> <field name="name">China Export</field> <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Shanghai</field> + <field name="zip">478552</field> + <field model="res.country" name="country_id" search="[('name','=','China')]"/> + <field name="street">52 Chop Suey street</field> + <field name="email">zen@chinaexport.com</field> + <field name="phone">+86-751-64845671</field> <field name="website">www.chinaexport.com/</field> </record> <record id="res_partner_4" model="res.partner"> @@ -147,13 +201,25 @@ <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> <field name="supplier">1</field> <field eval="0" name="customer"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Namur</field> + <field name="zip">2541</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="street">42 rue de la Lesse</field> + <field name="email">info@distribpc.com</field> + <field name="phone">+ 32 081256987</field> <field name="website">www.distribpc.com/</field> </record> <record id="res_partner_5" model="res.partner"> <field name="name">Ecole de Commerce de Liege</field> <field eval="[(6, 0, [ref('res_partner_category_1')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Liege</field> + <field name="zip">6985</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="street">2 Impasse de la Soif</field> + <field name="email">k.lesbrouffe@eci-liege.info</field> + <field name="phone">+32 421 52571</field> <field name="website">www.eci-liege.info//</field> </record> <record id="res_partner_6" model="res.partner"> @@ -161,7 +227,13 @@ <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> <field name="supplier">1</field> <field eval="0" name="customer"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Brussels</field> + <field name="zip">2365</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="street">23 rue du Vieux Bruges</field> + <field name="email">info@elecimport.com</field> + <field name="phone">+ 32 025 897 456</field> </record> <record id="res_partner_maxtor" model="res.partner"> <field name="name">Maxtor</field> @@ -169,20 +241,37 @@ <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> <field name="supplier">1</field> <field eval="0" name="customer"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Hong Kong</field> + <field name="zip">23540</field> + <field model="res.country" name="country_id" search="[('name','=','China')]"/> + <field name="street">56 Beijing street</field> + <field name="email">info@maxtor.com</field> + <field name="phone">+ 11 8528 456 789</field> </record> <record id="res_partner_seagate" model="res.partner"> <field name="name">Seagate</field> <field eval="5000.00" name="credit_limit"/> <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> <field name="supplier">1</field> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Cupertino</field> + <field name="zip">95014</field> + <field model="res.country" name="country_id" search="[('name','=','United States')]"/> + <field name="street">10200 S. De Anza Blvd</field> + <field name="email">info@seagate.com</field> + <field name="phone">+1 408 256987</field> </record> <record id="res_partner_8" model="res.partner"> <field name="website">http://mediapole.net</field> <field name="name">Mediapole SPRL</field> <field eval="[(6, 0, [ref('res_partner_category_1')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Louvain-la-Neuve</field> + <field name="zip">1348</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="phone">(+32).10.45.17.73</field> + <field name="street">Rue de l'Angelique, 1</field> </record> <record id="res_partner_9" model="res.partner"> <field name="website">www.balmerinc.com</field> @@ -190,40 +279,73 @@ <field eval="12000.00" name="credit_limit"/> <field name="ref">or</field> <field eval="[(6, 0, [ref('res_partner_category_1')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Bruxelles</field> + <field name="zip">1000</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="email">info@balmerinc.be</field> + <field name="phone">(+32)2 211 34 83</field> + <field name="street">Rue des Palais 51, bte 33</field> </record> <record id="res_partner_10" model="res.partner"> <field name="name">Tecsas</field> <field name="ean13">3020170000003</field> <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="city">Avignon CEDEX 09</field> + <field name="zip">84911</field> + <field model="res.country" name="country_id" search="[('name','=','France')]"/> + <field name="email">contact@tecsas.fr</field> + <field name="phone">(+33)4.32.74.10.57</field> + <field name="street">85 rue du traite de Rome</field> </record> <record id="res_partner_11" model="res.partner"> <field name="name">Leclerc</field> <field eval="1200.00" name="credit_limit"/> <field eval="[(6, 0, [ref('res_partner_category_0')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="street">rue Grande</field> + <field name="city">Brest</field> + <field name="zip">29200</field> + <field name="email">marine@leclerc.fr</field> + <field name="phone">+33-298.334558</field> </record> <record id="res_partner_14" model="res.partner"> <field name="name">Centrale d'achats BML</field> <field name="ean13">3020178572427</field> <field eval="15000.00" name="credit_limit"/> - <field name="parent_id" ref="res_partner_10"/> <field eval="[(6, 0, [ref('res_partner_category_11')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="name">Carl François</field> + <field name="city">Bruxelles</field> + <field name="zip">1000</field> + <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> + <field name="street">89 Chaussée de Waterloo</field> + <field name="email">carl.françois@bml.be</field> + <field name="phone">+32-258-256545</field> </record> <record id="res_partner_15" model="res.partner"> <field name="name">Magazin BML 1</field> <field name="ean13">3020178570171</field> - <field name="parent_id" ref="res_partner_14"/> <field eval="1500.00" name="credit_limit"/> <field eval="[(6, 0, [ref('res_partner_category_11')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="street">89 Chaussée de Liège</field> + <field name="city">Namur</field> + <field name="zip">5000</field> + <field name="email">lucien.ferguson@bml.be</field> + <field name="phone">+32-621-568978</field> </record> <record id="res_partner_accent" model="res.partner"> <field name="name">Université de Liège</field> <field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field name="type">default</field> + <field name="street">Place du 20Août</field> + <field name="city">Liège</field> + <field name="zip">4000</field> + <field name="email">martine.ohio@ulg.ac.be</field> + <field name="phone">+32-45895245</field> <field name="website">http://www.ulg.ac.be/</field> </record> @@ -234,35 +356,57 @@ <record id="res_partner_duboissprl0" model="res.partner"> <field eval="'Sprl Dubois would like to sell our bookshelves but they have no storage location, so it would be exclusively on order'" name="comment"/> <field name="name">Dubois sprl</field> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field eval="'Brussels'" name="city"/> + <field eval="'1000'" name="zip"/> + <field name="country_id" ref="base.be"/> + <field eval="'Avenue de la Liberté 56'" name="street"/> + <field eval="'m.dubois@dubois.be'" name="email"/> <field name="website">http://www.dubois.be/</field> </record> <record id="res_partner_ericdubois0" model="res.partner"> <field name="name">Eric Dubois</field> + <field name="is_company">1</field> <field name="address" eval="[]"/> + <field eval="'Mons'" name="city"/> + <field eval="'7000'" name="zip"/> + <field name="country_id" ref="base.be"/> + <field eval="'Chaussée de Binche, 27'" name="street"/> + <field eval="'e.dubois@gmail.com'" name="email"/> + <field eval="'(+32).758 958 789'" name="phone"/> </record> <record id="res_partner_fabiendupont0" model="res.partner"> <field name="name">Fabien Dupont</field> + <field name="is_company">1</field> <field name="address" eval="[]"/> + <field eval="'Namur'" name="city"/> + <field eval="'5000'" name="zip"/> + <field name="country_id" ref="base.be"/> + <field eval="'Blvd Kennedy, 13'" name="street"/> </record> <record id="res_partner_lucievonck0" model="res.partner"> <field name="name">Lucie Vonck</field> - <field name="address" eval="[]"/> + <field eval="'Grand-Rosière'" name="city"/> + <field eval="'1367'" name="zip"/> + <field name="country_id" ref="base.be"/> + <field eval="'Chaussée de Namur'" name="street"/> </record> - <record id="res_partner_notsotinysarl0" model="res.partner"> + <!--record id="res_partner_notsotinysarl0" model="res.partner"> <field name="name">NotSoTiny SARL</field> <field name="address" eval="[]"/> <field name="website">notsotiny.be</field> - </record> + </record--> <record id="res_partner_theshelvehouse0" model="res.partner"> <field name="name">The Shelve House</field> <field eval="[(6,0,[ref('res_partner_category_retailers0')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field eval="'Paris'" name="city"/> + <field name="country_id" ref="base.fr"/> </record> <record id="res_partner_vickingdirect0" model="res.partner"> @@ -270,7 +414,13 @@ <field eval="[(6,0,[ref('res_partner_category_miscellaneoussuppliers0')])]" name="category_id"/> <field name="supplier">1</field> <field name="customer">0</field> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field eval="'Puurs'" name="city"/> + <field eval="'2870'" name="zip"/> + <field name="country_id" ref="base.be"/> + <field eval="'(+32).70.12.85.00'" name="phone"/> + <field eval="'Schoonmansveld 28'" name="street"/> + <field name="country_id" ref="base.be"/> <field name="website">vicking-direct.be</field> </record> @@ -279,14 +429,19 @@ <field eval="[(6,0,[ref('res_partner_category_woodsuppliers0')])]" name="category_id"/> <field name="supplier">1</field> <field eval="0" name="customer"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field eval="'Kainuu'" name="city"/> + <field eval="'(+358).9.589 689'" name="phone"/> + <field name="country_id" ref="base.fi"/> <field name="website">woodywoodpecker.com</field> </record> <record id="res_partner_zerooneinc0" model="res.partner"> <field name="name">ZeroOne Inc</field> <field eval="[(6,0,[ref('res_partner_category_consumers0')])]" name="category_id"/> - <field name="address" eval="[]"/> + <field name="is_company">1</field> + <field eval="'Brussels'" name="city"/> + <field name="country_id" ref="base.be"/> <field name="website">http://www.zerooneinc.com/</field> </record> @@ -294,238 +449,256 @@ Resource: res.partner.address --> - <record id="res_partner_address_1" model="res.partner.address"> - <field name="city">Bruxelles</field> + <record id="res_partner_address_1" model="res.partner"> <field name="name">Michel Schumacher</field> + <field name="website">www.balmerinc.com</field> + <field name="ref">or</field> + <field name="city">Bruxelles</field> <field name="zip">1000</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="email">info@balmerinc.be</field> <field name="phone">(+32)2 211 34 83</field> <field name="street">Rue des Palais 51, bte 33</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_9"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_9"/> </record> - <record id="res_partner_address_2" model="res.partner.address"> - <field name="city">Avignon CEDEX 09</field> + <record id="res_partner_address_2" model="res.partner"> <field name="name">Laurent Jacot</field> + <field name="city">Avignon CEDEX 09</field> <field name="zip">84911</field> <field model="res.country" name="country_id" search="[('name','=','France')]"/> <field name="email">contact@tecsas.fr</field> <field name="phone">(+33)4.32.74.10.57</field> <field name="street">85 rue du traite de Rome</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_10"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_10"/> </record> - <record id="res_partner_address_3000" model="res.partner.address"> - <field name="city">Champs sur Marne</field> + <record id="res_partner_address_3000" model="res.partner"> <field name="name">Laith Jubair</field> + <field name="city">Champs sur Marne</field> <field name="zip">77420</field> <field model="res.country" name="country_id" search="[('name','=','France')]"/> <field name="email">info@axelor.com</field> <field name="phone">+33 1 64 61 04 01</field> <field name="street">12 rue Albert Einstein</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_desertic_hispafuentes"/> + <field name="website">www.axelor.com/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_desertic_hispafuentes"/> </record> - <record id="res_partner_address_3" model="res.partner.address"> - <field name="city">Louvain-la-Neuve</field> + <record id="res_partner_address_3" model="res.partner"> <field name="name">Thomas Passot</field> + <field name="website">http://mediapole.net</field> + <field name="city">Louvain-la-Neuve</field> <field name="zip">1348</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="phone">(+32).10.45.17.73</field> <field name="street">Rue de l'Angelique, 1</field> - <field name="partner_id" ref="res_partner_8"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_8"/> </record> - <record id="res_partner_address_tang" model="res.partner.address"> - <field name="city">Taiwan</field> + <record id="res_partner_address_tang" model="res.partner"> <field name="name">Tang</field> + <field name="city">Taiwan</field> <field name="zip">23410</field> <field model="res.country" name="country_id" search="[('name','=','Taiwan')]"/> <field name="street">31 Hong Kong street</field> <field name="email">info@asustek.com</field> <field name="phone">+ 1 64 61 04 01</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_asus"/> + <field name="website">www.asustek.com</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_asus"/> </record> - <record id="res_partner_address_wong" model="res.partner.address"> - <field name="city">Hong Kong</field> + <record id="res_partner_address_wong" model="res.partner"> <field name="name">Wong</field> + <field name="city">Hong Kong</field> <field name="zip">23540</field> <field model="res.country" name="country_id" search="[('name','=','China')]"/> <field name="street">56 Beijing street</field> <field name="email">info@maxtor.com</field> <field name="phone">+ 11 8528 456 789</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_maxtor"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_maxtor"/> </record> - <record id="res_partner_address_6" model="res.partner.address"> - <field name="city">Brussels</field> + <record id="res_partner_address_6" model="res.partner"> <field name="name">Etienne Lacarte</field> + <field name="city">Brussels</field> <field name="zip">2365</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">23 rue du Vieux Bruges</field> - <field name="type">default</field> <field name="email">info@elecimport.com</field> <field name="phone">+ 32 025 897 456</field> - <field name="partner_id" ref="res_partner_6"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_6"/> </record> - <record id="res_partner_address_7" model="res.partner.address"> - <field name="city">Namur</field> + <record id="res_partner_address_7" model="res.partner"> <field name="name">Jean Guy Lavente</field> + <field name="city">Namur</field> <field name="zip">2541</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">42 rue de la Lesse</field> - <field name="type">default</field> <field name="email">info@distribpc.com</field> <field name="phone">+ 32 081256987</field> - <field name="partner_id" ref="res_partner_4"/> + <field name="website">www.distribpc.com/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_4"/> </record> - <record id="res_partner_address_8" model="res.partner.address"> - <field name="city">Wavre</field> + <record id="res_partner_address_8" model="res.partner"> <field name="name">Sylvie Lelitre</field> + <field name="parent_id" ref="res_partner_agrolait"/> + <field name="city">Wavre</field> <field name="zip">5478</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">69 rue de Chimay</field> - <field name="type">default</field> - <field name="email">s.l@agrolait.be</field> - <field name="phone">003281588558</field> - <field name="partner_id" ref="res_partner_agrolait"/> + <field name="email">s.l@agrolait.be</field> + <field name="phone">003281588558</field> + <field name="website">www.agrolait.com</field> + <field name="use_parent_address" eval="1"/> <field name="title" ref="base.res_partner_title_madam"/> </record> - <record id="res_partner_address_8delivery" model="res.partner.address"> + <record id="res_partner_address_8delivery" model="res.partner"> <field name="city">Wavre</field> <field name="name">Paul Lelitre</field> <field name="zip">5478</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">71 rue de Chimay</field> <field name="type">delivery</field> - <field name="email">p.l@agrolait.be</field> - <field name="phone">003281588557</field> - <field name="partner_id" ref="res_partner_agrolait"/> + <field name="email">p.l@agrolait.be</field> + <field name="phone">003281588557</field> + <field name="use_parent_address" eval="0"/> + <field name="parent_id" ref="res_partner_agrolait"/> <field name="title" ref="base.res_partner_title_sir"/> </record> - <record id="res_partner_address_8invoice" model="res.partner.address"> + <record id="res_partner_address_8invoice" model="res.partner"> <field name="city">Wavre</field> <field name="name">Serge Lelitre</field> <field name="zip">5478</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">69 rue de Chimay</field> <field name="type">invoice</field> - <field name="email">serge.l@agrolait.be</field> - <field name="phone">003281588556</field> - <field name="partner_id" ref="res_partner_agrolait"/> + <field name="email">serge.l@agrolait.be</field> + <field name="phone">003281588556</field> + <field name="use_parent_address" eval="0"/> + <field name="parent_id" ref="res_partner_agrolait"/> <field name="title" ref="base.res_partner_title_sir"/> </record> - <record id="res_partner_address_9" model="res.partner.address"> - <field name="city">Paris</field> + <record id="res_partner_address_9" model="res.partner"> <field name="name">Arthur Grosbonnet</field> + <field name="parent_id" ref="res_partner_2"/> + <field name="city">Paris</field> <field name="zip">75016</field> <field model="res.country" name="country_id" search="[('name','=','France')]"/> <field name="street">1 rue Rockfeller</field> - <field name="type">default</field> - <field name="email">a.g@wealthyandsons.com</field> - <field name="phone">003368978776</field> - <field name="partner_id" ref="res_partner_2"/> + <field name="email">a.g@wealthyandsons.com</field> + <field name="phone">003368978776</field> + <field name="website">www.wealthyandsons.com/</field> + <field name="use_parent_address" eval="1"/> <field name="title" ref="base.res_partner_title_sir"/> </record> - <record id="res_partner_address_11" model="res.partner.address"> - <field name="city">Alencon</field> + <record id="res_partner_address_11" model="res.partner"> <field name="name">Sebastien LANGE</field> + <field name="website">www.syleam.fr</field> + <field name="city">Alencon</field> <field name="zip">61000</field> <field name="email">contact@syleam.fr</field> <field name="street">1 place de l'Église</field> <field name="phone">+33 (0) 2 33 31 22 10</field> <field model="res.country" name="country_id" search="[('name','=','France')]"/> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_sednacom"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_sednacom"/> </record> - <record id="res_partner_address_10" model="res.partner.address"> - <field name="city">Liege</field> + <record id="res_partner_address_10" model="res.partner"> <field name="name">Karine Lesbrouffe</field> + <field name="city">Liege</field> <field name="zip">6985</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">2 Impasse de la Soif</field> - <field name="email">k.lesbrouffe@eci-liege.info</field> - <field name="phone">+32 421 52571</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_5"/> + <field name="email">k.lesbrouffe@eci-liege.info</field> + <field name="phone">+32 421 52571</field> + <field name="website">www.eci-liege.info//</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_5"/> </record> - <record id="res_partner_address_zen" model="res.partner.address"> - <field name="city">Shanghai</field> + <record id="res_partner_address_zen" model="res.partner"> <field name="name">Zen</field> + <field name="city">Shanghai</field> <field name="zip">478552</field> <field model="res.country" name="country_id" search="[('name','=','China')]"/> <field name="street">52 Chop Suey street</field> - <field name="type">default</field> - <field name="email">zen@chinaexport.com</field> - <field name="phone">+86-751-64845671</field> - <field name="partner_id" ref="res_partner_3"/> + <field name="email">zen@chinaexport.com</field> + <field name="phone">+86-751-64845671</field> + <field name="website">www.chinaexport.com/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_3"/> </record> - <record id="res_partner_address_12" model="res.partner.address"> + <record id="res_partner_address_12" model="res.partner"> <field name="type">default</field> - <field name="city">Grenoble</field> + <field name="city">Grenoble</field> <field name="name">Loïc Dupont</field> <field name="zip">38100</field> <field model="res.country" name="country_id" search="[('name','=','China')]"/> <field name="street">Rue Lavoisier 145</field> <field name="type">default</field> - <field name="email">l.dupont@tecsas.fr</field> - <field name="phone">+33-658-256545</field> - <field name="partner_id" ref="res_partner_10"/> + <field name="email">l.dupont@tecsas.fr</field> + <field name="phone">+33-658-256545</field> + <field name="use_parent_address" eval="0"/> + <field name="parent_id" ref="res_partner_10"/> </record> - <record id="res_partner_address_13" model="res.partner.address"> - <field name="type">default</field> - <field name="name">Carl François</field> - <field name="city">Bruxelles</field> + <record id="res_partner_address_13" model="res.partner"> + <field name="name">Carl</field> + <field name="city">Bruxelles</field> <field name="zip">1000</field> <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/> <field name="street">89 Chaussée de Waterloo</field> - <field name="email">carl.françois@bml.be</field> - <field name="phone">+32-258-256545</field> - <field name="partner_id" ref="res_partner_14"/> + <field name="email">carl.françois@bml.be</field> + <field name="phone">+32-258-256545</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_14"/> </record> - <record id="res_partner_address_14" model="res.partner.address"> - <field name="type">default</field> + <record id="res_partner_address_14" model="res.partner"> <field name="name">Lucien Ferguson</field> <field name="street">89 Chaussée de Liège</field> - <field name="city">Namur</field> + <field name="city">Namur</field> <field name="zip">5000</field> - <field name="email">lucien.ferguson@bml.be</field> - <field name="phone">+32-621-568978</field> - <field name="partner_id" ref="res_partner_15"/> + <field name="email">lucien.ferguson@bml.be</field> + <field name="phone">+32-621-568978</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_15"/> </record> - <record id="res_partner_address_15" model="res.partner.address"> + <record id="res_partner_address_15" model="res.partner"> <field name="type">default</field> <field name="name">Marine Leclerc</field> <field name="street">rue Grande</field> - <field name="city">Brest</field> + <field name="city">Brest</field> <field name="zip">29200</field> - <field name="email">marine@leclerc.fr</field> - <field name="phone">+33-298.334558</field> - <field name="partner_id" ref="res_partner_11"/> + <field name="email">marine@leclerc.fr</field> + <field name="phone">+33-298.334558</field> + <field name="use_parent_address" eval="0"/> + <field name="parent_id" ref="res_partner_11"/> </record> - <record id="res_partner_address_16" model="res.partner.address"> + <record id="res_partner_address_16" model="res.partner"> <field name="type">invoice</field> <field name="name">Claude Leclerc</field> <field name="street">rue Grande</field> - <field name="city">Brest</field> + <field name="city">Brest</field> <field name="zip">29200</field> - <field name="email">claude@leclerc.fr</field> - <field name="phone">+33-298.334598</field> - <field name="partner_id" ref="res_partner_11"/> + <field name="email">claude@leclerc.fr</field> + <field name="phone">+33-298.334598</field> + <field name="use_parent_address" eval="0"/> + <field name="parent_id" ref="res_partner_11"/> </record> - <record id="res_partner_address_accent" model="res.partner.address"> - <field name="type">default</field> + <record id="res_partner_address_accent" model="res.partner"> <field name="name">Martine Ohio</field> <field name="street">Place du 20Août</field> - <field name="city">Liège</field> + <field name="city">Liège</field> <field name="zip">4000</field> - <field name="email">martine.ohio@ulg.ac.be</field> - <field name="phone">+32-45895245</field> - <field name="partner_id" ref="res_partner_accent"/> + <field name="email">martine.ohio@ulg.ac.be</field> + <field name="phone">+32-45895245</field> + <field name="website">http://www.ulg.ac.be/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_accent"/> </record> - <record id="res_partner_address_Camptocamp" model="res.partner.address"> + <record id="res_partner_address_Camptocamp" model="res.partner"> <field name="city">Lausanne</field> <field name="name">Luc Maurer</field> <field name="zip">1015</field> @@ -533,174 +706,191 @@ <field model="res.country" name="country_id" search="[('name','=','Switzerland')]"/> <field name="street">PSE-A, EPFL </field> <field name="type">default</field> - <field name="partner_id" ref="res_partner_c2c"/> + <field name="use_parent_address" eval="0"/> + <field name="parent_id" ref="res_partner_c2c"/> </record> - <record id="res_partner_address_seagate" model="res.partner.address"> - <field name="city">Cupertino</field> + <record id="res_partner_address_seagate" model="res.partner"> <field name="name">Seagate Technology</field> + <field name="city">Cupertino</field> <field name="zip">95014</field> <field model="res.country" name="country_id" search="[('name','=','United States')]"/> <field name="street">10200 S. De Anza Blvd</field> <field name="email">info@seagate.com</field> <field name="phone">+1 408 256987</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_seagate"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_seagate"/> </record> - <record id="res_partner_address_thymbra" model="res.partner.address"> - <field name="city">Buenos Aires</field> + <record id="res_partner_address_thymbra" model="res.partner"> <field name="name">Jack Daniels</field> + <field name="city">Buenos Aires</field> <field name="zip">1659</field> <field name="email">contact@smartbusiness.ar</field> <field name="street">Palermo, Capital Federal </field> <field name="street2">C1414CMS Capital Federal </field> <field name="phone">(5411) 4773-9666 </field> <field model="res.country" name="country_id" search="[('name','=','Argentina')]"/> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_thymbra"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_thymbra"/> </record> - <record id="res_partner_address_tinyatwork" model="res.partner.address"> - <field name="city">Boston</field> + <record id="res_partner_address_tinyatwork" model="res.partner"> <field name="name">Tiny Work</field> + <field name="city">Boston</field> <field name="zip">5501</field> <field name="email">info@tinyatwork.com</field> <field name="phone">+33 (0) 2 33 31 22 10</field> <field model="res.country" name="country_id" search="[('name','=','United States')]"/> <field name="street">One Lincoln Street</field> - <field name="type">default</field> - <field name="partner_id" ref="res_partner_tinyatwork"/> + <field name="website">www.tinyatwork.com/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_tinyatwork"/> </record> <!-- Resource: res.partner.address for Training --> - <record id="res_partner_address_notsotinysarl0" model="res.partner.address"> + <record id="res_partner_address_notsotinysarl0" model="res.partner"> <field eval="'Namur'" name="city"/> <field eval="'NotSoTiny SARL'" name="name"/> <field eval="'5000'" name="zip"/> - <field name="partner_id" ref="res_partner_notsotinysarl0"/> + <!--field name="parent_id" ref="res_partner_notsotinysarl0"/--> <field name="country_id" ref="base.be"/> + <field name="is_company">1</field> <field eval="'(+32).81.81.37.00'" name="phone"/> <field eval="'Rue du Nid 1'" name="street"/> <field eval="'default'" name="type"/> </record> - <record id="res_partner_address_henrychard0" model="res.partner.address"> + <!--record id="res_partner_address_henrychard0" model="res.partner"> <field eval="'Paris'" name="city"/> <field eval="'Henry Chard'" name="name"/> <field name="country_id" ref="base.fr"/> - </record> + </record--> - <record id="res_partner_address_geoff0" model="res.partner.address"> + <!--record id="res_partner_address_geoff0" model="res.partner"> <field eval="'Brussels'" name="city"/> <field eval="'Geoff'" name="name"/> <field name="country_id" ref="base.be"/> - </record> + </record--> - <record id="res_partner_address_rogerpecker0" model="res.partner.address"> + <!--record id="res_partner_address_rogerpecker0" model="res.partner"> <field eval="'Kainuu'" name="city"/> <field eval="'Roger Pecker'" name="name"/> <field name="country_id" ref="base.fi"/> - </record> + </record--> - <record id="res_partner_address_0" model="res.partner.address"> + <record id="res_partner_address_0" model="res.partner"> + <field name="name">Brus</field> <field eval="'Brussels'" name="city"/> <field name="country_id" ref="base.be"/> </record> - <record id="res_partner_address_henrychard1" model="res.partner.address"> - <field eval="'Paris'" name="city"/> + <record id="res_partner_address_henrychard1" model="res.partner"> <field eval="'Henry Chard'" name="name"/> - <field name="partner_id" ref="res_partner_theshelvehouse0"/> + <field eval="'Paris'" name="city"/> <field name="country_id" ref="base.fr"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_theshelvehouse0"/> </record> - <record id="res_partner_address_brussels0" model="res.partner.address"> - <field eval="'Brussels'" name="city"/> + <record id="res_partner_address_brussels0" model="res.partner"> <field eval="'Leen Vandenloep'" name="name"/> <field eval="'Puurs'" name="city"/> <field eval="'2870'" name="zip"/> <field name="country_id" ref="base.be"/> <field eval="'(+32).70.12.85.00'" name="phone"/> <field eval="'Schoonmansveld 28'" name="street"/> - <field name="partner_id" ref="res_partner_vickingdirect0"/> <field name="country_id" ref="base.be"/> + <field name="website">vicking-direct.be</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_vickingdirect0"/> </record> - <record id="res_partner_address_rogerpecker1" model="res.partner.address"> - <field eval="'Kainuu'" name="city"/> + <record id="res_partner_address_rogerpecker1" model="res.partner"> <field eval="'Roger Pecker'" name="name"/> - <field name="partner_id" ref="res_partner_woodywoodpecker0"/> + <field eval="'Kainuu'" name="city"/> <field eval="'(+358).9.589 689'" name="phone"/> <field name="country_id" ref="base.fi"/> + <field name="website">woodywoodpecker.com</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_woodywoodpecker0"/> </record> - <record id="res_partner_address_geoff1" model="res.partner.address"> - <field eval="'Brussels'" name="city"/> + <record id="res_partner_address_geoff1" model="res.partner"> <field eval="'Geoff'" name="name"/> - <field name="partner_id" ref="res_partner_zerooneinc0"/> + <field eval="'Brussels'" name="city"/> <field name="country_id" ref="base.be"/> + <field name="website">http://www.zerooneinc.com/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_zerooneinc0"/> </record> - <record id="res_partner_address_marcdubois0" model="res.partner.address"> - <field eval="'Brussels'" name="city"/> + <record id="res_partner_address_marcdubois0" model="res.partner"> <field eval="'Marc Dubois'" name="name"/> + <field eval="'Brussels'" name="city"/> <field eval="'1000'" name="zip"/> - <field name="partner_id" ref="res_partner_duboissprl0"/> <field name="country_id" ref="base.be"/> <field eval="'Avenue de la Liberté 56'" name="street"/> <field eval="'m.dubois@dubois.be'" name="email"/> + <field name="website">http://www.dubois.be/</field> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_duboissprl0"/> </record> - <record id="res_partner_address_fabiendupont0" model="res.partner.address"> + <record id="res_partner_address_fabiendupont0" model="res.partner"> + <field eval="'Frank'" name="name"/> <field eval="'Namur'" name="city"/> - <field eval="'Fabien Dupont'" name="name"/> <field eval="'5000'" name="zip"/> - <field name="partner_id" ref="res_partner_fabiendupont0"/> <field name="country_id" ref="base.be"/> <field eval="'Blvd Kennedy, 13'" name="street"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_fabiendupont0"/> </record> - <record id="res_partner_address_ericdubois0" model="res.partner.address"> + <record id="res_partner_address_ericdubois0" model="res.partner"> + <field eval="'Joy'" name="name"/> + <field name="address" eval="[]"/> <field eval="'Mons'" name="city"/> - <field eval="'Eric Dubois'" name="name"/> <field eval="'7000'" name="zip"/> - <field name="partner_id" ref="res_partner_ericdubois0"/> <field name="country_id" ref="base.be"/> <field eval="'Chaussée de Binche, 27'" name="street"/> <field eval="'e.dubois@gmail.com'" name="email"/> <field eval="'(+32).758 958 789'" name="phone"/> + <field name="use_parent_address" eval="1"/> + <field name="parent_id" ref="res_partner_ericdubois0"/> </record> - <record id="res_partner_address_notsotinysarl1" model="res.partner.address"> + <record id="res_partner_address_notsotinysarl1" model="res.partner"> <field eval="'Antwerpen'" name="city"/> + <field eval="'NotSoTiny'" name="name"/> <field eval="'2000'" name="zip"/> - <field name="partner_id" ref="res_partner_notsotinysarl0"/> + <field name="parent_id" ref="res_partner_address_notsotinysarl0"/> <field name="country_id" ref="base.be"/> + <field name="use_parent_address" eval="0"/> <field eval="'Antwerpsesteenweg 254'" name="street"/> <field eval="'invoice'" name="type"/> </record> - <record id="res_partner_address_4" model="res.partner.address"> + <!--record id="res_partner_address_4" model="res.partner"> <field eval="'Grand-Rosière'" name="city"/> <field eval="'1367'" name="zip"/> - <field name="partner_id" ref="res_partner_lucievonck0"/> + <field name="parent_id" ref="res_partner_lucievonck0"/> <field name="country_id" ref="base.be"/> <field eval="'Chaussée de Namur'" name="street"/> - </record> + </record--> <!-- diff --git a/openerp/addons/base/res/res_partner_report.xml b/openerp/addons/base/res/res_partner_report.xml index 06ea859d007..00a8713dd9d 100644 --- a/openerp/addons/base/res/res_partner_report.xml +++ b/openerp/addons/base/res/res_partner_report.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> - <report id="res_partner_address_report" model="res.partner" name="res.partner.address" string="Labels" xml="base/res/report/partner_address.xml" xsl="base/res/report/partner_address.xsl" groups="base.group_extended"/> + <report id="res_partner_address_report" model="res.partner" name="res.partner" string="Labels" xml="base/res/report/partner_address.xml" xsl="base/res/report/partner_address.xsl" groups="base.group_extended"/> <!-- <report string="Business Cards" model="res.partner" name="res.partner.businesscard" xml="base/res/report/business_card.xml" xsl="base/res/report/business_card.xsl"/> --> diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml index a2ca53aadf3..a55c8e49f65 100644 --- a/openerp/addons/base/res/res_partner_view.xml +++ b/openerp/addons/base/res/res_partner_view.xml @@ -202,6 +202,9 @@ <field name="view_id" ref="view_partner_address_form1"/> <field name="act_window_id" ref="action_partner_address_form"/> </record> + <!--menuitem action="action_partner_address_form" id="menu_partner_address_form" + groups="base.group_extended" name="Contacts" + parent="base.menu_address_book" sequence="30"/--> <!-- ========================================= @@ -310,14 +313,15 @@ <field name="type">tree</field> <field eval="8" name="priority"/> <field name="arch" type="xml"> - <tree string="Partners"> + <tree string="Contacts"> <field name="name"/> - <field name="ref" groups="base.group_extended"/> + <field name="function" invisible="1"/> <field name="phone"/> <field name="email"/> - <field name="city"/> - <field name="country"/> - <field name="user_id"/> + <field name="user_id" invisible="1"/> + <field name="is_company" invisible="1"/> + <field name="country" invisible="1"/> + <field name="country_id" invisible="1"/> </tree> </field> </record> @@ -327,76 +331,140 @@ <field name="model">res.partner</field> <field name="type">form</field> <field name="arch" type="xml"> - <form string="Partners" col='1'> - <group col="6" colspan="4"> - <group colspan="5" col="6"> - <field name="name" select="1"/> - <field name="ref" groups="base.group_extended"/> - <field domain="[('domain', '=', 'partner')]" name="title" size="0" groups="base.group_extended"/> - <field name="lang"/> + <form string="Partners"> + <group col="8" colspan="4"> + <group col="4" colspan="4"> + <field name="name" required="1"/> + <field name="title" size="0" groups="base.group_extended" domain="[('domain', '=', 'contact')]"/> + <newline/> + <field name="function" attrs="{'invisible': [('is_company', '=', True)]}" colspan="4"/> + <field name="parent_id" string="Company" colspan="4" attrs="{'invisible': [('is_company','=', True)]}" + domain="[('is_company', '=', True)]" context="{'default_is_company': True}" + on_change="onchange_address(use_parent_address, parent_id)"/> </group> - <group colspan="1" col="2"> - <field name="customer" select="1"/> + <group col="2"> + <field name="is_company" on_change="onchange_type(is_company)"/> + </group> + <group col="2"> + <field name="customer"/> <field name="supplier"/> -<!-- <field name="employee"/>--> + </group> + <group col="2"> + <field name="photo" widget='image' nolabel="1"/> </group> </group> <notebook colspan="4"> <page string="General"> - <field colspan="4" mode="form,tree" name="address" nolabel="1" select="1" height="260"> - <form string="Partner Contacts"> - <group colspan="4" col="6"> - <field name="name" string="Contact Name"/> - <field domain="[('domain', '=', 'contact')]" name="title" size="0"/> - <field name="function"/> + <group colspan="2"> + <separator string="Address" colspan="4"/> + <field name="type" string="Type" attrs="{'invisible': [('is_company','=', True)]}"/> + <group colspan="2"> + <field name="use_parent_address" attrs="{'invisible': [('parent_id', '=', False)]}" + on_change="onchange_address(use_parent_address, parent_id)"/> + </group> + <newline/> + <field name="street" colspan="4"/> + <field name="street2" colspan="4"/> + <field name="zip"/> + <field name="city"/> + <field name="country_id"/> + <field name="state_id"/> + </group> + <group colspan="2"> + <separator string="Communication" colspan="4"/> + <field name="lang" colspan="4"/> + <field name="phone" colspan="4"/> + <field name="mobile" colspan="4"/> + <field name="fax" colspan="4"/> + <field name="email" widget="email" colspan="4"/> + <field name="website" widget="url" colspan="4"/> + <field name="ref" groups="base.group_extended" colspan="4"/> + </group> + <group colspan="4" attrs="{'invisible': [('is_company','=', False)]}"> + <field name="child_ids" context="{'default_parent_id': active_id}" nolabel="1"> + <form string="Partners"> + <group col="8" colspan="4"> + <group col="4" colspan="4"> + <field name="name" required="1"/> + <field name="title" size="0" groups="base.group_extended" domain="[('domain', '=', 'contact')]"/> + <newline/> + <field name="function" attrs="{'invisible': [('is_company', '=', True)]}" colspan="4"/> + <field name="parent_id" string="Company" colspan="4" attrs="{'invisible': [('is_company','=', True)]}" + domain="[('is_company', '=', True)]" context="{'default_is_company': True}" + on_change="onchange_address(use_parent_address, parent_id)" invisible="1"/> + </group> + <group col="2"> + <field name="is_company" on_change="onchange_type(is_company)" invisible="1"/> + </group> + <group col="2"> + <field name="customer"/> + <field name="supplier"/> + </group> + <group col="2"> + <field name="photo" widget='image' nolabel="1"/> + </group> </group> - <newline/> - <group colspan="2" col="4"> - <separator string="Postal Address" colspan="4" col="4" /> - <field name="type" string="Type" colspan="2"/> - <field name="street" colspan="4"/> - <field name="street2" colspan="4"/> - <field name="zip"/> - <field name="city"/> - <field name="country_id" completion="1"/> - <field name="state_id"/> - </group> - <group colspan="2" col="2"> - <separator string="Communication" colspan="2" col="2" /> - <field name="phone"/> - <field name="mobile"/> - <field name="fax"/> - <field name="email" widget="email"/> - </group> - </form> - <tree string="Partner Contacts"> - <field name="name"/> - <field name="zip"/> - <field name="city"/> - <field name="country_id"/> - <field name="phone"/> - <field name="email"/> - </tree> - </field> - <group groups="base.group_extended"> - <separator colspan="4" string="Categories"/> - <field colspan="4" name="category_id" nolabel="1"/> + <notebook colspan="4"> + <page string="General"> + <group colspan="2"> + <separator string="Address" colspan="4"/> + <field name="type" string="Type" attrs="{'invisible': [('is_company','=', True)]}"/> + <group colspan="2"> + <field name="use_parent_address" attrs="{'invisible': [('is_company','=', True)]}" on_change="onchange_address(use_parent_address, parent_id)"/> + </group> + <newline/> + <field name="street" colspan="4"/> + <field name="street2" colspan="4"/> + <field name="zip"/> + <field name="city"/> + <field name="country_id"/> + <field name="state_id"/> + </group> + <group colspan="2"> + <separator string="Communication" colspan="4"/> + <field name="lang" colspan="4"/> + <field name="phone" colspan="4"/> + <field name="mobile" colspan="4"/> + <field name="fax" colspan="4"/> + <field name="email" widget="email" colspan="4"/> + <field name="website" widget="url" colspan="4"/> + <field name="ref" groups="base.group_extended" colspan="4"/> + </group> + </page> + <page string="Sales & Purchases" attrs="{'invisible': [('customer', '=', False), ('supplier', '=', False)]}"> + <separator string="General Information" colspan="4"/> + <field name="user_id"/> + <field name="active" groups="base.group_extended"/> + <field name="date"/> + <field name="company_id" groups="base.group_multi_company" widget="selection"/> + <newline/> + </page> + <page string="Categories" groups="base.group_extended"> + <field name="category_id" colspan="4" nolabel="1"/> + </page> + <page string="Notes"> + <field name="comment" colspan="4" nolabel="1"/> + </page> + </notebook> + </form> + </field> </group> </page> - <page string="Sales & Purchases"> + <page string="Sales & Purchases" attrs="{'invisible': [('customer', '=', False), ('supplier', '=', False)]}"> <separator string="General Information" colspan="4"/> <field name="user_id"/> <field name="active" groups="base.group_extended"/> - <field name="website" widget="url"/> <field name="date"/> - <field name="parent_id" groups="base.group_extended"/> <field name="company_id" groups="base.group_multi_company" widget="selection"/> <newline/> </page> <page string="History" groups="base.group_extended" invisible="True"> </page> + <page string="Categories" groups="base.group_extended"> + <field name="category_id" colspan="4" nolabel="1"/> + </page> <page string="Notes"> - <field colspan="4" name="comment" nolabel="1"/> + <field name="comment" colspan="4" nolabel="1"/> </page> </notebook> </form> @@ -410,12 +478,15 @@ <field name="arch" type="xml"> <search string="Search Partner"> <group col='10' colspan='4'> + <filter string="Persons" name="type_person" icon="terp-personal" domain="[('is_company','=',0)]"/> + <filter string="Companies" name="type_company" icon="terp-partner" domain="[('is_company','=',1)]"/> + <separator orientation="vertical"/> <filter string="Customers" name="customer" icon="terp-personal" domain="[('customer','=',1)]" help="Customer Partners"/> <filter string="Suppliers" name="supplier" icon="terp-personal" domain="[('supplier','=',1)]" help="Supplier Partners"/> <separator orientation="vertical"/> <field name="name" select="1"/> - <field name="address" select="1"/> - <field name="country" select="1"/> + <!--field name="address" select="1"/--> + <!--field name="country" select="1"/--> <field name="category_id" select="1" groups="base.group_extended"/> <field name="user_id" select="1"> <filter help="My Partners" icon="terp-personal+" domain="[('user_id','=',uid)]"/> @@ -424,6 +495,7 @@ <newline /> <group expand="0" string="Group By..."> <filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by' : 'user_id'}" /> + <filter string="Company" context="{'group_by': 'parent_id'}"/> </group> </search> </field> @@ -431,66 +503,69 @@ <!-- Partner Kanban View --> <record model="ir.ui.view" id="res_partner_kanban_view"> - <field name="name">RES - PARTNER KANBAN</field> + <field name="name">res.partner.kanban</field> <field name="model">res.partner</field> <field name="type">kanban</field> <field name="arch" type="xml"> <kanban> <field name="color"/> <field name="name"/> + <field name="title"/> <field name="email"/> + <field name="parent_id"/> + <field name="is_company"/> + <field name="function"/> + <field name="phone"/> + <field name="street"/> + <field name="street2"/> + <field name="photo"/> + <field name="zip"/> + <field name="city"/> + <field name="country_id"/> + <field name="mobile"/> + <field name="state_id"/> <templates> <t t-name="kanban-box"> - <t t-set="color" t-value="kanban_color(record.color.raw_value || record.name.raw_value)"/> - <div t-att-class="color + (record.color.raw_value == 1 ? ' oe_kanban_color_alert' : '')"> - <div class="oe_kanban_box oe_kanban_color_border"> - <div class="oe_kanban_box_header oe_kanban_color_bgdark oe_kanban_color_border oe_kanban_draghandle"> - <table class="oe_kanban_table"> - <tr> - <td class="oe_kanban_title1" align="left" valign="middle"> - <field name="name"/> - </td> - <td valign="top" width="22"> - <img t-att-src="kanban_gravatar(record.email.value, 22)" class="oe_kanban_gravatar"/> - </td> - </tr> - </table> - </div> - <div class="oe_kanban_box_content oe_kanban_color_bglight oe_kanban_box_show_onclick_trigger oe_kanban_color_border"> - <table class="oe_kanban_table"> - <tr> - <td valign="top" width="64" align="left"> - <img src="/base/static/src/img/kanban_partner.png" width="64" height="64"/> - </td> - <td valign="top" align="left"> - <div class="oe_kanban_title2"> - <field name="title"/> - <t t-if="record.title.raw_value and record.country.raw_value">,</t> - <field name="country"/> - </div> - <div class="oe_kanban_title3"> - <field name="subname"/> - <t t-if="record.subname.raw_value and record.function.raw_value">,</t> - <field name="function"/> - </div> - <div class="oe_kanban_title3"> - <i><field name="email"/> - <t t-if="record.phone.raw_value and record.email.raw_value">,</t> - <field name="phone"/></i> - </div> - </td> - </tr> - </table> - </div> - <div class="oe_kanban_buttons_set oe_kanban_color_border oe_kanban_color_bglight oe_kanban_box_show_onclick"> - <div class="oe_kanban_left"> - <a string="Edit" icon="gtk-edit" type="edit"/> - <a string="Change Color" icon="color-picker" type="color" name="color"/> - <a title="Mail" t-att-href="'mailto:'+record.email.value" style="text-decoration: none;" > - <img src="/web/static/src/img/icons/terp-mail-message-new.png" border="0" width="16" height="16"/> - </a> + <t t-set="color" t-value="kanban_color(record.color.raw_value)"/> + <div t-att-class="color + (record.title.raw_value == 1 ? ' oe_kanban_color_alert' : '')"> + <div class="oe_module_vignette"> + <a type="edit"> + <img t-att-src="kanban_image('res.partner', 'photo', record.id.value)" width="64" height="64" class="oe_module_icon"/> + </a> + <div class="oe_module_desc"> + <div class="oe_kanban_box_content oe_kanban_color_bglight oe_kanban_box_show_onclick_trigger oe_kanban_color_border"> + <table class="oe_kanban_table"> + <tr> + <td class="oe_kanban_title1" align="left" valign="middle"> + <h4><a type="edit"><field name="name"/></a> + <div t-if="record.parent_id.raw_value"><field name="parent_id"/></div> + </h4> + <i><div t-if="record.contact_address.raw_value"><field name="contact_address"/><br/></div> + <div t-if="record.email.raw_value"> + <field name="email"/><br/></div> + <div t-if="record.mobile.raw_value"> + <field name="mobile"/><br/> + </div> + <div t-if="!record.mobile.raw_value and record.phone.raw_value"> + <field name="phone"/><br/> + </div></i> + </td> + <td t-if="record.is_company.raw_value" valign="top" align="right"> + <!--img t-att-src="kanban_image('res.partner', 'photo', record.id.value)" class="oe_kanban_gravatar"/--> + </td> + </tr> + </table> </div> - <br class="oe_kanban_clear"/> + <div class="oe_kanban_buttons_set oe_kanban_color_border oe_kanban_color_bglight oe_kanban_box_show_onclick"> + <div class="oe_kanban_left"> + <a string="Edit" icon="gtk-edit" type="edit"/> + <a string="Change Color" icon="color-picker" type="color" name="color"/> + <a t-if="record.email.raw_value" title="Mail" t-att-href="'mailto:'+record.email.value" style="text-decoration: none;" > + <img src="/web/static/src/img/icons/terp-mail-message-new.png" border="0" width="16" height="16"/> + </a> + </div> + <br class="oe_kanban_clear"/> + </div> </div> </div> </div> @@ -501,27 +576,34 @@ </record> <record id="action_partner_form" model="ir.actions.act_window"> - <field name="name">Customers</field> + <field name="name">Contacts</field> <field name="type">ir.actions.act_window</field> <field name="res_model">res.partner</field> <field name="view_type">form</field> - <field name="view_mode">kanban</field> + <field name="view_mode">tree,form,kanban</field> <field name="context">{"search_default_customer":1}</field> <field name="search_view_id" ref="view_res_partner_filter"/> <field name="help">A customer is an entity you do business with, like a company or an organization. A customer can have several contacts or addresses which are the people working for this company. You can use the history tab, to follow all transactions related to a customer: sales order, emails, opportunities, claims, etc. If you use the email gateway, the Outlook or the Thunderbird plugin, don't forget to register emails to each contact so that the gateway will automatically attach incoming emails to the right partner.</field> </record> <record id="action_partner_form_view1" model="ir.actions.act_window.view"> - <field eval="10" name="sequence"/> - <field name="view_mode">tree</field> - <field name="view_id" ref="view_partner_tree"/> + <field eval="0" name="sequence"/> + <field name="view_mode">kanban</field> + <field name="view_id" ref="res_partner_kanban_view"/> <field name="act_window_id" ref="action_partner_form"/> </record> <record id="action_partner_form_view2" model="ir.actions.act_window.view"> - <field eval="20" name="sequence"/> + <field eval="2" name="sequence"/> <field name="view_mode">form</field> <field name="view_id" ref="view_partner_form"/> <field name="act_window_id" ref="action_partner_form"/> </record> + + <record id="action_partner_tree_view1" model="ir.actions.act_window.view"> + <field name="sequence" eval="1"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="view_partner_tree"/> + <field name="act_window_id" ref="action_partner_form"/> + </record> <menuitem action="action_partner_form" id="menu_partner_form" diff --git a/openerp/addons/base/res/wizard/partner_wizard_massmail.py b/openerp/addons/base/res/wizard/partner_wizard_massmail.py index 330d585de98..cc1b80a1710 100644 --- a/openerp/addons/base/res/wizard/partner_wizard_massmail.py +++ b/openerp/addons/base/res/wizard/partner_wizard_massmail.py @@ -60,7 +60,10 @@ class partner_massmail_wizard(osv.osv_memory): ir_mail_server = self.pool.get('ir.mail_server') emails_seen = set() for partner in partners: - for adr in partner.address: + for adr in partner.child_ids: + if adr.is_company: + #we don't want to consider child companies but only the contacts + continue if adr.email and not adr.email in emails_seen: try: emails_seen.add(adr.email) diff --git a/openerp/addons/base/security/ir.model.access-1.csv b/openerp/addons/base/security/ir.model.access-1.csv new file mode 100644 index 00000000000..071458f2b8f --- /dev/null +++ b/openerp/addons/base/security/ir.model.access-1.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_res_partner_address_group_partner_manager","res_partner_address group_partner_manager","model_res_partner_address","group_partner_manager",1,1,1,1 +"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner_address","group_user",1,0,0,0 +"access_res_partner_address","res.partner.address","model_res_partner_address","group_system",1,1,1,1 diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv index 59ebafb2f99..5140ac1b144 100644 --- a/openerp/addons/base/security/ir.model.access.csv +++ b/openerp/addons/base/security/ir.model.access.csv @@ -55,8 +55,6 @@ "access_res_lang_group_user","res_lang group_user","model_res_lang","group_system",1,1,1,1 "access_res_partner_group_partner_manager","res_partner group_partner_manager","model_res_partner","group_partner_manager",1,1,1,1 "access_res_partner_group_user","res_partner group_user","model_res_partner","group_user",1,0,0,0 -"access_res_partner_address_group_partner_manager","res_partner_address group_partner_manager","model_res_partner_address","group_partner_manager",1,1,1,1 -"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner_address","group_user",1,0,0,0 "access_res_partner_bank_group_user","res_partner_bank group_user","model_res_partner_bank","group_user",1,0,0,0 "access_res_partner_bank_group_partner_manager","res_partner_bank group_partner_manager","model_res_partner_bank","group_partner_manager",1,1,1,1 "access_res_partner_bank_type_group_partner_manager","res_partner_bank_type group_partner_manager","model_res_partner_bank_type","group_partner_manager",1,1,1,1 @@ -117,7 +115,6 @@ "access_ir_filter all","ir_filters all","model_ir_filters",,1,0,0,0 "access_ir_filter employee","ir_filters employee","model_ir_filters","group_user",1,1,1,1 "access_ir_filters","ir_filters_all","model_ir_filters",,1,1,1,1 -"access_res_partner_address","res.partner.address","model_res_partner_address","group_system",1,1,1,1 "access_res_widget","res.widget","model_res_widget","group_erp_manager",1,1,1,1 "access_res_widget_user","res.widget.user","model_res_widget",,1,0,0,0 "access_res_log_all","res.log","model_res_log",,1,1,1,1 diff --git a/openerp/addons/base/test/test_osv_expression.yml b/openerp/addons/base/test/test_osv_expression.yml index 618108ef316..fa7a69b74e9 100644 --- a/openerp/addons/base/test/test_osv_expression.yml +++ b/openerp/addons/base/test/test_osv_expression.yml @@ -68,20 +68,20 @@ - Testing that some domain expressions work - - !python {model: res.partner.address }: | - ids = self.search(cr, uid, [('partner_id','=','Agrolait')]) + !python {model: res.partner }: | + ids = self.search(cr, uid, [('parent_id','=','Agrolait')]) assert len(ids) >= 1, ids - Trying the "in" operator, for scalar value - - !python {model: res.partner.address }: | - ids = self.search(cr, uid, [('partner_id','in','Agrolait')]) + !python {model: res.partner }: | + ids = self.search(cr, uid, [('parent_id','in','Agrolait')]) assert len(ids) >= 1, ids - Trying the "in" operator for list value - - !python {model: res.partner.address }: | - ids = self.search(cr, uid, [('partner_id','in',['Agrolait','ASUStek'])]) + !python {model: res.partner }: | + ids = self.search(cr, uid, [('parent_id','in',['Agrolait','ASUStek'])]) assert len(ids) >= 1, ids - Check we can use "in" operator for plain fields. @@ -92,11 +92,11 @@ - Test one2many operator with empty search list - - !assert {model: res.partner, search: "[('address', 'in', [])]", count: 0, string: "Ids should be empty"} + !assert {model: res.partner, search: "[('child_ids', 'in', [])]", count: 0, string: "Ids should be empty"} - Test one2many operator with False - - !assert {model: res.partner, search: "[('address', '=', False)]"}: + !assert {model: res.partner, search: "[('child_ids', '=', False)]"}: - address in (False, None, []) - Test many2many operator with empty search list @@ -110,7 +110,7 @@ - Filtering on invalid value across x2many relationship should return an empty set - - !assert {model: res.partner, search: "[('address.city','=','foo')]", count: 0, string: "Searching for address.city = foo should give empty results"} + !assert {model: res.partner, search: "[('child_ids.city','=','foo')]", count: 0, string: "Searching for address.city = foo should give empty results"} - Check if many2one works with empty search list - @@ -515,7 +515,7 @@ vals = {'category_id': [(6, 0, [ref("base.res_partner_category_8")])], 'name': 'OpenERP Test', 'active': False, - 'address': [(0, 0, {'country_id': ref("base.be")})] + 'child_ids': [(0, 0, {'name': 'address of OpenERP Test', 'country_id': ref("base.be")})] } self.create(cr, uid, vals, context=context) res_ids = self.search(cr, uid, [('category_id', 'ilike', 'supplier'), ('active', '=', False)]) @@ -524,6 +524,6 @@ Testing for One2Many field with country Belgium and active=False - !python {model: res.partner }: | - res_ids = self.search(cr, uid, [('address.country_id','=','Belgium'),('active','=',False)]) + res_ids = self.search(cr, uid, [('child_ids.country_id','=','Belgium'),('active','=',False)]) assert len(res_ids) != 0, "Record not Found with country Belgium and active False." diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 31a433855af..daa2458956c 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -864,7 +864,10 @@ class BaseModel(object): parent_names = [parent_names] else: name = cls._name - + # for res.parnter.address compatiblity, should be remove in v7 + if 'res.partner.address' in parent_names: + parent_names.pop(parent_names.index('res.partner.address')) + parent_names.append('res.partner') if not name: raise TypeError('_name is mandatory in case of multiple inheritance') diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py index 4a713ac3df8..27bd5fa5394 100644 --- a/openerp/report/report_sxw.py +++ b/openerp/report/report_sxw.py @@ -299,7 +299,7 @@ class rml_parse(object): parse_format = DEFAULT_SERVER_DATETIME_FORMAT if isinstance(value, basestring): # FIXME: the trimming is probably unreliable if format includes day/month names - # and those would need to be translated anyway. + # and those would need to be translated anyway. date = datetime.strptime(value[:get_date_length(parse_format)], parse_format) elif isinstance(value, time.struct_time): date = datetime(*value[:6]) @@ -321,7 +321,7 @@ class rml_parse(object): return res def display_address(self, address_browse_record): - return self.pool.get('res.partner.address')._display_address(self.cr, self.uid, address_browse_record) + return self.pool.get('res.partner')._display_address(self.cr, self.uid, address_browse_record) def repeatIn(self, lst, name,nodes_parent=False): ret_lst = [] diff --git a/openerp/tools/import_email.py b/openerp/tools/import_email.py index b597dab5722..d73c50865a2 100644 --- a/openerp/tools/import_email.py +++ b/openerp/tools/import_email.py @@ -86,8 +86,8 @@ class ReceiverEmail2Event(object): def get_partners(self, headers, msg): alladdresses = self.get_addresses(headers, msg) - address_ids = self.rpc(('res.partner.address', 'search', [('email', 'in', alladdresses)])) - addresses = self.rpc(('res.partner.address', 'read', address_ids)) + address_ids = self.rpc(('res.partner', 'search', [('email', 'in', alladdresses)])) + addresses = self.rpc(('res.partner', 'read', address_ids)) return [x['partner_id'][0] for x in addresses] def __call__(self, request):