[MERGE] merged the branch that merges res.partner and res.partner.address objects
bzr revid: qdp-launchpad@openerp.com-20120330142429-bcdxfa4q6g7fsgbs
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -1058,14 +1058,9 @@
|
||||
<record id="main_partner" model="res.partner">
|
||||
<field name="name">Your Company</field>
|
||||
<!-- Address and Company ID will be set later -->
|
||||
<field name="address" eval="[]"/>
|
||||
<field name="company_id" eval="None"/>
|
||||
<field name="customer" eval="False"/>
|
||||
</record>
|
||||
<record id="main_address" model="res.partner.address">
|
||||
<field name="partner_id" ref="main_partner"/>
|
||||
<field name="type">default</field>
|
||||
<field name="company_id" eval="None"/>
|
||||
<field name="is_company" eval="True"/>
|
||||
</record>
|
||||
|
||||
<!-- Currencies -->
|
||||
@@ -1102,9 +1097,6 @@
|
||||
<record id="main_partner" model="res.partner">
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="main_address" model="res.partner.address">
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="EUR" model="res.currency">
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="demo_address" model="res.partner.address">
|
||||
<field name="name">Fabien Dupont</field>
|
||||
<record id="demo_address" model="res.partner">
|
||||
<field name="name">Fabien D'souza</field>
|
||||
<field name="street">Chaussee de Namur</field>
|
||||
<field name="zip">1367</field>
|
||||
<field name="city">Gerompont</field>
|
||||
|
||||
@@ -6,15 +6,13 @@
|
||||
<rml_footer2 type="field" name="rml_footer2"/>
|
||||
<title type="field" name="partner_id.title"/>
|
||||
<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"/>
|
||||
|
||||
@@ -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-->
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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-->
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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"/>
|
||||
-->
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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."
|
||||
|
||||
|
||||
+4
-1
@@ -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')
|
||||
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user