summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobot Odoo <xmo+roboto@odoo.com>2019-08-01 14:08:08 +0200
committerGitHub <noreply@github.com>2019-08-01 14:08:08 +0200
commit8626257bc7b9ee772006eb17d12f56344e594f25 (patch)
tree86aafd7866b18c7ebe942ce3c418a0dbd17cafa1
parented7b53bb1def9d898a766076df3a44e3ac7deeda (diff)
parent3e97cff7797c4f7e695d20def6b920561b6a6525 (diff)
[MERGE] base: Remove customer/supplier fields on res.partner
1/ Improve res.partner search for customers/suppliers ========================================= Purpose ------- This commit allows to call `name_search` with context key `res_partner_search_mode` that can take currently two values: "customer" or "supplier". When ordering search results, order partners by the number of SO they have when the value is "customer" and by the number of PO if the value is "supplier". Top suppliers/customers are displayed above in a PO/SO partner dropdown. We have thought about different implementations before selecting this one: - Keep the 2 boolean flags and automatically set them if a SO or PO is created for a customer/supplier (helps a bit but doesn't work well for the first SO/PO). As the onboarding is also a priority, we didn't implement it. - Instead of filtering on the bool flags, sort the name_search() result according to the number of orders they already have (e.g. if you search for "Foo" on a PO, a supplier "SuperFoo" with 32 purchase orders will appear before supplier "HorribleFoo" that has no PO). Problem is to do this in an efficient manner for large databases - possibly we could store a "relevance index" based on the number of recent orders. Storing those values is an issue too, as it doesn't work well for multi company database. Indeed, storing values that depend on the context is certainly not a good idea. - Same as previous alternative but with no stored columns, rather a JOIN in name_search. This is the solution that have been kept. The only concern was about the perfomances. We tested it on our production base, on a sales order, as we have way much more customers than suppliers. After a deep analysis on the querry and the bitmap generated by PostgreSQL, we can conclude that the count(*) works rather efficiently and that the request is not significantly heavier than without the context key. Performance Analysis -------------------- The following results have been obtained on our production database. ### Before this commit ### The original query is the following one: ``` EXPLAIN ANALYSE SELECT res_partner.id FROM "res_partner" WHERE ("res_partner"."customer" = True) AND ("res_partner"."active" = True) AND ((("res_partner"."type" != 'private') OR "res_partner"."type" IS NULL) OR "res_partner"."type" IS NULL ) AND (res_partner.email ilike '%eezee-i%' OR res_partner.display_name ilike '%eezee-i%' OR res_partner.ref ilike '%eezee-i%' OR res_partner.vat ilike '%eezeei%') -- don't panic, trust postgres bitmap ORDER BY res_partner.display_name ilike '%eezee-i%' desc, res_partner.display_name limit 8; ``` Here is the EXPLAIN ANALYSE returned by PostgreSQL: ``` Limit (cost=1625.50..1625.52 rows=8 width=21) (actual time=13.397..13.404 rows=8 loops=1) -> Sort (cost=1625.50..1626.32 rows=326 width=21) (actual time=13.395..13.396 rows=8 loops=1) Sort Key: (((display_name)::text ~~* '%eezee-i%'::text)) DESC, display_name Sort Method: top-N heapsort Memory: 26kB -> Bitmap Heap Scan on res_partner (cost=1282.79..1618.98 rows=326 width=21) (actual time=13.025..13.350 rows=56 loops=1) Recheck Cond: (((email)::text ~~* '%eezee-i%'::text) OR ((display_name)::text ~~* '%eezee-i%'::text) OR ((ref)::text ~~* '%eezee-i%'::text) OR ((vat)::text ~~* '%eezeei%'::text)) Rows Removed by Index Recheck: 1 Filter: (customer AND active AND (((type)::text <> 'private'::text) OR (type IS NULL) OR (type IS NULL))) Rows Removed by Filter: 1 Heap Blocks: exact=58 -> BitmapOr (cost=1282.79..1282.79 rows=328 width=0) (actual time=12.983..12.983 rows=0 loops=1) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..322.22 rows=162 width=0) (actual time=5.022..5.022 rows=54 loops=1) Index Cond: ((email)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..322.22 rows=162 width=0) (actual time=4.128..4.128 rows=56 loops=1) Index Cond: ((display_name)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..321.00 rows=1 width=0) (actual time=2.240..2.240 rows=0 loops=1) Index Cond: ((ref)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..317.03 rows=4 width=0) (actual time=1.585..1.585 rows=0 loops=1) Index Cond: ((vat)::text ~~* '%eezeei%'::text) Planning time: 0.766 ms Execution time: 13.489 ms ``` ### After this commit ### Without the context key, the query looks like this: ``` SELECT res_partner.id FROM "res_partner" WHERE ("res_partner"."active" = True) AND ((("res_partner"."type" != 'private') OR "res_partner"."type" IS NULL) OR "res_partner"."type" IS NULL ) AND (res_partner.email ilike '%eezee-i%' OR res_partner.display_name ilike '%eezee-i%' OR res_partner.ref ilike '%eezee-i%' OR res_partner.vat ilike '%eezeei%') -- don't panic, trust postgres bitmap GROUP BY res_partner.id ORDER BY COUNT(*) DESC, res_partner.display_name ilike '%eezee-i%' desc, res_partner.display_name limit 8; ``` And it quite clear when looking at the EXPLAIN ANALYSE that the request is quite the same, except the aggregation that is made with a quicksort method. ``` Limit (cost=1645.00..1645.02 rows=8 width=29) (actual time=13.200..13.206 rows=8 loops=1) -> Sort (cost=1645.00..1645.82 rows=328 width=29) (actual time=13.197..13.198 rows=8 loops=1) Sort Key: (count(*)) DESC, (((display_name)::text ~~* '%eezee-i%'::text)) DESC, display_name Sort Method: top-N heapsort Memory: 26kB -> GroupAggregate (cost=1631.88..1638.44 rows=328 width=29) (actual time=13.090..13.160 rows=56 loops=1) Group Key: id -> Sort (cost=1631.88..1632.70 rows=328 width=20) (actual time=13.080..13.084 rows=56 loops=1) Sort Key: id Sort Method: quicksort Memory: 29kB -> Bitmap Heap Scan on res_partner (cost=1282.79..1618.17 rows=328 width=20) (actual time=12.793..13.055 rows=56 loops=1) Recheck Cond: (((email)::text ~~* '%eezee-i%'::text) OR ((display_name)::text ~~* '%eezee-i%'::text) OR ((ref)::text ~~* '%eezee-i%'::text) OR ((vat)::text ~~* '%eezeei%'::text)) Rows Removed by Index Recheck: 1 Filter: (active AND (((type)::text <> 'private'::text) OR (type IS NULL) OR (type IS NULL))) Rows Removed by Filter: 1 Heap Blocks: exact=58 -> BitmapOr (cost=1282.79..1282.79 rows=328 width=0) (actual time=12.755..12.755 rows=0 loops=1) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..322.22 rows=162 width=0) (actual time=4.823..4.823 rows=54 loops=1) Index Cond: ((email)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..322.22 rows=162 width=0) (actual time=3.941..3.941 rows=56 loops=1) Index Cond: ((display_name)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..321.00 rows=1 width=0) (actual time=2.186..2.186 rows=0 loops=1) Index Cond: ((ref)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..317.03 rows=4 width=0) (actual time=1.798..1.798 rows=0 loops=1) Index Cond: ((vat)::text ~~* '%eezeei%'::text) Planning time: 0.761 ms Execution time: 13.317 ms ``` With the context key, the query looks like this: ``` EXPLAIN ANALYSE SELECT res_partner.id FROM "res_partner" LEFT JOIN sale_order ON res_partner.id = sale_order.partner_id WHERE ("res_partner"."active" = True) AND ((("res_partner"."type" != 'private') OR "res_partner"."type" IS NULL) OR "res_partner"."type" IS NULL ) AND (res_partner.email ilike '%eezee-i%' OR res_partner.display_name ilike '%eezee-i%' OR res_partner.ref ilike '%eezee-i%' OR res_partner.vat ilike '%eezeei%') -- don't panic, trust postgres bitmap GROUP BY res_partner.id ORDER BY COUNT(*) DESC, res_partner.display_name ilike '%eezee-i%' desc, res_partner.display_name limit 8; ``` The only difference is that a nested loop is made for the left join, as postgreSQL has correctly identified the dicriminating table. The correct result is obtained within a similar duration. ``` Limit (cost=2700.68..2700.70 rows=8 width=29) (actual time=12.561..12.568 rows=8 loops=1) -> Sort (cost=2700.68..2701.50 rows=328 width=29) (actual time=12.559..12.560 rows=8 loops=1) Sort Key: (count(*)) DESC, (((res_partner.display_name)::text ~~* '%eezee-i%'::text)) DESC, res_partner.display_name Sort Method: top-N heapsort Memory: 26kB -> GroupAggregate (cost=2687.56..2694.12 rows=328 width=29) (actual time=12.449..12.527 rows=56 loops=1) Group Key: res_partner.id -> Sort (cost=2687.56..2688.38 rows=328 width=20) (actual time=12.408..12.425 rows=305 loops=1) Sort Key: res_partner.id Sort Method: quicksort Memory: 42kB -> Nested Loop Left Join (cost=1283.21..2673.86 rows=328 width=20) (actual time=11.629..12.340 rows=305 loops=1) -> Bitmap Heap Scan on res_partner (cost=1282.79..1618.17 rows=328 width=20) (actual time=11.596..11.862 rows=56 loops=1) Recheck Cond: (((email)::text ~~* '%eezee-i%'::text) OR ((display_name)::text ~~* '%eezee-i%'::text) OR ((ref)::text ~~* '%eezee-i%'::text) OR ((vat)::text ~~* '%eezeei%'::text)) Rows Removed by Index Recheck: 1 Filter: (active AND (((type)::text <> 'private'::text) OR (type IS NULL) OR (type IS NULL))) Rows Removed by Filter: 1 Heap Blocks: exact=58 -> BitmapOr (cost=1282.79..1282.79 rows=328 width=0) (actual time=11.560..11.560 rows=0 loops=1) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..322.22 rows=162 width=0) (actual time=4.724..4.724 rows=54 loops=1) Index Cond: ((email)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..322.22 rows=162 width=0) (actual time=3.825..3.825 rows=56 loops=1) Index Cond: ((display_name)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..321.00 rows=1 width=0) (actual time=1.752..1.752 rows=0 loops=1) Index Cond: ((ref)::text ~~* '%eezee-i%'::text) -> Bitmap Index Scan on res_partner_name_tgm_idx_gin (cost=0.00..317.03 rows=4 width=0) (actual time=1.254..1.254 rows=0 loops=1) Index Cond: ((vat)::text ~~* '%eezeei%'::text) -> Index Only Scan using sale_order_partner_id_index on sale_order (cost=0.42..2.74 rows=48 width=4) (actual time=0.006..0.007 rows=5 loops=56) Index Cond: (partner_id = res_partner.id) Heap Fetches: 12 Planning time: 1.056 ms Execution time: 13.791 ms ``` 2/ Remove customer and supplier fields from res.partner =========================================== Purpose ------- Fields `customer` and `supplier` on `res.partner` are mostly used in domains of many2x fields. Those domains can confuse end users because they don't see the partner they are looking for; and it's not obvious why. Some identified problems: 1. It can lead to duplicated partners: the user does not find the partner, so he creates a new one. 2. The user imports supplier contacts in the Contacts app, so they don't get the `supplier` flag. Then the user wants to make a purchase order, and cannot find the new suppliers in the list 3. A user removes the customer flag on a prospect, because they don't think it's a customer yet - except now they can't make a quote for that customer... Specification ------------- Remove the two mentioned fields. Since fields `customer` and `supplier` have been removed, all partners are now shown in many2one dropdowns. But in some cases, not all partners are relevant or some are more likely to be relevant than others. e.g. when creating a PO, top suppliers have a higher priority than other partners. So, adapt the places where those fields were used with the new mechanism to display the searched the partners, according to the number purchase/sales orders they made. TaskID: 2031147 closes odoo/odoo#34524 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com> Co-authored-by: Yannick Tivisse <yti@odoo.com>
-rw-r--r--addons/account/models/account_move.py3
-rw-r--r--addons/account/models/reconciliation_widget.py7
-rw-r--r--addons/account/report/account_invoice_report_view.xml4
-rw-r--r--addons/account/static/src/js/reconciliation/reconciliation_model.js10
-rw-r--r--addons/account/static/src/js/reconciliation/reconciliation_renderer.js2
-rw-r--r--addons/account/static/tests/reconciliation_tests.js18
-rw-r--r--addons/account/tests/account_test_no_chart.py1
-rw-r--r--addons/account/views/account_move_views.xml5
-rw-r--r--addons/account/views/account_payment_view.xml2
-rw-r--r--addons/account/views/account_view.xml3
-rw-r--r--addons/account/views/partner_view.xml6
-rw-r--r--addons/auth_signup/models/res_users.py1
-rw-r--r--addons/base_automation/data/base_automation_demo.xml2
-rw-r--r--addons/base_automation/tests/test_base_automation.py8
-rw-r--r--addons/base_automation/tests/test_models.py2
-rw-r--r--addons/crm/views/crm_lead_views.xml8
-rw-r--r--addons/crm/views/res_partner_views.xml1
-rw-r--r--addons/crm/wizard/crm_lead_to_opportunity_views.xml2
-rw-r--r--addons/delivery/views/partner_view.xml2
-rw-r--r--addons/fleet/models/fleet_vehicle_cost.py8
-rw-r--r--addons/fleet/views/fleet_vehicle_cost_views.xml6
-rw-r--r--addons/google_calendar/models/google_calendar.py1
-rw-r--r--addons/google_drive/data/google_drive_demo.xml1
-rw-r--r--addons/hr_expense/data/hr_expense_demo.xml1
-rw-r--r--addons/hr_expense/wizard/hr_expense_sheet_register_payment.xml2
-rw-r--r--addons/hr_timesheet/tests/test_timesheet.py1
-rw-r--r--addons/l10n_in/data/res_partner_demo.xml7
-rw-r--r--addons/maintenance/models/maintenance.py2
-rw-r--r--addons/maintenance/views/maintenance_views.xml2
-rw-r--r--addons/mass_mailing/models/mailing.py2
-rw-r--r--addons/membership/views/partner_views.xml3
-rw-r--r--addons/mrp/tests/test_stock.py2
-rw-r--r--addons/point_of_sale/static/src/js/models.js3
-rw-r--r--addons/point_of_sale/views/pos_order_view.xml2
-rw-r--r--addons/point_of_sale/views/res_partner_view.xml2
-rw-r--r--addons/product/models/product.py2
-rw-r--r--addons/product/views/product_views.xml2
-rw-r--r--addons/product_margin/tests/test_product_margin.py4
-rw-r--r--addons/purchase/models/res_partner.py8
-rw-r--r--addons/purchase/views/purchase_views.xml2
-rw-r--r--addons/purchase/views/res_partner_views.xml4
-rw-r--r--addons/purchase_requisition/views/purchase_requisition_views.xml2
-rw-r--r--addons/purchase_requisition/views/purchase_views.xml2
-rw-r--r--addons/purchase_stock/tests/test_replenish_wizard.py2
-rw-r--r--addons/sale/models/res_partner.py8
-rw-r--r--addons/sale/views/res_partner_views.xml1
-rw-r--r--addons/sale/views/sale_views.xml2
-rw-r--r--addons/sale_coupon/tests/common.py1
-rw-r--r--addons/sale_coupon/tests/test_program_numbers.py1
-rw-r--r--addons/sale_purchase/tests/common.py1
-rw-r--r--addons/sale_timesheet/tests/test_project_billing.py1
-rw-r--r--addons/sale_timesheet/wizard/project_create_sale_order.py2
-rw-r--r--addons/stock/data/stock_demo.xml2
-rw-r--r--addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py2
-rw-r--r--addons/survey/tests/common.py1
-rw-r--r--addons/web/static/tests/fields/relational_fields/field_many2one_tests.js2
-rw-r--r--addons/website_crm_partner_assign/views/res_partner_views.xml2
-rw-r--r--addons/website_sale/controllers/main.py1
-rw-r--r--addons/website_slides/tests/common.py1
-rw-r--r--odoo/addons/base/data/res_partner_data.xml3
-rw-r--r--odoo/addons/base/data/res_partner_demo.xml19
-rw-r--r--odoo/addons/base/data/res_users_demo.xml3
-rw-r--r--odoo/addons/base/models/res_company.py1
-rw-r--r--odoo/addons/base/models/res_partner.py14
-rw-r--r--odoo/addons/base/models/res_users.py2
-rw-r--r--odoo/addons/base/tests/test_api.py10
-rw-r--r--odoo/addons/base/tests/test_orm.py4
-rw-r--r--odoo/addons/base/views/res_partner_views.xml26
-rw-r--r--odoo/addons/test_impex/tests/contacts.json2
-rw-r--r--odoo/addons/test_impex/tests/test_load.py2
70 files changed, 102 insertions, 172 deletions
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py
index eb7fccabe6c..569cf3532a7 100644
--- a/addons/account/models/account_move.py
+++ b/addons/account/models/account_move.py
@@ -355,9 +355,6 @@ class AccountMove(models.Model):
if self.is_sale_document(include_receipts=True):
if self.env['ir.config_parameter'].sudo().get_param('account.use_invoice_terms'):
self.narration = self.company_id.invoice_terms or self.env.company.invoice_terms
- return {'domain': {'partner_id': [('customer', '=', True)]}}
- elif self.is_purchase_document(include_receipts=True):
- return {'domain': {'partner_id': [('supplier', '=', True)]}}
@api.onchange('invoice_line_ids')
def _onchange_invoice_line_ids(self):
diff --git a/addons/account/models/reconciliation_widget.py b/addons/account/models/reconciliation_widget.py
index 5e49e94e272..50a99f53d05 100644
--- a/addons/account/models/reconciliation_widget.py
+++ b/addons/account/models/reconciliation_widget.py
@@ -704,12 +704,7 @@ class AccountReconciliation(models.AbstractModel):
'company_id': st_line.company_id.id,
}
if st_line.partner_id:
- if st_line.partner_id.supplier and not st_line.partner_id.customer:
- data['open_balance_account_id'] = st_line.partner_id.property_account_payable_id.id
- elif not st_line.partner_id.supplier and st_line.partner_id.customer:
- data['open_balance_account_id'] = st_line.partner_id.property_account_receivable_id.id
- else:
- data['open_balance_account_id'] = amount > 0 and st_line.partner_id.property_account_receivable_id.id or st_line.partner_id.property_account_payable_id.id
+ data['open_balance_account_id'] = amount > 0 and st_line.partner_id.property_account_receivable_id.id or st_line.partner_id.property_account_payable_id.id
return data
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index 479d187b867..3980add37c4 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -101,7 +101,7 @@
<field name="name">Invoices Analysis</field>
<field name="res_model">account.invoice.report</field>
<field name="view_mode">graph,pivot</field>
- <field name="context">{'search_default_current':1, 'search_default_supplier':1, 'group_by':[], 'group_by_no_leaf':1, 'search_default_year': 1}</field>
+ <field name="context">{'search_default_current':1, 'res_partner_search_mode': 'supplier', 'group_by':[], 'group_by_no_leaf':1, 'search_default_year': 1}</field>
<field name="search_view_id" ref="view_account_invoice_report_search"/>
<field name="help">From this report, you can have an overview of the amount invoiced from your vendors. The search tool can also be used to personalise your Invoices reports and so, match this analysis to your needs.</field>
</record>
@@ -109,7 +109,7 @@
<field name="name">Invoices Analysis</field>
<field name="res_model">account.invoice.report</field>
<field name="view_mode">graph,pivot</field>
- <field name="context">{'search_default_current':1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1, 'search_default_year': 1}</field>
+ <field name="context">{'search_default_current':1, 'res_partner_search_mode': 'customer', 'group_by':[], 'group_by_no_leaf':1, 'search_default_year': 1}</field>
<field name="search_view_id" ref="view_account_invoice_report_search"/>
<field name="help">From this report, you can have an overview of the amount invoiced to your customers. The search tool can also be used to personalise your Invoices reports and so, match this analysis to your needs.</field>
</record>
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js
index 10f7a3dc89e..f7876b6ffd3 100644
--- a/addons/account/static/src/js/reconciliation/reconciliation_model.js
+++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js
@@ -862,17 +862,11 @@ var StatementModel = BasicModel.extend({
return this._rpc({
model: 'res.partner',
method: 'read',
- args: [partner_id, ["property_account_receivable_id", "property_account_payable_id", "customer", "supplier"]],
+ args: [partner_id, ["property_account_receivable_id", "property_account_payable_id"]],
}).then(function (result) {
if (result.length > 0) {
var line = self.getLine(handle);
- if (result[0]['supplier'] && !result[0]['customer']) {
- self.lines[handle].st_line.open_balance_account_id = result[0]['property_account_payable_id'][0];
- } else if (!result[0]['supplier'] && result[0]['customer']) {
- self.lines[handle].st_line.open_balance_account_id = result[0]['property_account_receivable_id'][0];
- } else {
- self.lines[handle].st_line.open_balance_account_id = line.balance.amount < 0 ? result[0]['property_account_payable_id'][0] : result[0]['property_account_receivable_id'][0];
- }
+ self.lines[handle].st_line.open_balance_account_id = line.balance.amount < 0 ? result[0]['property_account_payable_id'][0] : result[0]['property_account_receivable_id'][0];
}
});
},
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js
index 8693b2c9d30..312e426f3a3 100644
--- a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js
+++ b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js
@@ -525,7 +525,7 @@ var LineRenderer = Widget.extend(FieldManagerMixin, {
}
return this.model.makeRecord('account.bank.statement.line', [field], {
partner_id: {
- domain: ["|", ["is_company", "=", true], ["parent_id", "=", false], "|", ["customer", "=", true], ["supplier", "=", true]],
+ domain: ["|", ["is_company", "=", true], ["parent_id", "=", false]],
options: {
no_open: true
}
diff --git a/addons/account/static/tests/reconciliation_tests.js b/addons/account/static/tests/reconciliation_tests.js
index e946400afc3..4d3a20f84fb 100644
--- a/addons/account/static/tests/reconciliation_tests.js
+++ b/addons/account/static/tests/reconciliation_tests.js
@@ -26,23 +26,21 @@ var db = {
id: {string: "ID", type: 'integer'},
display_name: {string: "Displayed name", type: 'char'},
image: {string: "image", type: 'integer'},
- customer: {string: "customer", type: 'boolean'},
- supplier: {string: "supplier", type: 'boolean'},
parent_id: {string: "Parent", type: 'boolean'},
is_company: {string: "Is company", type: 'boolean'},
property_account_receivable_id: {string: 'Account receivable', type: 'many2one', relation: 'account.account'},
property_account_payable_id: {string: 'Account payable', type: 'many2one', relation: 'account.account'},
},
records: [
- {id: 1, display_name: "partner 1", image: 'AAA', customer: true},
- {id: 2, display_name: "partner 2", image: 'BBB', customer: true},
- {id: 3, display_name: "partner 3", image: 'CCC', customer: true},
- {id: 4, display_name: "partner 4", image: 'DDD', customer: true},
- {id: 8, display_name: "Agrolait", image: 'EEE', customer: true},
- {id: 12, display_name: "Camptocamp", image: 'FFF', supplier: true, property_account_receivable_id: 287, property_account_payable_id: 287},
+ {id: 1, display_name: "partner 1", image: 'AAA'},
+ {id: 2, display_name: "partner 2", image: 'BBB'},
+ {id: 3, display_name: "partner 3", image: 'CCC'},
+ {id: 4, display_name: "partner 4", image: 'DDD'},
+ {id: 8, display_name: "Agrolait", image: 'EEE'},
+ {id: 12, display_name: "Camptocamp", image: 'FFF', property_account_receivable_id: 287, property_account_payable_id: 287},
// add more to have 'Search More' option
- {id: 98, display_name: "partner 98", image: 'YYY', customer: true},
- {id: 99, display_name: "partner 99", image: 'ZZZ', customer: true},
+ {id: 98, display_name: "partner 98", image: 'YYY'},
+ {id: 99, display_name: "partner 99", image: 'ZZZ'},
],
mark_as_reconciled: function () {
return Promise.resolve();
diff --git a/addons/account/tests/account_test_no_chart.py b/addons/account/tests/account_test_no_chart.py
index ba145b02d48..28bf7e8807a 100644
--- a/addons/account/tests/account_test_no_chart.py
+++ b/addons/account/tests/account_test_no_chart.py
@@ -41,7 +41,6 @@ class TestAccountNoChartCommon(SavepointCase):
cls.partner_customer_usd = Partner.create({
'name': 'Customer from the North',
'email': 'customer.usd@north.com',
- 'customer': True,
'property_account_payable_id': cls.account_payable.id,
'property_account_receivable_id': cls.account_receivable.id,
})
diff --git a/addons/account/views/account_move_views.xml b/addons/account/views/account_move_views.xml
index 0ea26ac6708..778718e3421 100644
--- a/addons/account/views/account_move_views.xml
+++ b/addons/account/views/account_move_views.xml
@@ -549,10 +549,7 @@
</div>
<field name="partner_id" widget="res_partner_many2one" nolabel="1"
context="{
- 'search_default_customer': context.get('type', 'entry') in ('out_invoice', 'out_refund', 'out_receipt'),
- 'search_default_supplier': context.get('type', 'entry') in ('in_invoice', 'in_refund', 'in_receipt'),
- 'default_customer': context.get('type', 'entry') in ('out_invoice', 'out_refund', 'out_receipt'),
- 'default_supplier': context.get('type', 'entry') in ('in_invoice', 'in_refund', 'in_receipt'),
+ 'res_partner_search_mode': (context.get('type', 'entry') in ('out_invoice', 'out_refund', 'out_receipt') and 'customer') or (context.get('type', 'entry') in ('in_invoice', 'in_refund', 'in_receipt') and 'supplier') or False,
'show_address': 1, 'default_is_company': True, 'show_vat': True}"
options='{"always_reload": True, "no_quick_create": True}'
attrs="{
diff --git a/addons/account/views/account_payment_view.xml b/addons/account/views/account_payment_view.xml
index 2fe80e22cca..430f2316517 100644
--- a/addons/account/views/account_payment_view.xml
+++ b/addons/account/views/account_payment_view.xml
@@ -149,7 +149,7 @@
<group name="partner_group" invisible="context.get('active_model') == 'account.move'">
<field name="payment_type" widget="radio"/>
<field name="partner_type" widget="selection" attrs="{'required': [('state', '=', 'draft'), ('payment_type', 'in', ('inbound', 'outbound'))], 'invisible': [('payment_type', 'not in', ('inbound', 'outbound'))]}"/>
- <field name="partner_id" attrs="{'required': [('state', '=', 'draft'), ('payment_type', 'in', ('inbound', 'outbound'))], 'invisible': [('payment_type', 'not in', ('inbound', 'outbound'))]}" context="{'default_is_company': True, 'default_supplier': payment_type == 'outbound', 'default_customer': payment_type == 'inbound'}"/>
+ <field name="partner_id" attrs="{'required': [('state', '=', 'draft'), ('payment_type', 'in', ('inbound', 'outbound'))], 'invisible': [('payment_type', 'not in', ('inbound', 'outbound'))]}" context="{'default_is_company': True}"/>
</group>
<group name="right_column">
<field name="communication"/>
diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml
index 77e10a8529f..8abe388a28c 100644
--- a/addons/account/views/account_view.xml
+++ b/addons/account/views/account_view.xml
@@ -579,8 +579,7 @@ action = model.setting_init_bank_account_action()
<field name="date" attrs="{'readonly' : [('journal_entry_ids', '!=', [])] }"/>
<field name="name" attrs="{'readonly' : [('journal_entry_ids', '!=', [])] }"/>
<field name="partner_id" domain="['|',('parent_id','=',False),('is_company','=',True)]"
- context="{'default_supplier': 1}"
- attrs="{'readonly' : [('journal_entry_ids', '!=', [])] }"/>
+ attrs="{'readonly' : [('journal_entry_ids', '!=', [])] }"/>
<field name="ref" attrs="{'readonly' : [('journal_entry_ids', '!=', [])] }" groups="base.group_no_one"/>
<field name="amount" attrs="{'readonly' : [('journal_entry_ids', '!=', [])] }"/>
<field name="journal_currency_id" invisible="1"/>
diff --git a/addons/account/views/partner_view.xml b/addons/account/views/partner_view.xml
index 0307bb43576..ffe487836f7 100644
--- a/addons/account/views/partner_view.xml
+++ b/addons/account/views/partner_view.xml
@@ -122,7 +122,7 @@
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button type="object" class="oe_stat_button" icon="fa-pencil-square-o" name="action_view_partner_invoices"
- attrs="{'invisible': [('customer', '=', False)]}" context="{'default_partner_id': active_id}">
+ context="{'default_partner_id': active_id}">
<div class="o_form_field o_stat_info">
<span class="o_stat_value">
<field name="total_invoiced" widget='monetary' options="{'currency_field': 'currency_id'}"/>
@@ -220,10 +220,10 @@
</group>
</xpath>
<group name="sale" position="inside">
- <field string="Payment Terms" name="property_payment_term_id" widget="selection" groups="account.group_account_invoice" attrs="{'invisible': [('customer','=', False)]}"/>
+ <field string="Payment Terms" name="property_payment_term_id" widget="selection" groups="account.group_account_invoice"/>
</group>
<group name="purchase" position="inside">
- <field string="Payment Terms" name="property_supplier_payment_term_id" widget="selection" groups="account.group_account_invoice" attrs="{'invisible': [('supplier','=', False)]}"/>
+ <field string="Payment Terms" name="property_supplier_payment_term_id" widget="selection" groups="account.group_account_invoice"/>
</group>
</field>
</record>
diff --git a/addons/auth_signup/models/res_users.py b/addons/auth_signup/models/res_users.py
index 6564129253a..11df8c34116 100644
--- a/addons/auth_signup/models/res_users.py
+++ b/addons/auth_signup/models/res_users.py
@@ -144,7 +144,6 @@ class ResUsers(models.Model):
# create a copy of the template user (attached to a specific partner_id if given)
values['active'] = True
- values['customer'] = True
try:
with self.env.cr.savepoint():
return template_user.with_context(no_reset_password=True).copy(values)
diff --git a/addons/base_automation/data/base_automation_demo.xml b/addons/base_automation/data/base_automation_demo.xml
index 7ddc3a74581..6563efede04 100644
--- a/addons/base_automation/data/base_automation_demo.xml
+++ b/addons/base_automation/data/base_automation_demo.xml
@@ -32,7 +32,7 @@
<field name="trigger">on_write</field>
<field name="active" eval="True"/>
<field name="model_id" ref="base_automation.model_base_automation_lead_test"/>
- <field name="filter_domain">[('customer', '=', True)]</field>
+ <field name="filter_domain">[('employee', '=', True)]</field>
</record>
<record id="test_rule_recursive" model="base.automation">
diff --git a/addons/base_automation/tests/test_base_automation.py b/addons/base_automation/tests/test_base_automation.py
index 97fcb2d1827..a97fe310048 100644
--- a/addons/base_automation/tests/test_base_automation.py
+++ b/addons/base_automation/tests/test_base_automation.py
@@ -84,13 +84,13 @@ class base_automation_test(common.TransactionCase):
change on another model.
"""
partner = self.env.ref('base.res_partner_1')
- partner.write({'customer': False})
+ partner.write({'employee': False})
lead = self.create_lead(state='open', partner_id=partner.id)
- self.assertFalse(lead.customer, "Customer field should updated to False")
+ self.assertFalse(lead.employee, "Customer field should updated to False")
self.assertEqual(lead.user_id, self.user_root, "Responsible should not change on creation of Lead with state from 'draft' to 'open'.")
# change partner, recompute on lead should trigger the rule
- partner.write({'customer': True})
- self.assertTrue(lead.customer, "Customer field should updated to True")
+ partner.write({'employee': True})
+ self.assertTrue(lead.employee, "Customer field should updated to True")
self.assertEqual(lead.user_id, self.user_demo, "Responsible should be change on write of Lead when Customer becomes True.")
def test_11_recomputed_field(self):
diff --git a/addons/base_automation/tests/test_models.py b/addons/base_automation/tests/test_models.py
index 3fbba42de03..38640270960 100644
--- a/addons/base_automation/tests/test_models.py
+++ b/addons/base_automation/tests/test_models.py
@@ -17,7 +17,7 @@ class LeadTest(models.Model):
active = fields.Boolean(default=True)
partner_id = fields.Many2one('res.partner', string='Partner')
date_action_last = fields.Datetime(string='Last Action', readonly=True)
- customer = fields.Boolean(related='partner_id.customer', readonly=True, store=True)
+ employee = fields.Boolean(related='partner_id.employee', readonly=True, store=True)
line_ids = fields.One2many('base.automation.line.test', 'lead_id')
priority = fields.Boolean()
diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml
index afd98c695ca..2cfeb26fd0f 100644
--- a/addons/crm/views/crm_lead_views.xml
+++ b/addons/crm/views/crm_lead_views.xml
@@ -279,7 +279,7 @@
<group>
<group>
<field name="name" string="Opportunity Title" placeholder="e.g. Customer Deal"/>
- <field name="partner_id" widget="res_partner_many2one" domain="[('customer', '=', True)]" context="{'search_default_customer': 1, 'show_vat': True}"/>
+ <field name="partner_id" widget="res_partner_many2one" context="{'res_partner_search_mode': 'customer', 'show_vat': True}"/>
<field name="partner_name" invisible="1"/>
<field name="street" invisible="1"/>
<field name="street2" invisible="1"/>
@@ -336,7 +336,7 @@
<form>
<group>
<field name="name"/>
- <field name="partner_id" widget="res_partner_many2one" domain="[('customer', '=', True)]" context="{'search_default_customer': 1, 'show_vat': True}"/>
+ <field name="partner_id" widget="res_partner_many2one" context="{'res_partner_search_mode': 'customer', 'show_vat': True}"/>
<field name="planned_revenue" widget="monetary" options="{'currency_field': 'company_currency'}"/>
<field name="company_currency" invisible="1"/>
<field name="company_id" invisible="1"/>
@@ -565,8 +565,8 @@
<group>
<field name="partner_id"
widget="res_partner_many2one"
- string="Customer" domain="[('customer', '=', True)]"
- context="{'search_default_customer': 1,
+ string="Customer"
+ context="{'res_partner_search_mode': 'customer',
'default_name': contact_name or partner_name,
'default_street': street,
'default_is_company': contact_name == False,
diff --git a/addons/crm/views/res_partner_views.xml b/addons/crm/views/res_partner_views.xml
index 4071c35e60b..1ddb0e514b4 100644
--- a/addons/crm/views/res_partner_views.xml
+++ b/addons/crm/views/res_partner_views.xml
@@ -91,7 +91,6 @@
<data>
<div name="button_box" position="inside">
<button class="oe_stat_button o_res_partner_tip_opp" type="action"
- attrs="{'invisible': [('customer', '=', False)]}"
name="%(crm.crm_lead_opportunities)d"
icon="fa-star"
groups="sales_team.group_sale_salesman"
diff --git a/addons/crm/wizard/crm_lead_to_opportunity_views.xml b/addons/crm/wizard/crm_lead_to_opportunity_views.xml
index f0f9aa7f17a..aeab3adc26e 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity_views.xml
+++ b/addons/crm/wizard/crm_lead_to_opportunity_views.xml
@@ -32,7 +32,7 @@
<group name="action" attrs="{'invisible': [('name', '!=', 'convert')]}" string="Customer" col="1">
<field name="action" nolabel="1" widget="radio"/>
<group col="2">
- <field name="partner_id" widget="res_partner_many2one" domain="[('customer', '=', True)]" context="{'search_default_customer': 1, 'show_vat': True}" attrs="{'required': [('action', '=', 'exist')], 'invisible':[('action','!=','exist')]}"/>
+ <field name="partner_id" widget="res_partner_many2one" context="{'res_partner_search_mode': 'customer', 'show_vat': True}" attrs="{'required': [('action', '=', 'exist')], 'invisible':[('action','!=','exist')]}"/>
</group>
</group>
<footer>
diff --git a/addons/delivery/views/partner_view.xml b/addons/delivery/views/partner_view.xml
index 3ca062af12f..a598514f170 100644
--- a/addons/delivery/views/partner_view.xml
+++ b/addons/delivery/views/partner_view.xml
@@ -7,7 +7,7 @@
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<xpath expr="//page[@name='sales_purchases']//field[@name='user_id']" position="after">
- <field name="property_delivery_carrier_id" attrs="{'invisible': [('customer','=', False)]}"/>
+ <field name="property_delivery_carrier_id"/>
</xpath>
</field>
</record>
diff --git a/addons/fleet/models/fleet_vehicle_cost.py b/addons/fleet/models/fleet_vehicle_cost.py
index 5ddfd92cf90..9cf2c2dee94 100644
--- a/addons/fleet/models/fleet_vehicle_cost.py
+++ b/addons/fleet/models/fleet_vehicle_cost.py
@@ -308,9 +308,9 @@ class FleetVehicleLogFuel(models.Model):
liter = fields.Float()
price_per_liter = fields.Float()
- purchaser_id = fields.Many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]")
+ purchaser_id = fields.Many2one('res.partner', 'Purchaser')
inv_ref = fields.Char('Invoice Reference', size=64)
- vendor_id = fields.Many2one('res.partner', 'Vendor', domain="[('supplier','=',True)]")
+ vendor_id = fields.Many2one('res.partner', 'Vendor')
notes = fields.Text()
cost_id = fields.Many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade')
# we need to keep this field as a related with store=True because the graph view doesn't support
@@ -360,9 +360,9 @@ class FleetVehicleLogServices(models.Model):
})
return res
- purchaser_id = fields.Many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]")
+ purchaser_id = fields.Many2one('res.partner', 'Purchaser')
inv_ref = fields.Char('Invoice Reference')
- vendor_id = fields.Many2one('res.partner', 'Vendor', domain="[('supplier','=',True)]")
+ vendor_id = fields.Many2one('res.partner', 'Vendor')
# we need to keep this field as a related with store=True because the graph view doesn't support
# (1) to address fields from inherited table and (2) fields that aren't stored in database
cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True, readonly=False)
diff --git a/addons/fleet/views/fleet_vehicle_cost_views.xml b/addons/fleet/views/fleet_vehicle_cost_views.xml
index 226c2baa744..a21159c3611 100644
--- a/addons/fleet/views/fleet_vehicle_cost_views.xml
+++ b/addons/fleet/views/fleet_vehicle_cost_views.xml
@@ -187,7 +187,7 @@
<field name="active" invisible="1"/>
<field name="ins_ref"/>
<field name="cost_subtype_id" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
- <field name="insurer_id" context="{'default_supplier': True}"/>
+ <field name="insurer_id"/>
<field name="user_id"/>
</group>
<group string="Vehicle Informations">
@@ -425,7 +425,7 @@
<field name="date" />
<field name="purchaser_id" />
<field name="inv_ref" />
- <field name="vendor_id" context="{'default_supplier': True}"/>
+ <field name="vendor_id"/>
</group>
</group>
<field name="notes" placeholder="Write here any other information"/>
@@ -549,7 +549,7 @@
<group string="Additional Details">
<field name="date" />
<field name="purchaser_id" />
- <field name="vendor_id" context="{'default_supplier': True}"/>
+ <field name="vendor_id"/>
<field name="inv_ref" />
</group>
</group>
diff --git a/addons/google_calendar/models/google_calendar.py b/addons/google_calendar/models/google_calendar.py
index 36b880adbae..f354e551212 100644
--- a/addons/google_calendar/models/google_calendar.py
+++ b/addons/google_calendar/models/google_calendar.py
@@ -448,7 +448,6 @@ class GoogleCalendar(models.AbstractModel):
if not attendee:
data = {
'email': partner_email,
- 'customer': False,
'name': google_attendee.get("displayName", False) or partner_email
}
attendee = ResPartner.create(data)
diff --git a/addons/google_drive/data/google_drive_demo.xml b/addons/google_drive/data/google_drive_demo.xml
index 59bbbaed87c..d3bab5d7389 100644
--- a/addons/google_drive/data/google_drive_demo.xml
+++ b/addons/google_drive/data/google_drive_demo.xml
@@ -6,7 +6,6 @@
<record id="filter_partner" model="ir.filters">
<field name="name">Customer</field>
<field name="model_id">res.partner</field>
- <field name="domain">[['customer', '=', 1]]</field>
<field name="user_id" eval="False" />
</record>
diff --git a/addons/hr_expense/data/hr_expense_demo.xml b/addons/hr_expense/data/hr_expense_demo.xml
index 0a171e015a7..57ec21bda80 100644
--- a/addons/hr_expense/data/hr_expense_demo.xml
+++ b/addons/hr_expense/data/hr_expense_demo.xml
@@ -17,7 +17,6 @@
<record id="res_partner_address_fp" model="res.partner">
<field name="name">Pieter Parter's Farm</field>
<field name="parent_id" eval="ref('base.partner_root')"/>
- <field name="supplier">1</field>
<field name="street">Chaussée de Namur, 40</field>
<field name="zip">1367</field>
<field name="city">Grand-Rosière-Hottomont</field>
diff --git a/addons/hr_expense/wizard/hr_expense_sheet_register_payment.xml b/addons/hr_expense/wizard/hr_expense_sheet_register_payment.xml
index d1cab98e797..df376a52d2f 100644
--- a/addons/hr_expense/wizard/hr_expense_sheet_register_payment.xml
+++ b/addons/hr_expense/wizard/hr_expense_sheet_register_payment.xml
@@ -12,7 +12,7 @@
</div>
<group>
<group>
- <field name="partner_id" required="1" context="{'default_is_company': True, 'default_supplier': True}"/>
+ <field name="partner_id" required="1" context="{'default_is_company': True}"/>
<field name="journal_id" widget="selection"/>
<field name="hide_payment_method" invisible="1"/>
<field name="payment_method_id" widget="radio" attrs="{'invisible': [('hide_payment_method', '=', True)]}"/>
diff --git a/addons/hr_timesheet/tests/test_timesheet.py b/addons/hr_timesheet/tests/test_timesheet.py
index 1a7dbee1509..c2bfab9e8bd 100644
--- a/addons/hr_timesheet/tests/test_timesheet.py
+++ b/addons/hr_timesheet/tests/test_timesheet.py
@@ -14,7 +14,6 @@ class TestCommonTimesheet(TransactionCase):
self.partner = self.env['res.partner'].create({
'name': 'Customer Task',
'email': 'customer@task.com',
- 'customer': True,
})
self.analytic_account = self.env['account.analytic.account'].create({
diff --git a/addons/l10n_in/data/res_partner_demo.xml b/addons/l10n_in/data/res_partner_demo.xml
index 962919e460c..9876146414e 100644
--- a/addons/l10n_in/data/res_partner_demo.xml
+++ b/addons/l10n_in/data/res_partner_demo.xml
@@ -23,7 +23,6 @@
<record id="res_partner_registered_customer" model="res.partner">
<field name="name">Registered Customer</field>
<field eval="[(6, 0, [ref('l10n_in.res_partner_category_registered')])]" name="category_id"/>
- <field name="customer">1</field>
<field name="is_company">1</field>
<field name="street">201, Second Floor, IT Tower 4</field>
<field name="street2">InfoCity Gate - 1, Infocity</field>
@@ -62,8 +61,6 @@
<record id="res_partner_registered_supplier" model="res.partner">
<field name="name">Registered Supplier</field>
<field eval="[(6, 0, [ref('l10n_in.res_partner_category_registered')])]" name="category_id"/>
- <field name="customer">0</field>
- <field name="supplier">1</field>
<field name="is_company">1</field>
<field name="street">201, Second Floor, IT Tower 4</field>
<field name="street2">InfoCity Gate - 1, Infocity</field>
@@ -78,8 +75,6 @@
<record id="res_partner_unregistered_supplier" model="res.partner">
<field name="name">Unregistered Supplier</field>
<field eval="[(6, 0, [ref('l10n_in.res_partner_category_unregistered')])]" name="category_id"/>
- <field name="customer">0</field>
- <field name="supplier">1</field>
<field name="street">B105, yogeshwar Tower</field>
<field name="city">Veraval</field>
<field name="zip">362266</field>
@@ -92,8 +87,6 @@
<field name="name">Reseller(E-Commerce)</field>
<field eval="[(6, 0, [ref('l10n_in.res_partner_category_reseller'),
ref('l10n_in.res_partner_category_registered')])]" name="category_id"/>
- <field name="customer">0</field>
- <field name="supplier">0</field>
<field name="street">4/001 Ground Floor, 16th Main Rd,</field>
<field name="city">Bengaluru</field>
<field name="zip">560001</field>
diff --git a/addons/maintenance/models/maintenance.py b/addons/maintenance/models/maintenance.py
index 73a30347399..f321cc21ab7 100644
--- a/addons/maintenance/models/maintenance.py
+++ b/addons/maintenance/models/maintenance.py
@@ -124,7 +124,7 @@ class MaintenanceEquipment(models.Model):
owner_user_id = fields.Many2one('res.users', string='Owner', tracking=True)
category_id = fields.Many2one('maintenance.equipment.category', string='Equipment Category',
tracking=True, group_expand='_read_group_category_ids')
- partner_id = fields.Many2one('res.partner', string='Vendor', domain="[('supplier', '=', 1)]")
+ partner_id = fields.Many2one('res.partner', string='Vendor')
partner_ref = fields.Char('Vendor Reference')
location = fields.Char('Location')
model = fields.Char('Model')
diff --git a/addons/maintenance/views/maintenance_views.xml b/addons/maintenance/views/maintenance_views.xml
index 499bf05693d..204a50adc56 100644
--- a/addons/maintenance/views/maintenance_views.xml
+++ b/addons/maintenance/views/maintenance_views.xml
@@ -368,7 +368,7 @@
<page string="Product Information">
<group>
<group>
- <field name="partner_id" context="{'default_supplier': True, 'default_customer': False}"/>
+ <field name="partner_id"/>
<field name="partner_ref"/>
<field name="model"/>
<field name="serial_no"/>
diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py
index 7817237818e..ec8731dd2de 100644
--- a/addons/mass_mailing/models/mailing.py
+++ b/addons/mass_mailing/models/mailing.py
@@ -354,8 +354,6 @@ class MassMailing(models.Model):
mailing_domain.append(('list_ids', 'in', self.contact_list_ids.ids))
else:
mailing_domain.append((0, '=', 1))
- elif self.mailing_model_name == 'res.partner':
- mailing_domain.append(('customer', '=', True))
elif 'opt_out' in self.env[self.mailing_model_name]._fields and not self.mailing_domain:
mailing_domain.append(('opt_out', '=', False))
else:
diff --git a/addons/membership/views/partner_views.xml b/addons/membership/views/partner_views.xml
index cd4feefb6d9..d4c5aea3396 100644
--- a/addons/membership/views/partner_views.xml
+++ b/addons/membership/views/partner_views.xml
@@ -29,9 +29,6 @@
<field name="category_id"/>
<field name="membership_start" invisible="1"/>
<field name="membership_stop" string="End Membership Date"/>
- <filter string="Customers" name="customer" domain="[('customer','=',True)]"/>
- <separator/>
- <filter string="Vendors" name="supplier" domain="[('supplier','=',True)]"/>
<separator/>
<filter name="all_non_members" domain="[('membership_state', 'in', ['none','canceled','old','waiting'])]" string="All non Members" help="None/Canceled/Old/Waiting"/>
<filter name="all_members" domain="[('membership_state', 'in', ['invoiced','paid','free'])]" string="All Members" help="Invoiced/Paid/Free"/>
diff --git a/addons/mrp/tests/test_stock.py b/addons/mrp/tests/test_stock.py
index 6f5f8c130cf..14b2e28e7b2 100644
--- a/addons/mrp/tests/test_stock.py
+++ b/addons/mrp/tests/test_stock.py
@@ -305,8 +305,6 @@ class TestKitPicking(common.TestMrpCommon):
# We create an 'immediate transfer' receipt for x3 kit_parent
self.test_partner = self.env['res.partner'].create({
'name': 'Notthat Guyagain',
- 'supplier': True,
- 'customer': True,
})
self.test_supplier = self.env['stock.location'].create({
'name': 'supplier',
diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js
index b9d539c8643..e24a5d7841b 100644
--- a/addons/point_of_sale/static/src/js/models.js
+++ b/addons/point_of_sale/static/src/js/models.js
@@ -210,7 +210,6 @@ exports.PosModel = Backbone.Model.extend({
fields: ['name','street','city','state_id','country_id','vat',
'phone','zip','mobile','email','barcode','write_date',
'property_account_position_id','property_product_pricelist'],
- domain: [['customer','=',true]],
loaded: function(self,partners){
self.partners = partners;
self.db.add_partners(partners);
@@ -587,7 +586,7 @@ exports.PosModel = Backbone.Model.extend({
},
prepare_new_partners_domain: function(){
- return [['customer','=',true], ['write_date','>', this.db.get_partner_write_date()]];
+ return [['write_date','>', this.db.get_partner_write_date()]];
},
// reload the list of partner, returns as a promise that resolves if there were
diff --git a/addons/point_of_sale/views/pos_order_view.xml b/addons/point_of_sale/views/pos_order_view.xml
index 21a4d9e3fbe..7ce67d79d3f 100644
--- a/addons/point_of_sale/views/pos_order_view.xml
+++ b/addons/point_of_sale/views/pos_order_view.xml
@@ -28,7 +28,7 @@
<field name="date_order"/>
<field name="session_id" />
<field string="User" name="user_id"/>
- <field name="partner_id" domain="[('customer', '=', True)]" context="{'search_default_customer':1}" attrs="{'readonly': [('state','=','invoiced')]}"/>
+ <field name="partner_id" context="{'res_partner_search_mode': 'customer'}" attrs="{'readonly': [('state','=','invoiced')]}"/>
<field name="fiscal_position_id" options="{'no_create': True}"/>
<field name="invoice_group" invisible="1"/>
</group>
diff --git a/addons/point_of_sale/views/res_partner_view.xml b/addons/point_of_sale/views/res_partner_view.xml
index 5528bf1fe64..0da6074cf83 100644
--- a/addons/point_of_sale/views/res_partner_view.xml
+++ b/addons/point_of_sale/views/res_partner_view.xml
@@ -10,7 +10,7 @@
<div name="button_box" position="inside">
<button class="oe_stat_button" type="action" name="%(point_of_sale.action_pos_pos_form)d"
context="{'search_default_partner_id': active_id,'default_partner_id': active_id}"
- attrs="{'invisible': ['|', ('customer', '=', False), ('pos_order_count', '=', 0)]}"
+ attrs="{'invisible': [('pos_order_count', '=', 0)]}"
icon="fa-shopping-bag">
<field string="PoS Orders" name="pos_order_count" widget="statinfo"/>
</button>
diff --git a/addons/product/models/product.py b/addons/product/models/product.py
index 5c8474a09e3..cdb4a74a498 100644
--- a/addons/product/models/product.py
+++ b/addons/product/models/product.py
@@ -767,7 +767,7 @@ class SupplierInfo(models.Model):
name = fields.Many2one(
'res.partner', 'Vendor',
- domain=[('supplier', '=', True)], ondelete='cascade', required=True,
+ ondelete='cascade', required=True,
help="Vendor of this product")
product_name = fields.Char(
'Vendor Product Name',
diff --git a/addons/product/views/product_views.xml b/addons/product/views/product_views.xml
index fe533e325bf..5a134ceb6c2 100644
--- a/addons/product/views/product_views.xml
+++ b/addons/product/views/product_views.xml
@@ -630,7 +630,7 @@
<group>
<group name="vendor" string="Vendor">
<field name="product_variant_count" invisible="1"/>
- <field name="name" context="{'default_customer': 0, 'search_default_supplier': 1, 'default_supplier': 1}"/>
+ <field name="name" context="{'res_partner_search_mode': 'supplier'}"/>
<field name="product_name"/>
<field name="product_code"/>
<field name="product_id" groups="product.group_product_variant" domain="[('product_tmpl_id', '=', product_tmpl_id)]" options="{'no_create_edit': True}"/>
diff --git a/addons/product_margin/tests/test_product_margin.py b/addons/product_margin/tests/test_product_margin.py
index 9626b47bb6d..0e950a77b17 100644
--- a/addons/product_margin/tests/test_product_margin.py
+++ b/addons/product_margin/tests/test_product_margin.py
@@ -29,8 +29,8 @@ class TestProductMargin(common.TransactionCase):
get_resource_path('account', 'test', 'account_minimal_test.xml'),
{}, 'init', False, 'test', self.registry._assertion_report)
- supplier = self.env['res.partner'].create({'name': 'Supplier', 'supplier': True})
- customer = self.env['res.partner'].create({'name': 'Customer', 'customer': True})
+ supplier = self.env['res.partner'].create({'name': 'Supplier'})
+ customer = self.env['res.partner'].create({'name': 'Customer'})
ipad = self.env.ref("product.product_product_4")
# Create supplier invoice and customer invoice to test product margin.
diff --git a/addons/purchase/models/res_partner.py b/addons/purchase/models/res_partner.py
index e323fe95658..56d79315966 100644
--- a/addons/purchase/models/res_partner.py
+++ b/addons/purchase/models/res_partner.py
@@ -53,3 +53,11 @@ class res_partner(models.Model):
supplier_invoice_count = fields.Integer(compute='_compute_supplier_invoice_count', string='# Vendor Bills')
purchase_warn = fields.Selection(WARNING_MESSAGE, 'Purchase Order', help=WARNING_HELP, default="no-message")
purchase_warn_msg = fields.Text('Message for Purchase Order')
+
+ def _get_name_search_join_clause(self):
+ res = super()._get_name_search_join_clause()
+ partner_search_mode = self.env.context.get('res_partner_search_mode')
+ if partner_search_mode == 'supplier':
+ join_clause = "LEFT JOIN {table} ON res_partner.id = {table}.partner_id".format(table=self.env['purchase.order']._table)
+ return '%s %s' % (res, join_clause) if res else join_clause
+ return res
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index 4db8dab2043..99f237d889b 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -166,7 +166,7 @@
</div>
<group>
<group>
- <field name="partner_id" widget="res_partner_many2one" context="{'search_default_supplier':1, 'default_supplier':1, 'default_customer':0, 'show_vat': True}" domain="[('supplier','=',True)]"
+ <field name="partner_id" widget="res_partner_many2one" context="{'res_partner_search_mode': 'supplier', 'show_vat': True}"
placeholder="Name, TIN, Email, or Reference"
/>
<field name="partner_ref"/>
diff --git a/addons/purchase/views/res_partner_views.xml b/addons/purchase/views/res_partner_views.xml
index 64da2745715..58acf001c03 100644
--- a/addons/purchase/views/res_partner_views.xml
+++ b/addons/purchase/views/res_partner_views.xml
@@ -74,7 +74,7 @@
<div name="button_box" position="inside">
<button class="oe_stat_button" name="%(purchase.act_res_partner_2_purchase_order)d" type="action"
groups="purchase.group_purchase_user"
- attrs="{'invisible': [('supplier', '=', False)]}" icon="fa-shopping-cart">
+ icon="fa-shopping-cart">
<field string="Purchases" name="purchase_order_count" widget="statinfo"/>
</button>
</div>
@@ -98,7 +98,7 @@
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button class="oe_stat_button" name="%(purchase.act_res_partner_2_supplier_invoices)d" type="action"
- attrs="{'invisible': [('supplier', '=', False)]}" icon="fa-pencil-square-o" help="Vendor Bills">
+ icon="fa-pencil-square-o" help="Vendor Bills">
<field string="Vendor Bills" name="supplier_invoice_count" widget="statinfo"/>
</button>
</div>
diff --git a/addons/purchase_requisition/views/purchase_requisition_views.xml b/addons/purchase_requisition/views/purchase_requisition_views.xml
index 0308949a4bb..8ef7677c1ce 100644
--- a/addons/purchase_requisition/views/purchase_requisition_views.xml
+++ b/addons/purchase_requisition/views/purchase_requisition_views.xml
@@ -148,7 +148,7 @@
<field name="is_quantity_copy" invisible='1'/>
<field name="user_id" attrs="{'readonly': [('state','not in',('draft','in_progress','open'))]}"/>
<field name="type_id" attrs="{'readonly': [('state','!=','draft')]}" widget="selection"/>
- <field name="vendor_id" context="{'search_default_supplier':1, 'default_supplier':1, 'default_customer':0}" domain="[('supplier','=',True)]" attrs="{'required': [('is_quantity_copy', '=', 'none')], 'readonly': [('state', 'in', ['ongoing','done'])]}"/>
+ <field name="vendor_id" context="{'res_partner_search_mode': 'supplier'}" attrs="{'required': [('is_quantity_copy', '=', 'none')], 'readonly': [('state', 'in', ['ongoing','done'])]}"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</group>
<group>
diff --git a/addons/purchase_requisition/views/purchase_views.xml b/addons/purchase_requisition/views/purchase_views.xml
index 2ef157538e6..1a0c99b6f8c 100644
--- a/addons/purchase_requisition/views/purchase_views.xml
+++ b/addons/purchase_requisition/views/purchase_views.xml
@@ -8,7 +8,7 @@
<field name="arch" type="xml">
<field name="partner_id" position="replace">
<field name="is_quantity_copy" invisible="1"/>
- <field name="partner_id" context="{'search_default_supplier':1, 'default_supplier':1, 'default_customer':0}" domain="[('supplier','=',True)]" attrs="{'readonly': ['|', ('is_quantity_copy', '=', 'none'), ('state', 'in', ['purchase', 'done', 'cancel'])]}" force_save="1"/>
+ <field name="partner_id" context="{'res_partner_search_mode': 'supplier'}" attrs="{'readonly': ['|', ('is_quantity_copy', '=', 'none'), ('state', 'in', ['purchase', 'done', 'cancel'])]}" force_save="1"/>
</field>
<field name="partner_ref" position="after">
<field name="requisition_id" domain="[('state', 'in', ('in_progress', 'open', 'ongoing')), ('vendor_id', 'in', (partner_id, False))]"/>
diff --git a/addons/purchase_stock/tests/test_replenish_wizard.py b/addons/purchase_stock/tests/test_replenish_wizard.py
index 08d4d78310f..08bb1f998e3 100644
--- a/addons/purchase_stock/tests/test_replenish_wizard.py
+++ b/addons/purchase_stock/tests/test_replenish_wizard.py
@@ -6,7 +6,7 @@ from odoo.addons.stock.tests.common import TestStockCommon
class TestReplenishWizard(TestStockCommon):
def setUp(self):
super(TestReplenishWizard, self).setUp()
- self.vendor = self.env['res.partner'].create(dict(name='The Replenisher', supplier=True))
+ self.vendor = self.env['res.partner'].create(dict(name='The Replenisher'))
self.product1_price = 500
# Create a supplier info witch the previous vendor
diff --git a/addons/sale/models/res_partner.py b/addons/sale/models/res_partner.py
index fac5165f55f..fa9e296580f 100644
--- a/addons/sale/models/res_partner.py
+++ b/addons/sale/models/res_partner.py
@@ -40,3 +40,11 @@ class ResPartner(models.Model):
('state', 'in', ['sent', 'sale', 'done'])
], limit=1)
return can_edit_vat and not bool(has_so)
+
+ def _get_name_search_join_clause(self):
+ res = super()._get_name_search_join_clause()
+ partner_search_mode = self.env.context.get('res_partner_search_mode')
+ if partner_search_mode == 'customer':
+ join_clause = "LEFT JOIN {table} ON res_partner.id = {table}.partner_id".format(table=self.env['sale.order']._table)
+ return '%s %s' % (res, join_clause) if res else join_clause
+ return res
diff --git a/addons/sale/views/res_partner_views.xml b/addons/sale/views/res_partner_views.xml
index d8508ec340d..f7dd6257c69 100644
--- a/addons/sale/views/res_partner_views.xml
+++ b/addons/sale/views/res_partner_views.xml
@@ -42,7 +42,6 @@
<div name="button_box" position="inside">
<button class="oe_stat_button" type="action" name="%(sale.act_res_partner_2_sale_order)d"
groups="sales_team.group_sale_salesman"
- attrs="{'invisible': [('customer', '=', False)]}"
icon="fa-usd">
<field string="Sales" name="sale_order_count" widget="statinfo"/>
</button>
diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml
index e0bc1ef3632..3d2857b78e4 100644
--- a/addons/sale/views/sale_views.xml
+++ b/addons/sale/views/sale_views.xml
@@ -287,7 +287,7 @@
</div>
<group>
<group>
- <field name="partner_id" widget="res_partner_many2one" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1, 'show_vat': True}" options='{"always_reload": True}'/>
+ <field name="partner_id" widget="res_partner_many2one" context="{'res_partner_search_mode': 'customer', 'show_address': 1, 'show_vat': True}" options='{"always_reload": True}'/>
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}" options='{"always_reload": True}'/>
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}" options='{"always_reload": True}'/>
</group>
diff --git a/addons/sale_coupon/tests/common.py b/addons/sale_coupon/tests/common.py
index e6b8bd1b359..a5db1748b39 100644
--- a/addons/sale_coupon/tests/common.py
+++ b/addons/sale_coupon/tests/common.py
@@ -20,7 +20,6 @@ class TestSaleCouponCommon(TestSaleProductAttributeValueSetup):
# create partner for sale order.
self.steve = self.env['res.partner'].create({
'name': 'Steve Bucknor',
- 'customer': True,
'email': 'steve.bucknor@example.com',
})
diff --git a/addons/sale_coupon/tests/test_program_numbers.py b/addons/sale_coupon/tests/test_program_numbers.py
index fa134498946..610c373adb1 100644
--- a/addons/sale_coupon/tests/test_program_numbers.py
+++ b/addons/sale_coupon/tests/test_program_numbers.py
@@ -19,7 +19,6 @@ class TestSaleCouponProgramNumbers(TestSaleCouponCommon):
self.littleServer = self.env.ref('product.consu_delivery_02')
self.steve = self.env['res.partner'].create({
'name': 'Steve Bucknor',
- 'customer': True,
'email': 'steve.bucknor@example.com',
})
self.empty_order = self.env['sale.order'].create({
diff --git a/addons/sale_purchase/tests/common.py b/addons/sale_purchase/tests/common.py
index 6012de38181..5d96690b627 100644
--- a/addons/sale_purchase/tests/common.py
+++ b/addons/sale_purchase/tests/common.py
@@ -35,7 +35,6 @@ class TestCommonSalePurchaseNoChart(TestCommonSaleNoChart):
cls.partner_vendor_service = cls.env['res.partner'].create({
'name': 'Super Service Supplier',
'email': 'supplier.serv@supercompany.com',
- 'supplier': True,
})
cls.service_purchase_1 = cls.env['product.product'].create({
diff --git a/addons/sale_timesheet/tests/test_project_billing.py b/addons/sale_timesheet/tests/test_project_billing.py
index da6b5ee6eb6..7f0d533af8c 100644
--- a/addons/sale_timesheet/tests/test_project_billing.py
+++ b/addons/sale_timesheet/tests/test_project_billing.py
@@ -22,7 +22,6 @@ class TestProjectBilling(TestCommonSaleTimesheetNoChart):
cls.partner_2 = cls.env['res.partner'].create({
'name': 'Customer from the South',
'email': 'customer.usd@south.com',
- 'customer': True,
'property_account_payable_id': cls.account_payable.id,
'property_account_receivable_id': cls.account_receivable.id,
})
diff --git a/addons/sale_timesheet/wizard/project_create_sale_order.py b/addons/sale_timesheet/wizard/project_create_sale_order.py
index 26e11d11a0f..4c9c4e0faa7 100644
--- a/addons/sale_timesheet/wizard/project_create_sale_order.py
+++ b/addons/sale_timesheet/wizard/project_create_sale_order.py
@@ -27,7 +27,7 @@ class ProjectCreateSalesOrder(models.TransientModel):
return result
project_id = fields.Many2one('project.project', "Project", domain=[('sale_line_id', '=', False)], help="Project for which we are creating a sales order", required=True)
- partner_id = fields.Many2one('res.partner', string="Customer", domain=[('customer', '=', True)], required=True, help="Customer of the sales order")
+ partner_id = fields.Many2one('res.partner', string="Customer", required=True, help="Customer of the sales order")
product_id = fields.Many2one('product.product', domain=[('type', '=', 'service'), ('invoice_policy', '=', 'delivery'), ('service_type', '=', 'timesheet')], string="Service", help="Product of the sales order item. Must be a service invoiced based on timesheets on tasks.")
price_unit = fields.Float("Unit Price", help="Unit price of the sales order item.")
currency_id = fields.Many2one('res.currency', string="Currency", related='product_id.currency_id', readonly=False)
diff --git a/addons/stock/data/stock_demo.xml b/addons/stock/data/stock_demo.xml
index 43154eef9f8..ceaf8bad0aa 100644
--- a/addons/stock/data/stock_demo.xml
+++ b/addons/stock/data/stock_demo.xml
@@ -135,8 +135,6 @@
<!-- Child Company 1-->
<record id="res_partner_company_1" model="res.partner">
<field name="name">My Company, Chicago</field>
- <field eval="1" name="customer"/>
- <field eval="1" name="supplier"/>
<field name="is_company">1</field>
<field eval="1" name="active"/>
<field name="street">90 Streets Avenue</field>
diff --git a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
index a7b6d7ad544..f56f2d9d282 100644
--- a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
+++ b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
@@ -125,8 +125,6 @@ class ValuationReconciliationTestCase(AccountingTestCase):
self.test_partner = self.env['res.partner'].create({
'name': 'Ruben Rybnik',
- 'supplier': True,
- 'customer': True,
})
self.product_price_unit = 66.0
diff --git a/addons/survey/tests/common.py b/addons/survey/tests/common.py
index def5c81e2bb..bf73f5ecb47 100644
--- a/addons/survey/tests/common.py
+++ b/addons/survey/tests/common.py
@@ -60,7 +60,6 @@ class SurveyCase(common.SavepointCase):
self.customer = self.env['res.partner'].create({
'name': 'Caroline Customer',
'email': 'customer@example.com',
- 'customer': True,
})
self.survey = self.env['survey.survey'].with_user(self.survey_manager).create({
diff --git a/addons/web/static/tests/fields/relational_fields/field_many2one_tests.js b/addons/web/static/tests/fields/relational_fields/field_many2one_tests.js
index b32f8478ccf..8145990839f 100644
--- a/addons/web/static/tests/fields/relational_fields/field_many2one_tests.js
+++ b/addons/web/static/tests/fields/relational_fields/field_many2one_tests.js
@@ -338,7 +338,7 @@ QUnit.module('fields', {}, function () {
'<field ' +
'name="trululu" ' +
'string="custom label" ' +
- 'context="{\'search_default_customer\':1, \'show_address\': 1}" ' +
+ 'context="{\'show_address\': 1}" ' +
'options="{\'always_reload\': True}"' +
'/>' +
'</group>' +
diff --git a/addons/website_crm_partner_assign/views/res_partner_views.xml b/addons/website_crm_partner_assign/views/res_partner_views.xml
index dba9d112162..bc42280abfb 100644
--- a/addons/website_crm_partner_assign/views/res_partner_views.xml
+++ b/addons/website_crm_partner_assign/views/res_partner_views.xml
@@ -137,7 +137,7 @@
</group>
</xpath>
<xpath expr="//group[@name='sale']" position="inside">
- <field name="assigned_partner_id" groups="base.group_no_one" attrs="{'invisible': [('customer','=', False)]}"/>
+ <field name="assigned_partner_id" groups="base.group_no_one"/>
</xpath>
</data>
</field>
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 823011b0d03..93605643fd3 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -635,7 +635,6 @@ class WebsiteSale(http.Controller):
if k not in ('field_required', 'partner_id', 'callback', 'submitted'): # classic case
_logger.debug("website_sale postprocess: %s value has been dropped (empty or not writable)" % k)
- new_values['customer'] = True
new_values['team_id'] = request.website.salesteam_id and request.website.salesteam_id.id
new_values['user_id'] = request.website.salesperson_id and request.website.salesperson_id.id
diff --git a/addons/website_slides/tests/common.py b/addons/website_slides/tests/common.py
index 788bf70b9e2..5be2442d96b 100644
--- a/addons/website_slides/tests/common.py
+++ b/addons/website_slides/tests/common.py
@@ -37,7 +37,6 @@ class SlidesCase(common.SavepointCase):
self.customer = self.env['res.partner'].create({
'name': 'Caroline Customer',
'email': 'customer@example.com',
- 'customer': True,
})
self.channel = self.env['slide.channel'].with_user(self.user_publisher).create({
diff --git a/odoo/addons/base/data/res_partner_data.xml b/odoo/addons/base/data/res_partner_data.xml
index 7e76d1a809e..ee4b4fbf31c 100644
--- a/odoo/addons/base/data/res_partner_data.xml
+++ b/odoo/addons/base/data/res_partner_data.xml
@@ -4,7 +4,6 @@
<record id="main_partner" model="res.partner" context="{'default_is_company': True}">
<field name="name">My Company</field>
<field name="company_id" eval="None"/>
- <field name="customer" eval="False"/>
<field name="is_company" eval="True"/>
<field name="street"></field>
<field name="city"></field>
@@ -18,7 +17,6 @@
<record model="res.partner" id="base.partner_root">
<field name="name">System</field>
<field name="company_id" ref="main_company"/>
- <field name="customer" eval="False"/>
<field name="email">root@example.com</field>
<field name="active" eval="False"/>
</record>
@@ -26,7 +24,6 @@
<record model="res.partner" id="base.partner_admin">
<field name="name">Administrator</field>
<field name="company_id" ref="main_company"/>
- <field name="customer" eval="False"/>
<field name="email">admin@example.com</field>
<field name="image" type="base64" file="base/static/img/avatar_grey.png"/>
</record>
diff --git a/odoo/addons/base/data/res_partner_demo.xml b/odoo/addons/base/data/res_partner_demo.xml
index 35fffb4df8d..39e3c8dedd6 100644
--- a/odoo/addons/base/data/res_partner_demo.xml
+++ b/odoo/addons/base/data/res_partner_demo.xml
@@ -42,8 +42,6 @@
<record id="res_partner_1" model="res.partner">
<field name="name">Wood Corner</field>
<field eval="[(6, 0, [ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
- <field name="supplier">1</field>
- <field eval="0" name="customer"/>
<field name="is_company">1</field>
<field name="street">1164 Cambridge Drive</field>
<field name="city">White Tanks</field>
@@ -71,7 +69,6 @@
</record>
<record id="res_partner_3" model="res.partner">
<field name="name">Gemini Furniture</field>
- <field name="supplier">1</field>
<field eval="[(6, 0, [ref('res_partner_category_8'), ref('res_partner_category_14')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">1128 Lunetta Street</field>
@@ -88,8 +85,6 @@
<record id="res_partner_4" model="res.partner">
<field name="name">Ready Mat</field>
<field eval="[(6, 0, [ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
- <field eval="0" name="customer"/>
- <field eval="1" name="supplier"/>
<field name="is_company">1</field>
<field name="street">92 Emily Drive</field>
<field name="city">Columbia</field>
@@ -118,8 +113,6 @@
<record id="res_partner_12" model="res.partner">
<field name="name">Azure Interior</field>
<field eval="[(6, 0, [ref('res_partner_category_11')])]" name="category_id"/>
- <field name="supplier">1</field>
- <field name="customer">1</field>
<field name="is_company">1</field>
<field name="street">3404 Edgewood Road</field>
<field name="city">Jonesboro</field>
@@ -152,8 +145,6 @@
<field name="function">Service Manager</field>
<field name="email">willie.burke80@example.com</field>
<field name="phone">(846)-523-2111</field>
- <field name="supplier">1</field>
- <field eval="0" name="customer"/>
</record>
<record id="res_partner_address_2" model="res.partner">
<field name="name">Ron Gibson</field>
@@ -161,8 +152,6 @@
<field name="function">Store Manager</field>
<field name="email">ron.gibson76@example.com</field>
<field name="phone">(976)-397-4091</field>
- <field name="supplier">1</field>
- <field eval="0" name="customer"/>
</record>
<record id="res_partner_address_3" model="res.partner">
<field name="name">Douglas Fletcher</field>
@@ -191,8 +180,6 @@
<field name="function">Production Supervisor</field>
<field name="email">billy.fox45@example.com</field>
<field name="phone">(915)-498-5611</field>
- <field name="supplier">1</field>
- <field eval="0" name="customer"/>
</record>
<record id="res_partner_address_10" model="res.partner">
<field name="name">Jesse Brown</field>
@@ -268,10 +255,8 @@
<field name="name">Tom Ruiz</field>
<field name="parent_id" eval="ref('res_partner_1')"/>
<field name="function">Software Developer</field>
- <field name="supplier">1</field>
<field name="email">tom.ruiz89@example.com</field>
<field name="phone">(102)-834-1602</field>
- <field eval="0" name="customer"/>
</record>
<record id="res_partner_address_28" model="res.partner">
<field name="name">Colleen Diaz</field>
@@ -293,8 +278,6 @@
<field name="function">Sales Representative</field>
<field name="email">addison.olson28@example.com</field>
<field name="phone">(223)-399-7637</field>
- <field name="supplier">1</field>
- <field eval="0" name="customer"/>
</record>
<record id="res_partner_address_32" model="res.partner">
<field name="name">Sandra Neal</field>
@@ -321,14 +304,12 @@
<field name="name">Chester Reed</field>
<field name="parent_id" eval="ref('main_partner')"/>
<field name="function">Chief Executive Officer (CEO)</field>
- <field name="customer" eval="False"/>
<field name="email">chester.reed79@example.com</field>
<field name="phone">(979)-904-8902</field>
</record>
<record id="res_partner_main2" model="res.partner">
<field name="name">Dwayne Newman</field>
<field name="function">Chief Operations Officer (COO)</field>
- <field name="customer" eval="False"/>
<field name="parent_id" eval="ref('main_partner')"/>
<field name="email">dwayne.newman28@example.com</field>
<field name="phone">(614)-177-4937</field>
diff --git a/odoo/addons/base/data/res_users_demo.xml b/odoo/addons/base/data/res_users_demo.xml
index d2eb5c064b8..4f4c580dfb8 100644
--- a/odoo/addons/base/data/res_users_demo.xml
+++ b/odoo/addons/base/data/res_users_demo.xml
@@ -5,7 +5,6 @@
<record id="partner_demo" model="res.partner">
<field name="name">Marc Demo</field>
<field name="company_id" ref="main_company"/>
- <field name="customer" eval="False"/>
<field name="company_name">YourCompany</field>
<field name="street">3575 Buena Vista Avenue</field>
<field name="city">Eugene</field>
@@ -64,8 +63,6 @@
<record id="partner_demo_portal" model="res.partner">
<field name="name">Joel Willis</field>
<field name="email">joel.willis63@example.com</field>
- <field name="supplier" eval="False"/>
- <field name="customer" eval="True"/>
<field name="street">858 Lynn Street</field>
<field name="city">Bayonne</field>
<field model="res.country.state" name="state_id" search="[('code','ilike','NJ')]"/>
diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py
index 0d76629f661..cc5ddc75087 100644
--- a/odoo/addons/base/models/res_company.py
+++ b/odoo/addons/base/models/res_company.py
@@ -219,7 +219,6 @@ class Company(models.Model):
'name': vals['name'],
'is_company': True,
'image': vals.get('logo'),
- 'customer': False,
'email': vals.get('email'),
'phone': vals.get('phone'),
'website': vals.get('website'),
diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py
index 3e84b921882..ce996272ac3 100644
--- a/odoo/addons/base/models/res_partner.py
+++ b/odoo/addons/base/models/res_partner.py
@@ -172,10 +172,6 @@ class Partner(models.Model):
column2='category_id', string='Tags', default=_default_category)
credit_limit = fields.Float(string='Credit Limit')
active = fields.Boolean(default=True)
- customer = fields.Boolean(string='Is a Customer', default=True,
- help="Check this box if this contact is a customer. It can be selected in sales orders.")
- supplier = fields.Boolean(string='Is a Vendor',
- help="Check this box if this contact is a vendor. It can be selected in purchase orders.")
employee = fields.Boolean(help="Check this box if this contact is an Employee.")
function = fields.Char(string='Job Position')
type = fields.Selection(
@@ -760,6 +756,9 @@ class Partner(models.Model):
return super(Partner, self)._search(args, offset=offset, limit=limit, order=order,
count=count, access_rights_uid=access_rights_uid)
+ def _get_name_search_join_clause(self):
+ return ''
+
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
self = self.with_user(name_get_uid or self.env.uid)
@@ -782,16 +781,21 @@ class Partner(models.Model):
unaccent = get_unaccent_wrapper(self.env.cr)
+ join_clause = self._get_name_search_join_clause()
+
query = """SELECT res_partner.id
FROM {from_str}
+ {join}
{where} ({email} {operator} {percent}
OR {display_name} {operator} {percent}
OR {reference} {operator} {percent}
OR {vat} {operator} {percent})
-- don't panic, trust postgres bitmap
- ORDER BY {display_name} {operator} {percent} desc,
+ GROUP BY res_partner.id
+ ORDER BY COUNT(*) DESC, {display_name} {operator} {percent} desc,
{display_name}
""".format(from_str=from_str,
+ join=join_clause,
where=where_str,
operator=operator,
email=unaccent('res_partner.email'),
diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py
index adee7826fff..d7ef51862cd 100644
--- a/odoo/addons/base/models/res_users.py
+++ b/odoo/addons/base/models/res_users.py
@@ -437,7 +437,7 @@ class Users(models.Model):
@api.model_create_multi
def create(self, vals_list):
- users = super(Users, self.with_context(default_customer=False)).create(vals_list)
+ users = super(Users, self).create(vals_list)
for user in users:
user.partner_id.active = user.active
if user.partner_id.company_id:
diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py
index fcce10430ef..b0e9a4bfdad 100644
--- a/odoo/addons/base/tests/test_api.py
+++ b/odoo/addons/base/tests/test_api.py
@@ -465,16 +465,16 @@ class TestAPI(common.TransactionCase):
def test_80_filter(self):
""" Check filter on recordsets. """
ps = self.env['res.partner'].search([])
- customers = ps.browse([p.id for p in ps if p.customer])
+ customers = ps.browse([p.id for p in ps if p.employee])
# filter on a single field
- self.assertEqual(ps.filtered(lambda p: p.customer), customers)
- self.assertEqual(ps.filtered('customer'), customers)
+ self.assertEqual(ps.filtered(lambda p: p.employee), customers)
+ self.assertEqual(ps.filtered('employee'), customers)
# filter on a sequence of fields
self.assertEqual(
- ps.filtered(lambda p: p.parent_id.customer),
- ps.filtered('parent_id.customer')
+ ps.filtered(lambda p: p.parent_id.employee),
+ ps.filtered('parent_id.employee')
)
@mute_logger('odoo.models')
diff --git a/odoo/addons/base/tests/test_orm.py b/odoo/addons/base/tests/test_orm.py
index 33a36239457..b16d229b495 100644
--- a/odoo/addons/base/tests/test_orm.py
+++ b/odoo/addons/base/tests/test_orm.py
@@ -315,7 +315,7 @@ class TestInherits(TransactionCase):
user_foo = self.env['res.users'].create({
'name': 'Foo',
'login': 'foo',
- 'supplier': True,
+ 'employee': True,
})
foo_before, = user_foo.read()
del foo_before['__last_update']
@@ -327,7 +327,7 @@ class TestInherits(TransactionCase):
self.assertEqual(user_bar.name, 'Foo (copy)')
self.assertEqual(user_bar.login, 'bar')
- self.assertEqual(user_foo.supplier, user_bar.supplier)
+ self.assertEqual(user_foo.employee, user_bar.employee)
self.assertNotEqual(user_foo.id, user_bar.id)
self.assertNotEqual(user_foo.partner_id.id, user_bar.partner_id.id)
diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml
index c6b748463fb..ee59fe130c0 100644
--- a/odoo/addons/base/views/res_partner_views.xml
+++ b/odoo/addons/base/views/res_partner_views.xml
@@ -149,7 +149,7 @@
<field name="parent_id"
widget="res_partner_many2one"
placeholder="Company"
- domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'default_supplier': supplier, 'default_customer': customer, 'show_vat': True}"
+ domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'show_vat': True}"
attrs="{'invisible': ['|', '&amp;', ('is_company','=', True),('parent_id', '=', False),('company_name', '!=', False),('company_name', '!=', '')]}"/>
<field name="company_name" attrs="{'invisible': ['|', '|', ('company_name', '=', False), ('company_name', '=', ''), ('is_company', '=', True)]}"/>
<button name="create_company" type="object" class="oe_edit_only btn-link"
@@ -186,8 +186,6 @@
<field name="phone" widget="phone"/>
<field name="mobile" widget="phone"/>
<field name="email" widget="email" context="{'gravatar_image': True}"/>
- <field name="customer" invisible="1"/>
- <field name="supplier" invisible="1"/>
</group>
</group>
</sheet>
@@ -222,7 +220,7 @@
<field name="parent_id"
widget="res_partner_many2one"
placeholder="Company"
- domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'default_supplier': supplier, 'default_customer': customer, 'show_vat': True}"
+ domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'show_vat': True}"
attrs="{'invisible': ['|', '&amp;', ('is_company','=', True),('parent_id', '=', False),('company_name', '!=', False),('company_name', '!=', '')]}"/>
<field name="company_name" attrs="{'invisible': ['|', '|', ('company_name', '=', False), ('company_name', '=', ''), ('is_company', '=', True)]}"/>
<button name="create_company" type="object" class="oe_edit_only btn-link"
@@ -283,7 +281,7 @@
<notebook colspan="4">
<page string="Contacts &amp; Addresses" autofocus="autofocus">
- <field name="child_ids" mode="kanban" context="{'default_parent_id': active_id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier, 'default_customer': customer, 'default_lang': lang, 'default_user_id': user_id}">
+ <field name="child_ids" mode="kanban" context="{'default_parent_id': active_id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_lang': lang, 'default_user_id': user_id}">
<kanban>
<field name="id"/>
<field name="color"/>
@@ -306,9 +304,7 @@
<field name="lang"/>
<!-- fields in form x2many view to diminish requests -->
<field name="comment"/>
- <field name="customer"/>
<field name="display_name"/>
- <field name="supplier"/>
<templates>
<t t-name="kanban-box">
<t t-set="color" t-value="kanban_color(record.color.raw_value)"/>
@@ -380,8 +376,6 @@
<field name="image_medium" widget="image" class="oe_avatar" nolabel="1"/>
</group>
</group>
- <field name="supplier" invisible="True"/>
- <field name="customer" invisible="True"/>
<field name="lang" invisible="True"/>
<field name="image" invisible="True"/>
<field name="user_id" invisible="True"/>
@@ -395,11 +389,9 @@
<page name='sales_purchases' string="Sales &amp; Purchase">
<group name="container_row_2">
<group string="Sales" name="sale" priority="1">
- <field name="customer"/>
- <field name="user_id" attrs="{'invisible': [('customer','=', False)]}"/>
+ <field name="user_id"/>
</group>
<group string="Purchase" name="purchase" priority="2">
- <field name="supplier"/>
</group>
<group name="misc" string="Misc">
<field name="ref" string="Reference"/>
@@ -474,8 +466,6 @@
<filter string="Individuals" name="type_person" domain="[('is_company','=',False)]"/>
<filter string="Companies" name="type_company" domain="[('is_company','=',True)]"/>
<separator/>
- <filter string="Customers" name="customer" domain="[('customer','=',True), ('parent_id', '=', False)]"/>
- <filter string="Vendors" name="supplier" domain="[('supplier','=',True), ('parent_id', '=', False)]"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<separator/>
<field name="category_id" string="Tag" filter_domain="[('category_id','child_of', self)]"/>
@@ -559,7 +549,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_mode">kanban,tree,form</field>
- <field name="context">{"search_default_customer":1}</field>
+ <field name="context">{'res_partner_search_mode': 'customer'}</field>
<field name="search_view_id" ref="view_res_partner_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@@ -594,7 +584,7 @@
<field name="res_model">res.partner</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[]</field>
- <field name="context">{'default_customer':1, 'search_default_customer':1, 'default_is_company': True}</field>
+ <field name="context">{'res_partner_search_mode': 'customer', 'default_is_company': True}</field>
<field name="filter" eval="True"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@@ -629,7 +619,7 @@
<field name="res_model">res.partner</field>
<field name="domain">[]</field>
<field name="view_mode">kanban,tree,form</field>
- <field name="context">{'search_default_supplier': 1,'default_customer': 0,'default_supplier': 1, 'default_is_company': True}</field>
+ <field name="context">{'res_partner_search_mode': 'supplier', 'default_is_company': True}</field>
<field name="filter" eval="True"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@@ -664,7 +654,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="domain">[('employee','=',1)]</field>
- <field name="context">{'default_customer':0, 'default_supplier':0 , 'default_employee':1}</field>
+ <field name="context">{'default_employee':1}</field>
<field name="filter" eval="True"/>
</record>
diff --git a/odoo/addons/test_impex/tests/contacts.json b/odoo/addons/test_impex/tests/contacts.json
index 00e1f3415e1..a024d2b7ee4 100644
--- a/odoo/addons/test_impex/tests/contacts.json
+++ b/odoo/addons/test_impex/tests/contacts.json
@@ -1 +1 @@
-[["Wood y Wood Pecker", "", "Snow Street, 25", "Kainuu", "Finland", "Vendor", "1", "0", "1", ""], ["Roger Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Vendor", "1", "0", "0", "Wood y Wood Pecker"], ["Sharon Pecker", "Delivery Address", "Snow Street, 28", "Kainuu", "Finland", "Vendor", "1", "0", "0", "Wood y Wood Pecker"], ["Thomas Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Vendor", "1", "0", "0", "Wood y Wood Pecker"], ["Norseman Roundabout", "", "Atonium Street, 45a", "Brussels", "Belgium", "Vendor", "1", "0", "1", ""], ["Yvan Holiday", "Invoice Address", "Atonium Street, 45b", "Brussels", "Belgium", "Vendor", "1", "0", "0", "Norseman Roundabout"], ["Jack Unsworth", "Contact", "Atonium Street, 45a", "Brussels", "Belgium", "Vendor", "1", "0", "0", "Norseman Roundabout"]]
+[["Wood y Wood Pecker", "", "Snow Street, 25", "Kainuu", "Finland", "Vendor", "1", ""], ["Roger Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Vendor", "0", "Wood y Wood Pecker"], ["Sharon Pecker", "Delivery Address", "Snow Street, 28", "Kainuu", "Finland", "Vendor", "0", "Wood y Wood Pecker"], ["Thomas Pecker", "Contact", "Snow Street, 27", "Kainuu", "Finland", "Vendor", "0", "Wood y Wood Pecker"], ["Norseman Roundabout", "", "Atonium Street, 45a", "Brussels", "Belgium", "Vendor", "1", ""], ["Yvan Holiday", "Invoice Address", "Atonium Street, 45b", "Brussels", "Belgium", "Vendor", "0", "Norseman Roundabout"], ["Jack Unsworth", "Contact", "Atonium Street, 45a", "Brussels", "Belgium", "Vendor", "0", "Norseman Roundabout"]]
diff --git a/odoo/addons/test_impex/tests/test_load.py b/odoo/addons/test_impex/tests/test_load.py
index 0cb59edb6f7..2765d458a40 100644
--- a/odoo/addons/test_impex/tests/test_load.py
+++ b/odoo/addons/test_impex/tests/test_load.py
@@ -985,7 +985,7 @@ class test_realworld(common.TransactionCase):
def test_backlink(self):
fnames = ["name", "type", "street", "city", "country_id", "category_id",
- "supplier", "customer", "is_company", "parent_id"]
+ "is_company", "parent_id"]
data = json.loads(pkgutil.get_data(self.__module__, 'contacts.json').decode('utf-8'))
result = self.env['res.partner'].load(fnames, data)
self.assertFalse(result['messages'])