From 19de91d4b9da23bf27b44b45bca814a5e1ad5405 Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Wed, 15 Feb 2012 17:33:31 +0530 Subject: [PATCH 001/571] [FIX]purchase: removed wait ad wait_auth which unnecessary lp bug: https://launchpad.net/bugs/932059 fixed bzr revid: mma@tinyerp.com-20120215120331-7uc0ybsv90oayfw2 --- addons/purchase/purchase.py | 1 - addons/purchase/purchase_view.xml | 3 +-- addons/purchase_requisition/purchase_requisition.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 5432067191d..b7c757c7468 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -143,7 +143,6 @@ class purchase_order(osv.osv): STATE_SELECTION = [ ('draft', 'Request for Quotation'), - ('wait', 'Waiting'), ('confirmed', 'Waiting Approval'), ('approved', 'Approved'), ('except_picking', 'Shipping Exception'), diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml index ec53ae76a7a..c72c985d8fa 100644 --- a/addons/purchase/purchase_view.xml +++ b/addons/purchase/purchase_view.xml @@ -196,13 +196,12 @@ - - - - + + + + ''')).getroot() @@ -104,15 +105,15 @@ class test_view_validation(unittest2.TestCase): assert not valid_att_in_field(invalid_form) assert valid_att_in_field(valid_form) - assert not valid_field_view(invalid_form) - assert valid_field_view(valid_form) + assert not valid_view(invalid_form) + assert valid_view(valid_form) def test_all_label_validation(self): assert not valid_att_in_label(invalid_form) assert valid_att_in_label(valid_form) - assert not valid_label_view(invalid_form) - assert valid_label_view(valid_form) + assert not valid_view(invalid_form) + assert valid_view(valid_form) def test_form_string_validation(self): assert not valid_att_in_form(invalid_form) @@ -153,15 +154,15 @@ class test_view_validation(unittest2.TestCase): assert not valid_type_in_colspan(invalid_form) assert valid_type_in_colspan(valid_form) - assert not valid_colspan_view(invalid_form) - assert valid_colspan_view(valid_form) + assert not valid_view(invalid_form) + assert valid_view(valid_form) def test_col_datatype_validation(self): assert not valid_type_in_col(invalid_form) assert valid_type_in_col(valid_form) - assert not valid_col_view(invalid_form) - assert valid_col_view(valid_form) + assert not valid_view(invalid_form) + assert valid_view(valid_form) if __name__ == '__main__': diff --git a/openerp/tools/view_validation.py b/openerp/tools/view_validation.py index 4bb47c54551..820d6ae96e5 100644 --- a/openerp/tools/view_validation.py +++ b/openerp/tools/view_validation.py @@ -42,41 +42,17 @@ def valid_type_in_col(arch): return False return True -def valid_colspan_view(arch): - for pred in [valid_type_in_colspan]: - if not pred(arch): - return False - return True - -def valid_col_view(arch): - for pred in [valid_type_in_col]: - if not pred(arch): - return False - return True - -def valid_field_view(arch): - for pred in [valid_att_in_field]: - if not pred(arch): - return False - return True - -def valid_label_view(arch): - for pred in [valid_att_in_label]: - if not pred(arch): - return False - return True - def valid_view(arch): if arch.tag == 'form': - for pred in [valid_page_in_book,valid_att_in_form]: + for pred in [valid_page_in_book,valid_att_in_form,valid_type_in_colspan,valid_type_in_col,valid_att_in_field,valid_att_in_label]: if not pred(arch): return False elif arch.tag == 'graph': - for pred in [valid_field_in_graph]: + for pred in [valid_field_in_graph,valid_type_in_colspan,valid_type_in_col,valid_att_in_field,valid_att_in_label]: if not pred(arch): return False elif arch.tag == 'tree': - for pred in [valid_field_in_tree]: + for pred in [valid_field_in_tree,valid_type_in_colspan,valid_type_in_col,valid_att_in_field,valid_att_in_label]: if not pred(arch): return False return True From 739a05c00af20fb0ab69aa333a96b83ca752e243 Mon Sep 17 00:00:00 2001 From: "pso (OpenERP)" Date: Mon, 30 Jul 2012 12:21:32 +0530 Subject: [PATCH 185/571] [IMP] mrp: Removed comment from __openerp__.py bzr revid: pso@tinyerp.com-20120730065132-x50rhei1ya36y3u5 --- addons/mrp/__openerp__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/mrp/__openerp__.py b/addons/mrp/__openerp__.py index 5f723f1b9df..bdf6f63b755 100644 --- a/addons/mrp/__openerp__.py +++ b/addons/mrp/__openerp__.py @@ -90,8 +90,6 @@ Dashboard provided by this module: 'demo_xml': [ 'mrp_demo.xml', ], - #TODO: This yml tests are needed to be completely reviewed again because the product wood panel is removed in product demo as it does not suit for new demo context of computer and consultant company - # so the ymls are too complex to change at this stage 'test': [ 'test/order_demo.yml', 'test/order_process.yml', From 6079bbff1944e6709f5e39c15d9242d7b356a866 Mon Sep 17 00:00:00 2001 From: "Purnendu Singh (OpenERP)" Date: Mon, 30 Jul 2012 15:30:11 +0530 Subject: [PATCH 186/571] [IMP] improve YML bzr revid: psi@tinyerp.com-20120730100011-zdonb109wm3t0702 --- addons/hr_expense/test/expense_process.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/hr_expense/test/expense_process.yml b/addons/hr_expense/test/expense_process.yml index af4d5aaec37..eae63c460fc 100644 --- a/addons/hr_expense/test/expense_process.yml +++ b/addons/hr_expense/test/expense_process.yml @@ -27,7 +27,6 @@ sep_expenses = self.browse(cr, uid, ref("sep_expenses"), context=context) assert sep_expenses.state == 'done', "Expense should be in 'Done' state." assert sep_expenses.voucher_id, "Expense should have link of Purchase Receipt." - assert sep_expenses.voucher_id.name == sep_expenses.name,"Receipt name is not correspond with expense name." assert sep_expenses.voucher_id.type == 'purchase', "Receipt type is not purchase receipt." assert sep_expenses.voucher_id.amount == sep_expenses.amount,"Receipt total amount is not correspond with expense total." assert len(sep_expenses.voucher_id.line_dr_ids) == len(sep_expenses.line_ids),"Lines of Receipt and expense line are not correspond." From 9b9e5f13496f5c4e0a2519705666fcd827be10d5 Mon Sep 17 00:00:00 2001 From: "Purnendu Singh (OpenERP)" Date: Mon, 30 Jul 2012 15:45:19 +0530 Subject: [PATCH 187/571] [IMP] hr_expense: Small change rename Paid to done as we are not paying the expence on the click of Generate Accounting Entries button bzr revid: psi@tinyerp.com-20120730101519-qq7bs1s5cpfc3vbf --- addons/hr_expense/hr_expense.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 26bcb4d1a12..6861696257c 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -86,10 +86,10 @@ class hr_expense_expense(osv.osv): ('cancelled', 'Refused'), ('confirm', 'Waiting Approval'), ('accepted', 'Approved'), - ('done', 'Paid'), + ('done', 'Done'), ], 'Status', readonly=True, help='When the expense request is created the status is \'Draft\'.\n It is confirmed by the user and request is sent to admin, the status is \'Waiting Confirmation\'.\ - \nIf the admin accepts it, the status is \'Accepted\'.\n If a receipt is made for the expense request, the status is \'Paid\'.'), + \nIf the admin accepts it, the status is \'Accepted\'.\n If a receipt is made for the expense request, the status is \'Done\'.'), } _defaults = { 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'hr.employee', context=c), From f10270c64a688964ac26b0e269b322f5750babd8 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 30 Jul 2012 15:53:52 +0530 Subject: [PATCH 188/571] [IMP]: crm*: Improved xml_id of demo cases so it can be generic bzr revid: rpa@tinyerp.com-20120730102352-wv3g29qk556mx5zc --- addons/crm/crm_data.xml | 8 +- addons/crm/crm_lead_demo.xml | 74 +++++++++---------- addons/crm/test/process/cancel_lead.yml | 16 ++-- .../crm/test/process/lead2opportunity2win.yml | 34 ++++----- addons/crm/test/ui/crm_demo.yml | 6 +- addons/crm/test/ui/delete_lead.yml | 2 +- addons/crm/test/ui/duplicate_lead.yml | 2 +- .../test/partner_assign.yml | 6 +- addons/crm_todo/crm_todo_demo.xml | 6 +- addons/sale_crm/test/sale_crm.yml | 4 +- 10 files changed, 79 insertions(+), 79 deletions(-) diff --git a/addons/crm/crm_data.xml b/addons/crm/crm_data.xml index 88179428ab5..58699da94ce 100644 --- a/addons/crm/crm_data.xml +++ b/addons/crm/crm_data.xml @@ -1,16 +1,16 @@ - + website - + phone - + direct - + email diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index e375fee882e..6dc464013f3 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -5,7 +5,7 @@ Demo Leads --> - + lead @@ -24,7 +24,7 @@ - + lead @@ -44,7 +44,7 @@ - + lead @@ -62,7 +62,7 @@ - + lead @@ -78,7 +78,7 @@ - + lead @@ -97,7 +97,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -135,7 +135,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -171,7 +171,7 @@ - + @@ -181,7 +181,7 @@ - + @@ -194,7 +194,7 @@ - + @@ -209,14 +209,14 @@ @@ -224,7 +224,7 @@ Demo Opportunities --> - + opportunity @@ -239,7 +239,7 @@ - + opportunity @@ -261,7 +261,7 @@ - + opportunity @@ -288,7 +288,7 @@ Kitchen design crm.lead - + html email @@ -298,7 +298,7 @@ Reply crm.lead - + html comment @@ -307,7 +307,7 @@ Reply crm.lead - + html @@ -317,7 +317,7 @@ Reply crm.lead - + html @@ -327,7 +327,7 @@ Your inquiry crm.lead - + html email @@ -335,7 +335,7 @@ - + opportunity @@ -358,7 +358,7 @@ - + opportunity @@ -380,7 +380,7 @@ - + opportunity @@ -397,7 +397,7 @@ - + opportunity @@ -420,7 +420,7 @@ L25 4RL - + opportunity @@ -433,7 +433,7 @@ - + opportunity @@ -446,7 +446,7 @@ - + opportunity @@ -468,7 +468,7 @@ - + opportunity @@ -489,7 +489,7 @@ - + opportunity @@ -511,7 +511,7 @@ - + opportunity @@ -522,7 +522,7 @@ - + opportunity @@ -536,8 +536,8 @@ diff --git a/addons/crm/test/process/cancel_lead.yml b/addons/crm/test/process/cancel_lead.yml index 34dd8310022..86aba99c0e0 100644 --- a/addons/crm/test/process/cancel_lead.yml +++ b/addons/crm/test/process/cancel_lead.yml @@ -2,12 +2,12 @@ I cancel unqualified lead. - !python {model: crm.lead}: | - self.case_cancel(cr, uid, [ref("crm_case_itisatelesalescampaign0")]) + self.case_cancel(cr, uid, [ref("crm_case_1")]) - I check cancelled lead. - !python {model: crm.lead}: | - lead = self.browse(cr, uid, ref('crm_case_itisatelesalescampaign0')) + lead = self.browse(cr, uid, ref('crm_case_1')) assert lead.stage_id.id == ref('crm.stage_lead7'), "Stage should be 'Dead' and is %s." % (lead.stage_id.name) assert lead.state == 'cancel', "Opportunity is not in 'cancel' state." assert lead.probability == 0.0, 'Opportunity probability is wrong and should be 0.0.' @@ -15,31 +15,31 @@ I reset cancelled lead into unqualified lead. - !python {model: crm.lead}: | - self.case_reset(cr, uid, [ref("crm_case_itisatelesalescampaign0")]) + self.case_reset(cr, uid, [ref("crm_case_1")]) - I check unqualified lead after reset. - - !assert {model: crm.lead, id: crm.crm_case_itisatelesalescampaign0, string: Lead is in draft state}: + !assert {model: crm.lead, id: crm.crm_case_1, string: Lead is in draft state}: - state == "draft" - I re-open the lead - !python {model: crm.lead}: | - self.case_open(cr, uid, [ref("crm_case_itisatelesalescampaign0")]) + self.case_open(cr, uid, [ref("crm_case_1")]) - I check stage and state of the re-opened lead - !python {model: crm.lead}: | - lead = self.browse(cr, uid, ref('crm.crm_case_itisatelesalescampaign0')) + lead = self.browse(cr, uid, ref('crm.crm_case_1')) assert lead.stage_id.id == ref('crm.stage_lead2'), "Opportunity stage should be 'Qualification'." assert lead.state == 'open', "Opportunity should be in 'open' state." - I escalate the lead to parent team. - !python {model: crm.lead}: | - self.case_escalate(cr, uid, [ref("crm_case_itisatelesalescampaign0")]) + self.case_escalate(cr, uid, [ref("crm_case_1")]) - I check the lead is correctly escalated to the parent team. - - !assert {model: crm.lead, id: crm.crm_case_itisatelesalescampaign0, string: Escalate lead to parent team}: + !assert {model: crm.lead, id: crm.crm_case_1, string: Escalate lead to parent team}: - section_id.name == "Sales Department" diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index c9ee3916e24..5053ed3088b 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -4,30 +4,30 @@ I open customer lead. - !python {model: crm.lead}: | - self.case_open(cr, uid, [ref("crm_case_qrecorp0")]) + self.case_open(cr, uid, [ref("crm_case_4")]) - I check lead state is "Open". - - !assert {model: crm.lead, id: crm.crm_case_qrecorp0, string: Lead in open state}: + !assert {model: crm.lead, id: crm.crm_case_4, string: Lead in open state}: - state == "open" - I create partner from lead. - - !record {model: crm.lead2partner, id: crm_lead2partner_id1, context: '{"active_model": "crm.lead", "active_ids": [ref("crm_case_qrecorp0")]}'}: + !record {model: crm.lead2partner, id: crm_lead2partner_id1, context: '{"active_model": "crm.lead", "active_ids": [ref("crm_case_4")]}'}: - !python {model: crm.lead2partner}: | - context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_qrecorp0')], 'active_id': ref('crm_case_qrecorp0')}) + context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_4')], 'active_id': ref('crm_case_4')}) self.make_partner(cr, uid ,[ref("crm_lead2partner_id1")], context=context) - I convert lead into opportunity for exiting customer. - !python {model: crm.lead}: | - self.convert_opportunity(cr, uid ,[ref("crm_case_qrecorp0")], ref("base.res_partner_2")) + self.convert_opportunity(cr, uid ,[ref("crm_case_4")], ref("base.res_partner_2")) - I check details of converted opportunity. - !python {model: crm.lead}: | - lead = self.browse(cr, uid, ref('crm_case_qrecorp0')) + lead = self.browse(cr, uid, ref('crm_case_4')) assert lead.type == 'opportunity', 'Lead is not converted to opportunity!' assert lead.partner_id.id == ref("base.res_partner_2"), 'Partner missmatch!' assert lead.stage_id.id == ref("stage_lead1"), 'Stage of opportunity is incorrect!' @@ -36,7 +36,7 @@ - !python {model: crm.opportunity2phonecall}: | import time - context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_qrecorp0')]}) + context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_4')]}) call_id = self.create(cr, uid, {'date': time.strftime('%Y-%m-%d %H:%M:%S'), 'name': "Bonjour M. Jean, Comment êtes-vous? J'ai obtenu votre demande. peut-on parler au sujet de ce pour quelques minutes?"}, context=context) self.action_schedule(cr, uid, [call_id], context=context) @@ -44,28 +44,28 @@ I check that phonecall is scheduled for that opportunity. - !python {model: crm.phonecall}: | - ids = self.search(cr, uid, [('opportunity_id', '=', ref('crm_case_qrecorp0'))]) + ids = self.search(cr, uid, [('opportunity_id', '=', ref('crm_case_4'))]) assert len(ids), 'phonecall is not scheduled' - Now I schedule meeting with customer. - !python {model: crm.lead}: | - self.action_makeMeeting(cr, uid, [ref('crm_case_qrecorp0')]) + self.action_makeMeeting(cr, uid, [ref('crm_case_4')]) - After communicated with customer, I put some notes with contract details. - !python {model: crm.lead}: | - self.message_append_note(cr, uid, [ref('crm_case_qrecorp0')], subject='Test note', body='ces détails envoyés par le client sur ​​le FAX pour la qualité') + self.message_append_note(cr, uid, [ref('crm_case_4')], subject='Test note', body='ces détails envoyés par le client sur ​​le FAX pour la qualité') - I win this opportunity - !python {model: crm.lead}: | - self.case_mark_won(cr, uid, [ref("crm_case_qrecorp0")]) + self.case_mark_won(cr, uid, [ref("crm_case_4")]) - I check details of the opportunity after having won the opportunity. - !python {model: crm.lead}: | - lead = self.browse(cr, uid, ref('crm_case_qrecorp0')) + lead = self.browse(cr, uid, ref('crm_case_4')) assert lead.stage_id.id == ref('crm.stage_lead6'), "Opportunity stage should be 'Won'." assert lead.state == 'done', "Opportunity is not in 'done' state!" assert lead.probability == 100.0, "Revenue probability should be 100.0!" @@ -73,14 +73,14 @@ I convert mass lead into opportunity customer. - !python {model: crm.lead2opportunity.partner.mass}: | - context.update({'active_model': 'crm.lead', 'active_ids': [ref("crm_case_employee0"), ref("crm_case_electonicgoodsdealer0")], 'active_id': ref("crm_case_qrecorp0")}) + context.update({'active_model': 'crm.lead', 'active_ids': [ref("crm_case_11"), ref("crm_case_2")], 'active_id': ref("crm_case_4")}) id = self.create(cr, uid, {'user_ids': [ref('base.user_root')], 'section_id': ref('crm.section_sales_department')}, context=context) self.mass_convert(cr, uid, [id], context=context) - Now I check first lead converted on opportunity. - !python {model: crm.lead}: | - opp = self.browse(cr, uid, ref('crm_case_employee0')) + opp = self.browse(cr, uid, ref('crm_case_11')) assert opp.name == "Need Info about Onsite Intervention", "Opportunity name not correct" assert opp.type == 'opportunity', 'Lead is not converted to opportunity!' assert opp.partner_id.name == "Agrolait", 'Partner missmatch!' @@ -89,7 +89,7 @@ Then check for second lead converted on opportunity. - !python {model: crm.lead}: | - opp = self.browse(cr, uid, ref('crm_case_electonicgoodsdealer0')) + opp = self.browse(cr, uid, ref('crm_case_2')) assert opp.name == "Interest in Your New Product", "Opportunity name not correct" assert opp.type == 'opportunity', 'Lead is not converted to opportunity!' assert opp.stage_id.id == ref("stage_lead1"), 'Stage of probability is incorrect!' @@ -97,12 +97,12 @@ I loose the second opportunity - !python {model: crm.lead}: | - self.case_mark_lost(cr, uid, [ref("crm_case_electonicgoodsdealer0")]) + self.case_mark_lost(cr, uid, [ref("crm_case_2")]) - I check details of the opportunity after the loose - !python {model: crm.lead}: | - lead = self.browse(cr, uid, ref('crm_case_electonicgoodsdealer0')) + lead = self.browse(cr, uid, ref('crm_case_2')) assert lead.stage_id.id == ref('crm.stage_lead8'), "Opportunity stage should be 'Lost'." assert lead.state == 'cancel', "Lost opportunity is not in 'cancel' state!" assert lead.probability == 0.0, "Revenue probability should be 0.0!" diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/ui/crm_demo.yml index 3e53c722b5e..165d2694fd2 100644 --- a/addons/crm/test/ui/crm_demo.yml +++ b/addons/crm/test/ui/crm_demo.yml @@ -1,7 +1,7 @@ - I create lead record to call of partner onchange, stage onchange and Mailing opt-in onchange method. - - !record {model: crm.lead, id: crm_case_shelvehouse}: + !record {model: crm.lead, id: crm_case_25}: name: 'Need more info about your pc2' partner_id: base.res_partner_2 type: opportunity @@ -10,7 +10,7 @@ - I create lead record to call Mailing opt-out onchange method. - - !record {model: crm.lead, id: crm_case_mediapoleunits0}: + !record {model: crm.lead, id: crm_case_18}: name: 'Need 20 Days of Consultancy' type: opportunity state: draft @@ -25,4 +25,4 @@ I setting next stage "New" for the lead. - !python {model: crm.lead}: | - self.stage_next(cr, uid, [ref("crm_case_qrecorp0")], context={'stage_type': 'lead'}) + self.stage_next(cr, uid, [ref("crm_case_4")], context={'stage_type': 'lead'}) diff --git a/addons/crm/test/ui/delete_lead.yml b/addons/crm/test/ui/delete_lead.yml index 472b22d0d2d..49713039f22 100644 --- a/addons/crm/test/ui/delete_lead.yml +++ b/addons/crm/test/ui/delete_lead.yml @@ -2,4 +2,4 @@ I Unlink the Lead. - !python {model: crm.lead}: | - self.unlink(cr, uid, [ref("crm_case_qrecorp0")]) + self.unlink(cr, uid, [ref("crm_case_4")]) diff --git a/addons/crm/test/ui/duplicate_lead.yml b/addons/crm/test/ui/duplicate_lead.yml index 6b349ca350c..b6071ae9f9d 100644 --- a/addons/crm/test/ui/duplicate_lead.yml +++ b/addons/crm/test/ui/duplicate_lead.yml @@ -2,4 +2,4 @@ I make duplicate the Lead. - !python {model: crm.lead}: | - self.copy(cr, uid, ref("crm_case_qrecorp0")) + self.copy(cr, uid, ref("crm_case_4")) diff --git a/addons/crm_partner_assign/test/partner_assign.yml b/addons/crm_partner_assign/test/partner_assign.yml index 3ae36f8c225..bc4cd0d6e57 100644 --- a/addons/crm_partner_assign/test/partner_assign.yml +++ b/addons/crm_partner_assign/test/partner_assign.yml @@ -16,12 +16,12 @@ I assign nearest partner to opportunity. - !python {model: crm.lead}: | - self.assign_partner(cr, uid, [ref('crm.crm_case_abcfuelcounits0')], context=context) + self.assign_partner(cr, uid, [ref('crm.crm_case_19')], context=context) - I check assigned partner of opportunity who is nearest Geo Latitude and Longitude of opportunity. - !python {model: crm.lead}: | - lead = self.browse(cr, uid, ref('crm.crm_case_abcfuelcounits0')) + lead = self.browse(cr, uid, ref('crm.crm_case_19')) assert lead.partner_assigned_id.id == ref('base.res_partner_15') , "Opportuniy is not assigned nearest partner" assert 50 < lead.partner_latitude < 55 , "Latitude is wrong" assert -5 < lead.partner_longitude < 0, "Longitude is wrong" @@ -29,7 +29,7 @@ I forward this opportunity to its nearest partner. - !python {model: crm.lead.forward.to.partner}: | - context.update({'active_model': 'crm.lead', 'active_id': ref('crm.crm_case_abcfuelcounits0'), 'active_ids': [ref('crm.crm_case_abcfuelcounits0')]}) + context.update({'active_model': 'crm.lead', 'active_id': ref('crm.crm_case_19'), 'active_ids': [ref('crm.crm_case_19')]}) forward_id = self.create(cr, uid, {'email_from': 'test@openerp.com', 'send_to': 'partner'}, context=context) try: self.action_forward(cr, uid, [forward_id], context=context) diff --git a/addons/crm_todo/crm_todo_demo.xml b/addons/crm_todo/crm_todo_demo.xml index eef41bdc472..cec45141efb 100644 --- a/addons/crm_todo/crm_todo_demo.xml +++ b/addons/crm_todo/crm_todo_demo.xml @@ -3,13 +3,13 @@ - + - + - + diff --git a/addons/sale_crm/test/sale_crm.yml b/addons/sale_crm/test/sale_crm.yml index 8c62b19346b..011fb6ad5a8 100644 --- a/addons/sale_crm/test/sale_crm.yml +++ b/addons/sale_crm/test/sale_crm.yml @@ -19,12 +19,12 @@ - !python {model: crm.make.sale}: | crm_lead = self.pool.get('crm.lead') - crm = crm_lead.browse(cr, uid, ref("crm.crm_case_construstazunits0")) + crm = crm_lead.browse(cr, uid, ref("crm.crm_case_13")) self.makeOrder(cr, uid, [ref("crm_make_sale_0")], {"active_ids": [crm.id], "active_id": crm.id}) - I check that reference number of "Quotation" in opportunity. - !python {model: crm.lead}: | - crm = self.browse(cr, uid, ref("crm.crm_case_construstazunits0")) + crm = self.browse(cr, uid, ref("crm.crm_case_13")) assert crm.ref, "Quotation has not been created." From a6b7f2d1460e003e79b2b40b139c4a0c6afd9369 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 30 Jul 2012 15:59:47 +0530 Subject: [PATCH 189/571] [IMP]: crm*: Improved xml_id of demo phonecalls so it can be generic bzr revid: rpa@tinyerp.com-20120730102947-l10htd1qpqfbmchp --- addons/crm/crm_phonecall_demo.xml | 12 +++++----- .../process/communication_with_customer.yml | 4 ++-- addons/crm/test/process/merge_opportunity.yml | 22 +++++++++---------- addons/crm/test/ui/crm_demo.yml | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/addons/crm/crm_phonecall_demo.xml b/addons/crm/crm_phonecall_demo.xml index 568a50f91f4..59443c55bb4 100644 --- a/addons/crm/crm_phonecall_demo.xml +++ b/addons/crm/crm_phonecall_demo.xml @@ -4,7 +4,7 @@ - + @@ -19,7 +19,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -50,7 +50,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -78,7 +78,7 @@ - + diff --git a/addons/crm/test/process/communication_with_customer.yml b/addons/crm/test/process/communication_with_customer.yml index ec30f024fca..d7b2b578d8a 100644 --- a/addons/crm/test/process/communication_with_customer.yml +++ b/addons/crm/test/process/communication_with_customer.yml @@ -44,14 +44,14 @@ I convert one phonecall request as a customer and put into regular customer list. - !python {model: crm.phonecall2partner}: | - context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_case_phone06")], 'active_id': ref("crm.crm_case_phone06")}) + context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_6")], 'active_id': ref("crm.crm_phonecall_6")}) new_id = self.create(cr, uid, {}, context=context) self.make_partner(cr, uid, [new_id], context=context) - I check converted phonecall to partner. - !python {model: res.partner}: | - partner_id = self.search(cr, uid, [('phonecall_ids', '=', ref('crm.crm_case_phone06'))]) + partner_id = self.search(cr, uid, [('phonecall_ids', '=', ref('crm.crm_phonecall_6'))]) assert partner_id, "Customer is not found in regular customer list." data = self.browse(cr, uid, partner_id, context=context)[0] assert data.user_id.id == ref("base.user_root"), "User not assign properly" diff --git a/addons/crm/test/process/merge_opportunity.yml b/addons/crm/test/process/merge_opportunity.yml index c4e939f194e..6d13278eded 100644 --- a/addons/crm/test/process/merge_opportunity.yml +++ b/addons/crm/test/process/merge_opportunity.yml @@ -9,7 +9,7 @@ I make another opportunity from phonecall for same customer. - !python {model: crm.phonecall2opportunity}: | - context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_case_phone06")]}) + context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_6")]}) res_id = self.create(cr, uid, {'name': "Quoi de prix de votre autre service?", 'partner_id': ref("base.res_partner_9")}, context=context) self.make_opportunity(cr, uid, [res_id], context=context) - @@ -36,51 +36,51 @@ Now I schedule another phonecall to customer after merged. - !python {model: crm.phonecall2phonecall}: | - context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_case_phone06")], 'active_id': ref("crm.crm_case_phone06")}) + context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_6")], 'active_id': ref("crm.crm_phonecall_6")}) res_id = self.create(cr, uid, {'name': "vos chances sont fusionnés en un seul"}, context=context) self.action_schedule(cr, uid, [res_id], context=context) - I schedule meeting on this phonecall. - !python {model: crm.phonecall}: | - self.action_make_meeting(cr, uid, [ref("crm.crm_case_phone06")]) + self.action_make_meeting(cr, uid, [ref("crm.crm_phonecall_6")]) - I set phone call to not held. - !python {model: crm.phonecall}: | - self.case_pending(cr, uid, [ref("crm.crm_case_phone06")]) + self.case_pending(cr, uid, [ref("crm.crm_phonecall_6")]) - I check that the phone call is in 'Not Held' state. - - !assert {model: crm.phonecall, id: crm.crm_case_phone06, string: Phone call held.}: + !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call held.}: - state == "pending" - I cancelled the phone call. - !python {model: crm.phonecall}: | - self.case_cancel(cr, uid, [ref("crm.crm_case_phone06")]) + self.case_cancel(cr, uid, [ref("crm.crm_phonecall_6")]) - I check that the phone call is in 'Cancelled' state. - - !assert {model: crm.phonecall, id: crm.crm_case_phone06, string: Phone call is not cancelled.}: + !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not cancelled.}: - state == "cancel" - I reset the phone call. - !python {model: crm.phonecall}: | - self.case_reset(cr, uid, [ref("crm.crm_case_phone06")]) + self.case_reset(cr, uid, [ref("crm.crm_phonecall_6")]) - I check that the phone call is reset or not. - - !assert {model: crm.phonecall, id: crm.crm_case_phone06, string: Phone call is not reset.}: + !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not reset.}: - state == "open" - I set phone call to held (done). - !python {model: crm.phonecall}: | - self.case_close(cr, uid, [ref("crm.crm_case_phone06")]) + self.case_close(cr, uid, [ref("crm.crm_phonecall_6")]) - I check that the phone call is in 'Held' state. - - !assert {model: crm.phonecall, id: crm.crm_case_phone06, string: Phone call is not held.}: + !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not held.}: - state == "done" diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/ui/crm_demo.yml index 165d2694fd2..842b3a4e887 100644 --- a/addons/crm/test/ui/crm_demo.yml +++ b/addons/crm/test/ui/crm_demo.yml @@ -18,7 +18,7 @@ - I create phonecall record to call partner onchange method. - - !record {model: crm.phonecall, id: crm_case_phone05}: + !record {model: crm.phonecall, id: crm_phonecall_5}: name: 'Bad time' partner_id: base.res_partner_5 - From 89a71a0264c8bb1e329fe7cfe3531c1e874828d5 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 30 Jul 2012 16:02:21 +0530 Subject: [PATCH 190/571] [IMP]: crm*: Improved xml_id of demo claims so it can be generic bzr revid: rpa@tinyerp.com-20120730103221-r9hc0nw5i6h3mzm2 --- addons/crm_claim/crm_claim_demo.xml | 14 +++++++------- addons/crm_claim/test/ui/claim_demo.yml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/crm_claim/crm_claim_demo.xml b/addons/crm_claim/crm_claim_demo.xml index f3fbd814f2a..2448fe5d0c5 100644 --- a/addons/crm_claim/crm_claim_demo.xml +++ b/addons/crm_claim/crm_claim_demo.xml @@ -6,7 +6,7 @@ ((((((((((( Demo Cases ))))))))))) --> - + @@ -18,7 +18,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -43,7 +43,7 @@ - + @@ -55,7 +55,7 @@ - + @@ -67,7 +67,7 @@ - + @@ -80,7 +80,7 @@ - + diff --git a/addons/crm_claim/test/ui/claim_demo.yml b/addons/crm_claim/test/ui/claim_demo.yml index 520434fcd90..ad8fdf3aa44 100644 --- a/addons/crm_claim/test/ui/claim_demo.yml +++ b/addons/crm_claim/test/ui/claim_demo.yml @@ -1,7 +1,7 @@ - I create claim record to call of partner onchange method. - - !record {model: crm.claim, id: crm_case_claim04}: + !record {model: crm.claim, id: crm_claim_4}: name: 'Damaged Product' partner_id: base.res_partner_6 - @@ -9,7 +9,7 @@ - !python {model: crm.claim}: | try: - self.message_update(cr, uid,[ref('crm_case_claim04')], {'subject': 'Claim Update record','body_text': 'first training session completed',}) + self.message_update(cr, uid,[ref('crm_claim_4')], {'subject': 'Claim Update record','body_text': 'first training session completed',}) except: pass \ No newline at end of file From b317f621711a3375c9259b8f2e4246c0aa78daba Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 30 Jul 2012 16:05:48 +0530 Subject: [PATCH 191/571] [IMP]: crm*: Improved xml_id of demo fundraising so it can be generic bzr revid: rpa@tinyerp.com-20120730103548-vh5macvl65v8k4wi --- addons/crm_fundraising/crm_fundraising_demo.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/crm_fundraising/crm_fundraising_demo.xml b/addons/crm_fundraising/crm_fundraising_demo.xml index 70b32afabf3..756265acbba 100644 --- a/addons/crm_fundraising/crm_fundraising_demo.xml +++ b/addons/crm_fundraising/crm_fundraising_demo.xml @@ -1,7 +1,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -49,7 +49,7 @@ - + @@ -65,7 +65,7 @@ - + @@ -80,7 +80,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -111,7 +111,7 @@ - + From 6e545461649d0b12cd8eada50f9497e8efcb1cac Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 30 Jul 2012 16:10:03 +0530 Subject: [PATCH 192/571] [IMP]: crm*: Improved xml_id of helpdesk demo so it can be generic bzr revid: rpa@tinyerp.com-20120730104003-ciihejzupemw4yt8 --- addons/crm_helpdesk/crm_helpdesk_demo.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/crm_helpdesk/crm_helpdesk_demo.xml b/addons/crm_helpdesk/crm_helpdesk_demo.xml index c91205fa7e6..1370bf6d906 100644 --- a/addons/crm_helpdesk/crm_helpdesk_demo.xml +++ b/addons/crm_helpdesk/crm_helpdesk_demo.xml @@ -1,7 +1,7 @@ - + @@ -13,7 +13,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -37,7 +37,7 @@ - + From 9b569c06c577b7139617cf2a787b886a5e2813fd Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 30 Jul 2012 16:16:25 +0530 Subject: [PATCH 193/571] [IMP]: crm*: Improved xml_id of meeting demo bzr revid: rpa@tinyerp.com-20120730104625-7nj00iup0hnqdr4b --- addons/base_calendar/crm_meeting_demo.xml | 12 ++++++------ addons/crm/test/process/lead2opportunity2win.yml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/base_calendar/crm_meeting_demo.xml b/addons/base_calendar/crm_meeting_demo.xml index ad88c11bb1b..58cc0161769 100644 --- a/addons/base_calendar/crm_meeting_demo.xml +++ b/addons/base_calendar/crm_meeting_demo.xml @@ -6,7 +6,7 @@ --> - + @@ -18,7 +18,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -53,7 +53,7 @@ - + @@ -65,7 +65,7 @@ - + diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index 5053ed3088b..ce33a0d2a35 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -111,7 +111,7 @@ - !python {model: crm.meeting}: | context.update({'active_model': 'crm.meeting'}) - self.case_open(cr, uid, [ref('base_calendar.crm_case_reviewneeds0')]) + self.case_open(cr, uid, [ref('base_calendar.crm_meeting_4')]) - I invite a user for meeting. - From 815128e7d3bfe6993956d8465f79345d1c34ac9e Mon Sep 17 00:00:00 2001 From: "Purnendu Singh (OpenERP)" Date: Mon, 30 Jul 2012 16:46:47 +0530 Subject: [PATCH 194/571] [IMP] hr_expense: assign group multicurrency to currency fields bzr revid: psi@tinyerp.com-20120730111647-r65atxk71el136c7 --- addons/hr_expense/hr_expense_view.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 55d2f758655..5747a926f8d 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -33,7 +33,7 @@ - + @@ -84,7 +84,7 @@ - + From 629d1041661e72361d0f34cc9477e37ae66536c0 Mon Sep 17 00:00:00 2001 From: "Dharti Ratani (OpenERP)" Date: Mon, 30 Jul 2012 17:59:44 +0530 Subject: [PATCH 195/571] [IMP]improving code to add label only once on load bzr revid: dhr@tinyerp.com-20120730122944-tlgjzovqbulbff1x --- addons/web_diagram/static/src/js/diagram.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index ad3e5e68411..b3c2a7dcee1 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -109,12 +109,13 @@ instance.web.DiagramView = instance.web.View.extend({ get_label : function(){ var self = this - var html_label = _.each(self.labels,function(label){ - html_label = "

" + label.attrs.string + "

" - self.$element.find('.oe_diagram_diagram_header').append(html_label) - self.$element.find('.oe_diagram_diagram_header > p').css('padding-left','5px') - }) - + if(self.$element.find('.oe_diagram_diagram_header').text() == ""){ + _.each(self.labels,function(label){ + html_label = "

" + label.attrs.string + "

" + self.$element.find('.oe_diagram_diagram_header').append(html_label) + self.$element.find('.oe_diagram_diagram_header > p').css('padding-left','5px') + }) + } }, on_diagram_loaded: function(record) { From 5cd867c083a307d8afff20aad4d8a921b4f5984c Mon Sep 17 00:00:00 2001 From: "pso (OpenERP)" Date: Mon, 30 Jul 2012 18:17:15 +0530 Subject: [PATCH 196/571] [IMP] mrp_jit: Changed product and improved message bzr revid: pso@tinyerp.com-20120730124715-njq1wk7sz5hvmue9 --- addons/mrp_jit/test/mrp_jit.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/mrp_jit/test/mrp_jit.yml b/addons/mrp_jit/test/mrp_jit.yml index 8a375a70ed6..0580de9d9ec 100644 --- a/addons/mrp_jit/test/mrp_jit.yml +++ b/addons/mrp_jit/test/mrp_jit.yml @@ -1,13 +1,13 @@ - - In order to test mrp_jit module with OpenERP, I create manufacturing order - and check whether the procurement order run without scheduler or not. + In order to test mrp_jit module with OpenERP, I create procurement order + and check whether it runs without scheduler or not. - !record {model: procurement.order, id: mrp_production_mo0}: company_id: base.main_company date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") location_id: stock.stock_location_stock name: PROC/TEST/0001 - product_id: product.product_product_4 + product_id: product.product_product_16 product_qty: 10.0 product_uom: product.product_uom_unit product_uos_qty: 0.0 From 51e1d956aed14d1039999e18ed1e89ce0e12db84 Mon Sep 17 00:00:00 2001 From: "pso (OpenERP)" Date: Mon, 30 Jul 2012 18:49:26 +0530 Subject: [PATCH 197/571] [IMP] mrp_jit: Changed id and improved message bzr revid: pso@tinyerp.com-20120730131926-h9ptbsfgfogncl57 --- addons/mrp_jit/test/mrp_jit.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/mrp_jit/test/mrp_jit.yml b/addons/mrp_jit/test/mrp_jit.yml index 0580de9d9ec..4b847c4608d 100644 --- a/addons/mrp_jit/test/mrp_jit.yml +++ b/addons/mrp_jit/test/mrp_jit.yml @@ -1,8 +1,8 @@ - - In order to test mrp_jit module with OpenERP, I create procurement order - and check whether it runs without scheduler or not. + In order to test mrp_jit module with OpenERP, I create procurement order for + Computer Case product and check whether it runs without scheduler or not. - - !record {model: procurement.order, id: mrp_production_mo0}: + !record {model: procurement.order, id: procurement_order_test1}: company_id: base.main_company date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") location_id: stock.stock_location_stock @@ -15,10 +15,10 @@ | I confirm the procurement order PROC/TEST/0001. - - !workflow {model: procurement.order, action: button_confirm, ref: mrp_production_mo0} + !workflow {model: procurement.order, action: button_confirm, ref: procurement_order_test1} - | I check that the procurement is scheduled automatically. - - !assert {model: procurement.order, id: mrp_production_mo0, string: procstate}: + !assert {model: procurement.order, id: procurement_order_test1, string: procstate}: - state<>'confirmed' From 23c2f1fd40c4bbe9e9c9fc21c323e0cee327ffa1 Mon Sep 17 00:00:00 2001 From: "Dharti Ratani (OpenERP)" Date: Mon, 30 Jul 2012 18:50:49 +0530 Subject: [PATCH 198/571] [IMP] bzr revid: dhr@tinyerp.com-20120730132049-539qb9l5c4g50864 --- addons/web_diagram/static/src/js/diagram.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index b3c2a7dcee1..54f02f3cd44 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -109,13 +109,12 @@ instance.web.DiagramView = instance.web.View.extend({ get_label : function(){ var self = this - if(self.$element.find('.oe_diagram_diagram_header').text() == ""){ - _.each(self.labels,function(label){ - html_label = "

" + label.attrs.string + "

" - self.$element.find('.oe_diagram_diagram_header').append(html_label) + this.$element.find('.oe_diagram_diagram_header > p').remove(); + _.each(self.labels,function(label){ + html_label = "

" + label.attrs.string + "

" + self.$element.find('.oe_diagram_diagram_header').append(html_label) self.$element.find('.oe_diagram_diagram_header > p').css('padding-left','5px') - }) - } + }) }, on_diagram_loaded: function(record) { From 415f27d1c664f89f23e116e4e473f2424012caf2 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Tue, 31 Jul 2012 12:26:58 +0530 Subject: [PATCH 199/571] [IMP]: crm: Improved xml in lead demo file bzr revid: rpa@tinyerp.com-20120731065658-i231cyioeewrz6ic --- addons/crm/crm_lead_demo.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index 6dc464013f3..e49391e6124 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -288,7 +288,7 @@ Kitchen design crm.lead - + html email @@ -298,7 +298,7 @@ Reply crm.lead - + html comment @@ -307,7 +307,7 @@ Reply crm.lead - + html @@ -317,7 +317,7 @@ Reply crm.lead - + html @@ -327,7 +327,7 @@ Your inquiry crm.lead - + html email From 6ce164d5826c06e930e6dd5e8eb0dde5bf3ffc2e Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Wed, 1 Aug 2012 15:33:08 +0530 Subject: [PATCH 200/571] [IMP]: crm: Improvement in demo of basic crm objects like category, campaign... bzr revid: rpa@tinyerp.com-20120801100308-wwki0jb1jat3ifxi --- addons/base_calendar/crm_meeting_data.xml | 10 +++++++++- addons/crm/crm_data.xml | 8 ++++---- addons/crm/crm_demo.xml | 22 ++++++++++++++++++++-- addons/crm/crm_lead_data.xml | 12 ++++++------ addons/crm/crm_lead_demo.xml | 4 ++-- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/addons/base_calendar/crm_meeting_data.xml b/addons/base_calendar/crm_meeting_data.xml index 82752d1dc7d..d1cffddc403 100644 --- a/addons/base_calendar/crm_meeting_data.xml +++ b/addons/base_calendar/crm_meeting_data.xml @@ -13,7 +13,15 @@ - Phone Call + Off-site Meeting + + + + Open Discussion + + + + Feedback Meeting diff --git a/addons/crm/crm_data.xml b/addons/crm/crm_data.xml index 58699da94ce..80a29a34417 100644 --- a/addons/crm/crm_data.xml +++ b/addons/crm/crm_data.xml @@ -2,16 +2,16 @@ - website + Website - phone + Phone - direct + Direct - email + Email Sales Department diff --git a/addons/crm/crm_demo.xml b/addons/crm/crm_demo.xml index 89da8d357f7..551e4e93fb8 100644 --- a/addons/crm/crm_demo.xml +++ b/addons/crm/crm_demo.xml @@ -12,12 +12,30 @@ - + Sales Marketing Department - Sales Marketing + SMD + + Support Department + SPD + + + + + Direct Marketing + DM + + + + + Online Support + OS + + + OpenERP partners True diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index 306a35924a9..ec88ca8131a 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -86,11 +86,11 @@ - Mail Campaign 1 + Email Campaign - Services - Mail Campaign 2 + Email Campaign - Products @@ -102,7 +102,7 @@ - Google Adwords 2 + Banner Ads @@ -116,12 +116,12 @@ - Interest in Computer + Interested in Product - Interest in Accessories + Inquiry about Software @@ -141,7 +141,7 @@ - Potential Reseller + Interested in Training diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index e49391e6124..64283744ec5 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -11,7 +11,7 @@ lead - + @@ -88,7 +88,7 @@ - + From 4aba76d2dc78082df5b9e9d3db6fe6f715299c65 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Wed, 1 Aug 2012 18:58:46 +0530 Subject: [PATCH 201/571] [IMP]: crm: Improved lead demo bzr revid: rpa@tinyerp.com-20120801132846-ufwyjn98t8hbp1pw --- addons/crm/crm_lead_demo.xml | 383 ++++++++++-------- .../crm/test/process/lead2opportunity2win.yml | 8 +- 2 files changed, 223 insertions(+), 168 deletions(-) diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index 64283744ec5..6c90209a573 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -6,206 +6,261 @@ --> - - lead - - - - - - - + Plan to Attend a Training + Jason Dunagan + Le Club SARL + jason@leclub.fr + + Training Manager + 73, rue Léon Dierx - - + Paris + 93190 + +33 1 25 54 45 69 + + + + 1 + + + + Hello, +I am Jason from Le Club SARL, +I am intertested to attend Training organized in your company, +Can you send details, - - - + - - lead - - - - - - + Interest in Your New Software + Marc Dufour + The Oil Company + md@oilcompany.fr + + Purchase Manager - - - - - - - - - - - - - lead - - - - - - - - - - - - - - - - - - lead - - - - - - - - - - - - - - - - lead - - - - - - + Bordeaux + + + + 4 - + + + Want to know features and benifits to use the new software. - - - - - + + + lead + Need Info about Web Design + John Miller + The Kompany + contact@thkompany.com + + + New-York + + + + 2 + + + + + + + + lead + Need a New Website + Henry Campbell + Burstein-Applebee + hmc@yahoo.com + + + Drury + + + + 3 + + + + + + + + lead + Need a Quotation for Computers with Accessories + Carrie Helle + Stonage IT + helle@stonageit.be + + Purchase Manager + 50 West street, + + Franklinville + NJ 08322 + +1 813 494 5005 + + + + 3 + + + + Hi, Can you send a quotation for 20 Computers with speakers? +Regards, +Carrie Helle, +Purchase Manager +Stonage IT, +Franklinville +Contact: +1 813 494 5005 + + + - - - - lead - - - - - + Need Info about your Services + Tina Pinero + Opensides + tina@opensides.be + + Consultant - - - - - - - + Roma + + + + 3 + + + + + - - - lead - - - - - + Info about Your Company? + Wendi Baltz + Gardner Group + + Journalist - - - - - - + Kiev + + + + 5 + + + + + - - - lead - - - - - - - - - + Product catalogue + Logan + ESM Expert + logan12_expert@gmail.com + + Sales - - + Cambridge + + + + 4 + + + + + - - - lead - - - - - - - - - + Partnership Details + Delisle Albert + Marketing Business + d.albert@marketing-business.com + + Sales - - + Oxford + + + + 2 + + + + + - - - lead - - - - + Information about laptop + Andrew + Komerci + + Medical illustrator + + Sevilla + + + + 2 + + + + hi, +I want to know specification and cost of laptops of your company. +Thanks, +Andrew + + - - - lead + Need estimated cost for new project + Thomas Passot + Agrolait + p.thomas@agrolait.com + + Functional Consultant + + + + + 3 + - - - - - - + + + - - - lead + Need Quotation for 100 PC and 100 Keyboards + Bojing Hú + Incom Corporation + bhu.a100@gmail.com + + + Shenzhen + + + + 2 + - - - - - - + + + + Date: Fri, 3 Aug 2012 18:47:42 +0530 Subject: [PATCH 202/571] [ADD]: base: Added logos on company of demo bzr revid: rpa@tinyerp.com-20120803131742-dd89873rgqq7onk0 --- openerp/addons/base/res/res_partner_demo.xml | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index 921d28bb264..e1e2693c448 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -90,6 +90,7 @@ info@asustek.com (+886) (02) 4162 2023 www.asustek.com + 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 Agrolait @@ -102,6 +103,7 @@ info@agrolait.com +32 10 588 558 www.agrolait.com + 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 China Export @@ -115,6 +117,7 @@ info@chinaexport.com +86 21 6484 5671 www.chinaexport.com/ + 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 @@ -131,6 +134,7 @@ info@deltapc.com +1 510 340 2385 www.distribpc.com/ + iVBORw0KGgoAAAANSUhEUgAAALIAAAB0CAIAAACuWf+WAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wIAwoCIfglZdEAAAy2SURBVHja7V19UBNnHn6XL0mMJly4M1QgoCmKXknQ2hEOQUV6qIhTRKXnRyhwPRxTRfwYbmCYyoQZxcppiz1GgYHWjqjA6ImMo2IFrR/niYlzVVSU8NGa3sCZKCag1twfq3ubzQdkNx+7yfv8tSy72c27T34fz/v7vYsYDAYAAWEMLzgEEJAWEJAWEJAWEJAWEJAWEJAWEJAWEJAWEJAWEJAWEJAWEJAWEJAWEBBv4GN2b0ltc5viPrrN5bAkohCxKFgsCgkT8OGQeQIQ03qLrF1135y5aumEBEmEUMAPE/ATJBFiUTCPw4aD6P60aFPcT8wrH/v5mC0RCvgSUUiCJAKOqRs6kZOXFTadrx3StynuYx4HAIDZEqGALxYFS0QhcJQZby1m58iVXf32vQZmS2CAwkhaqNSDooxCJ1wVBihMciJ4X+BQEC5ECFAgUehFix71oEtuwnqAgm7AR+UyWnA5LJrcVo96sEc9iCcK3pagG/DhOS+2mJ0j1w7pGXHreFuCbsDH6ahMRNHVl5hXzhRmwADFSbTAyNGjHlR29WMbTPxuMECxMy1MoXrr7FUmXp9BgAGKnWlhhSiaIR1qV7RDemS8ARlnMIwgBj0CXsMAxfNoYQrNkC7vxOFjndcAAF4AQTQ+I/2G1xqGzd2jCpuHByiIfTvWDQZDdsOheuU1bE8Qh7coKOodA79d8QA1MEyMZD0tQEHsvpDBi19frTny9elOoyk3cVDo/tR1H4RMBQDgAxTUATEukkWnAN04QEEcsb6F7uWLxdVlN/of4Xd6e3ltj1/61wWpvt7ebpb4YFOAbhOgIA5a9mTg+bPFNXt+/IX4gGdPDq9Z+ed3AwXWT8f4wdDEh+kBCuK41XB+evpkfqX8p6dPCPvZvn67l2RkvZ+AIAiJxIeJRGFcgII4dJGkH3/pX1yzZ+D5M9N/pURGV6XnTBxHfhYGS4wxB8QgcZbLYUmTYzalJ9LT4yCOXjvrRv+jxdVlupcvTP81/bdBR9d8NqpDIUEUdEqWEYlPdYFUmhzjcbQAAJzuVKw58vWLX1+Z+dH4sw9nbEgUzXTc1fF+h55E+VdVId3SGcQ5K+3VK69lNxwyey0/b5/KtKwM8VynfWe8MkuHxCc1Ttwk3+CJtAAAfNHeUny2wfxNIEjpH1fmxSW7ahQIAYrz49lXFys9lBYAgOKzDV+0t1j6ryw2affiDJvSE8cB73eUXX0OtShCAf9hfann0sJUGicg/b0PqtJz/Lx96Ob+VerBktpmK11VVLA+OaamQOq5tAAWpHE8FkydcXztJravHw2zBgfVKLXuy6ebkuHs6U0/b5+61blzgqdYOuD7h3c++uZvz1+M0JAWElFIuWyVfT8zQRJBQ3XLBbPebF+/xnWbZ04KtnTApe57y+vKn40M05AZ0uQYOxZCi0XBjfJcGn5N1xRDBI6fcEK6ZfLEAEsHXOl5sPLwl2ZFMDrYDLt8DpfDapRvoOd0ictqZCZPDDgh3RI4foKlA9q7O6VHK82KYG4AsSi4dV8+bedaXVk6NXNScOO6zVaiy9OditymGrq92kJFWSdNkES07sunc6GGiyvq5gRPqVudayUjrVdeyzt1mD7jdfKygop8zuWw9spWtu7Lp/lUu+sLLZdOl1SmZVlRsQ798/ud55voMFiaIV1JbTNFx7E5PZH+Po4W9bcZ4rk7k1ZYOWD3xeaD1y+4/D7zK46TljuLM1NuVhUxpcIPoY/nti6Ne3t51f9JtnS6xFV2Ir/iODmVUyjg1xRImVUbTCNajCqNs3392nKLrAgejuNEYl45OTuxKX1hcWYKLNqjhFGl8WDub65u/JzP5jgzxszaVUdC8OZyWDUF0uVxEsBAIHRL/8xWjeOx6N3fn1i/xcvxE62aIV3Wrrp/XFaSODc1TlxTIGVu6xFCwxdeWqoa/38UsuijgvnLHHoPbYr7WbvqSOSiXA6rODOFEekGw2gBLFeNY+Hnqcyt86dEOi4L/bKBTOIjFgU3yjfAPhEHwkrVOADgd5yJ1zbuFEzg2veiiq6+7F115KLL4syU4swU4BZA6PzWZCtV4wCAeeHTWj7Z7u1lN+mlpLaZnFolFPAb5bnu1HVI63Zy69L4pe57B66es8uFVOrBxLxycpzYlL7wJv1Kt93ZWqCwUjXO8vW7Ltsp4k+i8vn7G1pLapvJpaBN8g1u2cPOAFoAq1XjC6bOOP3JNpiCeiItgFVp/FTmVhINSCR1Km8DwjFIk2PWm7SCcf3Z4qBQ0zOUj3u1w7r48OkW2anX3Vb32hDK8AKFAYHmh+JOBwBg2YxZnkILK9L4nOApF/9SOPZOAnITHAj3te97o9QEbYxJ2rP0Y+zP9u7OTxurezWDAIBQHv/axp08FtG69DwZiNy7w9bRuLu1zJQZGr3unVJZKI/fuW0PxdH2AQwBgiCVaVnPRoZNpfEb/Y9O3b2VOrafCEmdapzBJ/KVsW1grY2Oiw+fxsU9aSHP6FGt/u4r7fAba9SrGdzRcuTgimziTz8gsHDhcrzZ6HkygDIJQyiPLwwIjBKEYqzi+rPNxeCd6IVO3emgaDAYQwvwtmrcrDS+83xTSmT0qIp4fsUxcjpVQCDruc9L/J6ooFC8YTALjBNvDINmwOxhGC1QVFw5u6OlHr9HFpski/1w1Js8dfcWtkGRFgxb78xS1fjd//zc2vVvKycquvpm58jJcWJT+sJqJ7b3RJkEKFHmQhZztOhANw7f+kGj13kQLYDlqvGjyuuWTimpbX4/p5SEdikU8Fv35ZfLVvFosxq6RU7c6cAbJ4winkILYKFqXPm41746VWqc+GZVIVNkCcyDYAbD42gBzFWNPx0hppp1Z67OzpGTaD/ncliN8twm1zVxGIZHbKdFh3H4ea/nyYDH0QKYSOOvX7/Gp6BpRX/PJlU+kyCJuFlV5NryGcR/HBUPQt2PMPv1uPiq8eRpYkynmppRSE67RKv1XTgzrlKpqHuQtxkN+QkjH8BwZIjn9mv/e+ae8vOkNIqlEtUFUhfOeGk0GgBAWFhYb3cnRQ+CKSXKx73isWUx7kYLAMC2+CXb4peQrqdCU1C7t6KTAI/Ho56DGAWeHT+Il5KhhZu8Y72ktjkxr5wEJ7AU1NYTbz/upQMnMA9StiSjbEkGkRa3LnuoE6FST7U+OaZctpJcuqEd1rOLsozyF3+WLPZDgmQ5Ft+h0WjCwsIopKYd6KUBAKUXTuIth3ZYT04IZ7a12N/QSk6nQlNQ+86Ma4f17baHBWg8QZ4Tdzq0w3pMGl8bHUc44FtSAgZTrYVKPZi9q47ckngJkohGeS5FQnD9WQfTsqOCQi3NcTvad+A9yMaYJPRPWWwSoWKt+e4tjV5nOnPrhtaCik5lr4bxqKDQZTNmUeGESqVCsw9qtOhIiYzGnrowIHBt9B+oCxgMowUVnYpuDeNhYWFUTcWdDu2wfp0xD0yDmwO2CxhMokWb4j5pnYpWDePUjQTeg8wzrvsSBgRGCYy+5m11n61CuBdTjER+xTFyix+iKSitOjgoGgmCd7hkHOdq9DrNsM4kU7Ut8GRAyKno6ltRVElap2Jiw/jYPQgAYHvLkQpcmKnV6wjFXQCAbzsu25Q5050WpFt6GN0wPnYPAgDQGtsGLosdJQi5re7D77RVCPehs5EgrVO5d7U+5kFCefyjaz4z+7BXffdVs/H82YEr50wrSRkWW6DLKJPTqfbKVjqhVIJENYOWWiGdqQeRxSZZMgCy2CTiDWtsuGGa0mJrxXFyKejNqiLnpKBogfUoHPVnETICcjKoJQ+yLNKiqh0fPn1e+DTSn09TJ0JCqnJow3h8+HSuP4swUflpU/Wyu7dMFa2UyGj0R7w2Oo6gOSZXl80Ln4ZvJQrl8dfNMlKsCV0FljxISmS0dTGtcOHy5Ooyt6KFrSmoExrGy5Z8vKPlCGEiymziV3rh5M+FFTwWG+0YIDDjUve9S9338HuItAgITImMxiKDKEEIoSOtvbtTO6xfFhk9KpXxn2O2tcQSaNpVNjWjcIwZqTNT0J4nA2Px0ISuQ7TZcIwHYxequHLutrqX688+mJZNmNFQPu7d0XLkYFr2qNK7Rq9DSYlNsTKbFvsbWrdWHB81unTXhnGXg6Yh5+b0xNQ4sfUU9GF9KeSEg0Df1mTNkG52TqmpK+FyWOWyVTR8dyikhVPVC3ymmiCJqC6QusGaZZAWlKBSD+ZXHNMO6YUCvjQ5BnoNSAsIGHJCQFpAQFpAQFpAQFpAQFpAQFpAQFpAQEBaQEBaQEBaQEBaQEBaQEBaQEBaQEBaQEBaQEBaQEBaQLg12i5d9br/4BEcCAg8Ws6c/x9JAqj8UVYOgAAAAABJRU5ErkJggg== @@ -145,6 +149,7 @@ epic@tech.info +1 312 349 2324 www.epic-tech.info// + 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ADsJd4LMQxjMNHRaxras5Em2mpPfnzy6rLj8zhXZC65zIKlptkVXyODQ6YgN4SXDuPEANyt+bL4yGbqZb0DHh4jILuxxOwafcd+Wy4tzA3ZsBqCk0QCbI2Xywni5DdrACeXIgt3+5fu3grcuEzVNvU9bdtuniJPLYlpG/uPsqQNaNFr+2qN4vl62H2C7rrtRsrojYjD2ODHDf4rjtsD7idx94WmzJUrfptW3HG2OKwajmy7ObMSwO2A7+R7PArj2tM2pdO57BNlZw5WxPK2yTu6MTHc7jvLNyG7dzW9i+x6fvMz8eUJjeK9+SaONz+b2PgbEXE7cngg+RPvSwKGacEWb3efhrxXdfLim0Wwu9FFUnqGxlo4CfmcP/hcmKHS01wVYMHRkd15gc70ONrQ4ML+XEBxch8nc8xy23I5uXxF2rfnyUBYbd3KRWYRI4iCsGQCMl5APxmtPPbtc0d26yUMffu5RkstdjDHfdZs2WTbsnD6z4h1ZDR8X2Bt+ZO6xMTHahZCuqWu2W3GfHr5+d12Ri9LmVkQxmIL5ASwejx+1t27cuey/ePo6dMkNmjQxoefaikigYD2doIHiuXhNONoY7HUzh8Y6ahF1bbTmNJk2YWbjlu1zgeZ8Xdqz6fwNjFZCJ1a1djx7YSw057PXxxnkGiMuHE0Dn8rbbuWPsYxoB0Uza2rdbavY65nh/akaIizUiIiIix2YILMDoLEMc0Txs5kjQ5rvrBXH9T9J8fH6tYjfff8A4OPb7tl3EUb4o35uaDyUsc8sQsxxH0NljrV4K0IhrQRwxjsZG0NaPILIiLMC2QUZJJuUREXq8REREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREX//2Q== @@ -160,6 +165,7 @@ 23 Rockwell Lane info@elecimport.com +1 773 439 3000 + /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABtAJYDASIAAhEBAxEB/8QAHQABAAICAwEBAAAAAAAAAAAAAAcIBQYBAgQDCf/EAEUQAAECBQIEAwQIAgQPAAAAAAECAwAEBQYRBxIIEyExQVFhFCJxgRUyQlKRkqGzI7EWM2LhFxhFRlRWY2Vyc3aEsrTR/8QAGwEAAQUBAQAAAAAAAAAAAAAAAAECAwQGBQf/xAA2EQABBAECAwQHBgcAAAAAAAABAAIDEQQSITFBUQUGE2EUInGBkaGxIzIzUmLwFSRCkrLR4f/aAAwDAQACEQMRAD8AuXCEcEjtCE0hCcCOEuJMa5dN0SNElnnX5hhtLIyt51YS2gep8/SIPretE9WKmqm2dQ5+4H/sqShYbHqEJG4j47fjGRzO9IbMYcOMyubxrZoPQuO1+y1ejwiW6nnSP3yVjHpuXSlaVvtJI8CsCOJabYWUoQ+0o+QWDFdgxr3PtrfbolNp6FIyltQaH6KWoj5x1bZ16po9ofoVOqDYTkoQG1H8ErSo/LMUD2x2wXh/gs25azf+Kk9HgqtR+H/VZNa8EDxMdgQe0VtoGtc1Tqr9G3ZRp+3pnOCXELU2PUoUApI+APxicLcuaSrDDPs77Kw6nKHWlhTbg/skR0MPvS103g5cZiceF7gnoHDa/bSikwiG6mGx++S2KEAMDEI1ypJCEIEJCEIEJCEIEJCEIEJCEIELhR6dMfONYv65ZOgUaYmJ18SzbTRded+4geXqewHcxtBAIwRmK3cVk0/My8jQ5RxYXUp/l7B9sIwAn8ykxlu9GTMyKPGhdRlOm+YbVuI86Fe9XMNjS4udy3/0sXaFt1vWusOVqvTD0laEq8UyrDasKdI7gev3l9cZIHpYS36FRrcp6afRKdLyEuAPdaTjdjxUe6j6kkxxa1Dl7btun0OQSlLEkwlpO0Y3EDqrHmTk/OPa64B0V7v8o4sgiwoRHGNICe5zpHWV3W4Nh+BgleEDr1PSPE6tRCgnxB6xyhawQD4DvGeHbwMmn3J3hbL43Jb1EuWnmn1umsTzJBADifebz3KVDqk9O4IMV+rdBrWiFxszkg/MVGzp53asOKG5hXfB8AsDJBGN2CDiLItOJxhAKz5+H4xiL9txi7rPqVAnNgTNsKS2ojPLcHVCvkoAxog2HNgMcosFNa90brC9doXBK1emtOMTKZpKm0uNup7OII6KjYAcjMVz4TKyt6gfRr5cU5T5xUuAroQ2sbkg/BW4fKLGDtHa7r5c8sL8ed2p0TtN8yKBaT7j8kzMja1wc3gRaQhCNQqaQhCBCQhCBCQhCBCQhCBC6O8z7Ais3FHK1CTnaJW2UZ+j6mVHPb3tqwT80frFnI0nVe1JO5bfmpWbSstvo2rKe6FDqlY9QcRke9WM9rI85lnwnWR+kghxHsu1ewnizGf6vqtgkJtFQp8vPyriVMTLSXW1eaVDI/Qxw+l0j6yfyxBekN+vWNOf4Pr4IlGWFEU+dUDs2k9ElX3CTkK8Ox6AYnkgOJCgcpIyCD3ji5jW5MWqM2COSWix1FfCQS3u2rIAHfA6RzN8lxX8MH1BMcutbU4HQ9ziOnKKXd3gTg+kZ10U0eP6H4Yq9zz/AGE+wXarX1ZSABkqHxj51qoy1Hos7VptWGJNhbznXuEgnA9TjEejchttS3FJQhIypSjgAeZ8hEBar3bOakVYWDZ530/mBU/OjO1QSe//AAA+P2iBjp302KGYsOt5oAKMNL3UFxwn0dSKZNVN1CgudqO4HrgpbT3/ADFY+UWPAAHSNO0yteXt2hy0rKFYYYa5bO/qpXipZ9ScxsdYrNJozKHqxVJKntuK2oXMvpbCjjOAVEZMdjurC7wJcuRteK7UL/LQDfiBfvTcxwLgwHgPmvdCMFI3laU9ONSUlc9GmZl5W1tlqdbUtZ8gAckxzL3hakxUU06XuWjuzqnOUmXROtlwr7bQnOc+karW3qqlFZyEIQ5IkIQgQkIQgQkIQgQkdHyNhSRnPTEd4YhkjNbC3qlGxUZao6dU65aQtEwkoSjK2XQMql1+Y80nxH92NX0TuyqUSrK0/vA8pxkhFLeWrIWn7KAo9wfsn0KfACJzcQFjaoZT4jzivvFXS2ZWgytUlVqYmqfNNlpxJwdiz2+RAI+HrGAzOzj2JksdD+DI6q/K47iv0muHI7rosl9IaWu4j6KdlpyILQDnPjGJsWpPVux6DWZgAPT1Ol5lzH3ltpUf5x5tUqpM0PTuv1eSVsmZWQdcaVn6qtvQ/LvF84oIJpVr3pRLrFeNTuq5l6Z2i4AWztqc1n3RgjcgkdkDICvM+78ZC0usWn27RWpZlsloYU4tQwt5fio/2fIeX66Bwx0GTXastV1DfM1Ja3Zpw/WUlC1JSnPlkE/MxYFtICU7cDAwMeUcvAwP4xluMv4MRrT+Zw4k+Q5DnzVuV/o8YDeJ+S7JwEgJxjwxFc+PE4se3en+U1ftKixoit/HqSLHtzaev0or9pUegTj7Ihc1n3lpvCVpK1XnaZqUa4uXXS6o4gSPsoUHNiB137hjO/yPaI201QP8aalkf6yr/dVG+8Iel9Vq9wUjUtqoSLchTJ99lyWUFc5ZDJTkdMY/iDx8DGhaaZHFLS/+pV/uqio0UG7KQ8Spn1H4mbjZ1FnLT0+tmTqQk3nJYuzIUtcw43nmFCUqACBtVgknIGenaNq4cuINrUaYqFHuOQl6VVpGVVOcxlR5DzCSAsgKJKVJyCRk5BJHYxVG0JW4p/W/2K0phiWrT1RmUSrj+NiSeZnOQfs58I3TQS15ek3tUptu77dqTgoVRSZeSedU6rMuvPRTaRgd+8TMkeXWmkClulZ4sbuq1fqTdiWfJv0qSZcmN04Fqe5CPrOrCVAJHjjrjPcxM3DXrJL6t0CeU9TxT6zS1NpnWUElpQXu2LbJ64OxQIPUEeOQYqZwkyNGqN/1ySuJzlUd23J0Ty95RtZ9wrO4dRgAnMWo4eLe0YolVqzmltXE/NOsNpnUicW9tQFHacK7dcxJG5xNkpHAKZYQhFhMSEIQISEIQISID4v18uw59f8AtpYD80T5EJcSldtaj0tS7qp7tRk1vtIRKoH9Y6BuGeoGB6xku9zy2HHLWlx8VpocTQcdldwRbnb1sVotscQPsFkW9alo2hUa5WpOmS8q4pQPKStDSUqISjKlAEH7vxjzXUrWC7aO6q8biptq0N3+vacWhpOw/ZIGSfgpUaSxqVe9fIpGmlns0iSBAUZOWC1J9VuEBtHxIz6xgblpcuX/AGjUK/0zM4jO6UkVmefT5p3ZDbZ9M/IxyJM3MkdoOmPyH2j/AIN2HvsKw2KNosb/ACCmbTLUqyrRXR7KpFafqz28y6JsSpS0tS1k9cnoCTjpn4xZSkzIm6e1MBO3eOo8jFGdKbgoKb9pMlaNgOTKVOhL0/PPKfmW09i70AbbwOpwPwi71s800ZguBKcj3QkY6f394f3dEmL2q/H9bS5pedRafWLhvTfu3059NkZdPhD9rBra+nzWSiC+Mayrqva0aHJ2nSHanMy1QU66ht1tG1BbUM5WoDuRENa/XPccjxQqp8lcNYlpIT0gn2ZmedQ1gpayNgVjByc9OuYmK5eJag0HUSes+atmrvLk5tcst+XKXCtSQfqoHvEk9APWNwZWPBa7Zc0NI3CirRq0OIe06/RKail1SmW59KsvT7SZmVLZbK0c0kbyo5SOuPLpHxsTSDUyncQchcc5aky1SG66qZXMmYYIS0XFHdgL3dj5ZiR6XxaWjOyNReNrXAl+Ub5qGG0IcLiMgKUSDhATnJJ6esZml8SNuVDSqtX0zQqin6HmmJeZkFLRvPNWEoUlWcEdT+BhrWx7bpSXdFDl06Sanab6zrvSzLb/AKRyTc85NSJR7+A5u9xxAUleUhRGR0OAemcRsHChoZc9LuSoXTfFOcpbDsi7KS0mtaea4Xhha1AE7QEbhg9cq9OuwOcXlsIozc+LQrqluPKb2BSAgYCT9fOCevYdsde4jc784hrLtWxaBc5YnZ9VfY58lJMhIcCBgLKyThO0nb45IOM4MOa2O7tISVWRrSjWPTS6K5K0az3q7Lz9PmqYJthvmNOy7ySgrGFZQvGDhXY+YieeDXSO4dPKdWK1dbSZOpVTlstyQWlZZabKjuUpJIKlFXYHoE9+uBkNL+Ja17zvNi1ZuiVOgT03gSpnCkpdWU7gk46pJGCOmDkekYu4OK21qDelXtypW3VUClzMxLLmG3EKDi2ioDanOfeIA69s9Yc0MG9pDZViIRRrVnigvtd2Mu2bOP0SkuSbDnsszJMOr3qG5RClJJIOQO/gYubZFdbue0KTcLMtMSzdQlUTCWZhO1xAUM4UB2MSteHcEhFLMQhCHJEhCECEiBuJmqVSVpTrlFtWXuN4zKGuU5KmYS1hJ/iFtPVRz7vhjIz5GeYxFwUVuoI5rW1uZSOivBXof/sZnvTgZGZisMDQ8scHaTtqoEUD7781cwpWRvOo1Yq+ipI/aGqVyySZm8K5L2xREpzy5x5Es0lPow3hKfgrBjwqd0dtNsgCoXvPt+JHs8mD6Dur57gfCJb1s0cF7VlmoS9UcplQaw2+h5KnGlpA6EJyNqvDI7iNMpvDdONz0s5P3LJzEoh1KnmkyqgXEAglOd3TI6Rh8TtrAkh/mZzH1jY0so9CRZP9w8wulJjytd6jb8ybU06QMPVK06S6qjyNGXPoDwlJRvalptXVGfNWzBJ6d8YETa2hLbaW0J2pSAEjyAjVLFkQHHZspAQ2OW2AOx8f0wPnG2xou4eAGYsmc5tGZxI8mjgN9+N+3Yqp2nLbxGD936qhXEavbxauJPY1Cnf+LUZOkqxx3OJ/39NfsORumtGh+oF0a/m8qPJSLlJM3Ju73JxKF7Ww2F+6ev2THtkNGL8a4qF6guSckKCaq/Mhz2tPM5a2lpSdnfOVDpGu8M2duao2FCWiyU+16sdAUizKuceowR+oEfKxyHOGDUvz+kKV+9EraZaC6j0J+/lVKRp6E1u26hT5LZOpVueexsCvujzPhGs1jS+79NeGi/WbolZVlyfn6atgS8wHchD4Bzjt3EKGEAbItRrV1qRw42/nt/Sie/8AXl451jVusfTQZ/zZUQP+7mIzFm6b6mah6QSTFr0+QqNKlK3MKLHOQxMNOqaaClqU4oJU3gJ6D3gc9D4Szq7w13fUdOLJlrfekZ+tUKmGSn5fnctLu5Zcy0tWAdqlrHvbcjB6doGsJCQlRvXCU8XVskEgmeomSP8AkS8eSQtWm3vxg1S2awXfo+buKeMwltW1S0IU4vaCOoztxkdcE46xKOlmhup1a1gp1+6jyUhRGqc5Lu+ztPtureUw2hDQSG1LAHuJJJVnOcDr0y1j6JX9SeKZ/UCck5FNCXVp2aS4mbSXOW6HAg7O+feHSJGsPRJahnjDotPt3V+n0GlNqakZCiybEuhSyspQkrAG49T84/QmV6yrRP3B/KKu8V2g1637qHLXXaJkJltcm3LvsTExyltrQpRChkYKSCPHIIix9lGvKtKlG6GZRmt+yo9ublSS0l3HvBGSemfUxKwU4pCdll4QhEiakIQgQkIQgQvNMyElMuByYlWnVgY3KTk4jp9FU3/QZf8AII9kIpSdnYcji98TSTzLRf0UglkAoOPxXzl2GZdvlsNIbRnO1IwI+kIRbYxsbQ1goDkEwkk2UhCEOSJHR5pp5stvNocQe6VJyPwjvCBC6MMssI2MNNtJznCEgDPyjvCECEhCECEhCECEhCECF//Z @@ -175,6 +181,7 @@ +44 121 690 4596 email@wealthyandsons.com www.wealthyandsons.com/ + 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 @@ -188,6 +195,7 @@ 80352 +49 8932 450203 + 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 Best Designers @@ -201,6 +209,7 @@ info@bestdesigners.in +91 22 3445 0349 www.bestdesigners.com + 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 @@ -214,6 +223,7 @@ contact@jackson.com +1 786 525 0724 3203 Lamberts Branch Road + /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACWAJYDASIAAhEBAxEB/8QAHQABAAIDAQEBAQAAAAAAAAAAAAYHBAUIAwECCf/EAEAQAAEDBAEDAQMIBggHAAAAAAEAAgMEBQYREgchMUEIExUUIjJRVWGTsRgzYoGR0SM0QnFzdZTTJDVScnSy4f/EABwBAQADAQADAQAAAAAAAAAAAAABAgMEBQYHCP/EADgRAAIBAgMDBgsJAAAAAAAAAAABAgMRBCExEhNRBjJBkcHRBRQiNWFxgaHh8PEVIzNSU3KSsbL/2gAMAwEAAhEDEQA/AOy0REAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAFEMGzuhy/IL9QWyF/yW0vZF79/YzPPLkQPRo49t9z9yl6oX2X5oYLzm755Y4m/LmDb3Bo3yl+tW8lQlKXQZyk1KK4l7TzwU7Oc80cTSdbe4NG/3rw+J237QpPxm/wA1UftWllz6c0kFBqtlFzjcY4P6RwHCTvpuzrv5XL/wS6fY1d/pH/ySlOhON94utd5lVxDhKyR358Ttv2hSfjN/mnxO2/aFJ+M3+a4D+CXT7Grv9I/+S8Kq3VVIGmroJ6cO7NMsJZv+7YW0YUZu0aib9neZeNv8p/QinqqWoJFPUwzEeeDw7X8F4Xy7W2x2ipu13rYaKhpWGSaeV2msaPUrnb2NGtbeMh00D/h4vA/acsX22L/frdkeGUQt9TWY4yobW1NPGHcKyaOVpETiAfDR2H7ROjrtanhtutu7m+++727F5W7NZrnQNulvxW9fDDtwqqwRUnKMDfvAyV4eG677cG/X47qSWmuhudtp7hTh4hqIxIzmNHie4VCuzS9dV81sGA1Vmmx+kEZu+R0TpucgpW8TDTyHTde8cWuc3QPB7fv3bVwz/FLfLcYn3B0jLWzlXS09PJLFTADZD3tBaCBrY3seqirRcbJLPrLQmnnclSLQYPmFgzPHhf8AH6t9Rbi9zBNJE6IEt+l2cAdD61jW7P8AFrhcKSjo7iZfltTJS0c4id7mplja5z2xya4v0GO7gkdj3WO7ldq2hptLibjIr3asetMt1vNbHR0cWg6R+ySSdNa1o2XOJIAaASSdALDxfKrRkdXdaO3PnFTaagU1bFNCY3RvLQ4Dv520g/mub86z9+Sdd62omMc2NYOHOp2PY59P8t1x9/K1m3ODCXH5o7BgHzeRKvro5SWCPCKe6WCvkukd3kfXVNylj4SVs73HnI5uhx7ggN8NAAHhb1MPuqactX8/0ZQqbcrImSLQ49l9iyDIL1ZLRWNq6mymJla6MgsY+Tnpm/Ujgd+g3rzsDyvGcYzap7jDWXIA2uH39wdHG6RtIzRO5HNBDew3o9/uXPsSvaxrtLUkaKJ5h1Gw/E8XoclvV2bFbK/h8kljjdIZg5vNpa1oJILe/wDBYls6q4PccvpcTpbuXXiqj95FAYHgEcS7XLXHYAOxvyCPKsqU2rpOxG3G9rk3REWZYLmHpJ+rzP8AzWL85l08uYekn6vM/wDNYvzmXieUPmfE/t7TCpz4+0lyIi/PpYKtOvP9QtP+LL+TVZarTrz/AFC0/wCLL+TV7RyL8+Yf1v8AzIyr/hsk3sa/84yH/wAeL/2crZ6i9QaewQXOmtFLHdLjbKN1ZW8n8aehjDSWmZ/o52tNjHznb32bty5p6VZVcsZsl+gsADshvb6W1WkEdmzzPLfeH/tG3d+29b7bVg9ZLHJaMFsPRTEpTWZJlFS2a6VT9ukkjB5T1Ux86c8Ad/7LXD0X6BdFSq3l09mrKUptUrIqC13y82zpHmPVW4R+/vWW3gW6nmeT7uIFr5JJAw/NPH6LN74kDXgrf9Qc+stl9lzHMNw90r2XVghrq18bomGQakqGgvALzzcA4t20AgE9wF1Zj+D47acEtuGut1PW2ughZG2Oqia8SOb3MjgRrkXbcT9ZK2FZjePVlNS01XY7bPBRndNHJSsc2E/sgjQ/crPG03K7jo79xZUJJWv0fU5W63ZVHjPR/EMAxs1FLitw1TVV54OjdWRRlhmMbSOQY50hdy/taIALe5s/NuqWGYx0plrcC+H3YWWjZT0M8bN09K5wEbGh+u7z54NO9Ak6HnD6xdY8Wddm4LjeJQ5/fxJwjpGwtlpoZB52dHZb68ew0dkaXj0do+p+S5FV27qLjGNxYhStcWUUdBGIo6nfZsXnlxHIE7I762TvVmk6alNWtnrrchPymov0aaFSQ0LunPTvBZr/ADv+F5zWvnygEFs00G2ljXTD54YGvLi1uiTy7nel0VHnliq6rH8ZsFrunwC57pKKooaUsZJHEGB3AEtcynaHNaZQPUhvjkLBudhslzpaakuVooaynpXB0EU8DXtiIGgWgjQ0Oy9a2122tjijq6GnmbDsRB0YPu9jR4/V27dlzVcTGpZyWefw6jWNJx0ZyF08OQ4r1R6tXrBqGSrtNBSVrY5I2tMLJWuLotb+lxId2aDsDXYFbz2Y+q2L27p9Nj08VfeM0udxnlkohTPlfcJJSNPfLrgG6+kXHYAJ0fXqS22+httI2jt1HT0lO36MUMYY0fuC1lmxXFcfq56+02G1W2onP9LNBTMjc7Z9SB6lXni4VE1KPD3cSsaMotNM5yvuN2zOvaJx3p/T0NEyzYfQR1F5dSQNjZNOGtPDbR437tv193jyF49LclteXe1Hk2U1LpKiotrfh9it0LC58gBMReNDi1jWtcSXEAe8B+5dP2+x2e3V9VX0Fro6WrrHcqmeKFrXzHe9uIGz3JPdfLTYrLaZp5rXaaGilqHF8z4IGsdISdkuIHfuoeLWy426Ld/WTuXe9+n6GxHhERcJ0BUvZ8CmwzGblV1tSJa67XETyxs+hC0cy1oPqdO7nxvsPGzdCjnUGlqauyxxUsEk7xMCWsbs60e68PyhU5eC68IK7cSsop5lZIth8DvP2XWfhFfDZrsDo22q/DK+FfZ+L/Sl/F9xWxgKDdXbFer5R26OzWusuD4ZJHSNp4i8sBDdE68eCrI+DXb7NqvwypX04o6qiqq11XTyQB7GBpkbx33K9j5JYXE0PDFCpKm0k3qmlzWVlDbWyyh+jfSG43u4SzZBBe8dqrZUU9dbaxkIY5srHHtqRpa4eNghdFYphtqsFyrrwHz3C9XAAVdyq3B08jR9Fg0AGMGh81oA7DypF7yP/rb/ABX6X3CpXnP1E06UYLIKrPaayPILLgVPasUD/juQ10dqoyzs9pkBLi0+h4g/O9PPorTUY6kYbbM0s0FJcK6vtstHUNq6SuoZ/cz0sjQRzY/07FwP3FRRlGNROWhaabi0iqrZBiXs/YW+02SihvuZPozPVuYA1xaBydLPIf1NO0+AT39ATsqK2jNuttqxuhvTKaG63PIBPfJ4q97YqW2W6MAMbt7miPlz59zviGjzyWfVW6lz+ub0/wCl00VRj9BVMqMqyGuc6c3KZp22J0nY1BJbydohvZoBDdA2fm3S8XvpvcsZob3PBc7i6F9TdahokknMbw8NcBoBnbQY3TWjsBre+5zhFreZtvO/Ds42OdRk+bouBFG9WM3bg+OUsuMUs+eZKJJKG2QyOYyKn78aiXfdjQ3ROyN+nh2sLD+uF9r+mnyptkp7tlVXdZrXZ6Wha4U9YYw0mbvpzYmNdsk69PGzqR3HpJf47tRZFYs6qIcldRPoLrdK6kZUOqYnuDiY2HTYnNI00NGtHX1k41d7POMspbTSY9er3Y4aQSw1joat75aynlDfeRcnO1GHFuzxAHzj2VFLDWz7fT7tPgWtV6D1xzqXfMhzyCw0UlpNtx+kE+WXeIE0xmLDqCAk9gD3LiTviR6d4BnuW3C/ZldswbY5r5Q4hLFDaLTJJ7mFlXJrU8++75tloZC0Fw2Q7gQd7S7YRP0rguVZRXX4lWX+9MhxuyNiDKWKqk+bFJKDsyCJo5AE8Rw3rfcbTFuiWbWC60UcfUw1VoppZakNmtrHTxzyHb5mciWmU7OpH8i3k7Q7nd47mD2k16Nc+PcVe3LJ/PAuyyS181moprpDFBXvgY6piiJLGSFo5NBPoDsLMWHZbbSWi1wW6ia8QQggGSRz3uJJLnOc4kucSSSSdkklZi8a9cjqQREUEhERAeNbC+opJYI6mWlfIwtbNEG82E+o5Ajf94Kpyt9nHEa2smrKy/5LUVEzy+WWSaBznuPkkmLuVdKK8ZyjoykqcZ85FI/oz4R9sZB+JB/tJ+jPhH2xkH4kH+0ruRW39TiV3FPgU5ZvZzwS33SnrZam7XBkL+fyepkiMUmvAcGxtJH3bVwxRsiiZFExrI2NDWtaNBoHgAegX6RUlOUtWWjCMOagtVmFjgybF7lj9TV1dJBcKd1PLNSvDJWtcNHiSCPHbuD5W1RQm07ou1c0HT/D7Fg2MU2PY9S+4o4BsucdvlefpPefVx/+DQ7LfoiSk5O7ISSVkERFBJg3C0WyvuFBcKyjinqrdI6SkkeNmFzmlri37y0kfvWciKbgIiKAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREB//2Q== @@ -228,6 +238,7 @@ 08078 +34 934 340 230 www.lumitech.com + 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 @@ -243,6 +254,7 @@ 93, Press Avenue info@c2c.com www.camptocamp.com + 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 @@ -257,6 +269,7 @@ +33 1 64 61 04 01 12 rue Albert Einstein www.axelor.com/ + /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCACWAJYDASIAAhEBAxEB/8QAHQABAAEEAwEAAAAAAAAAAAAAAAcBAgYIAwQFCf/EADoQAAEDAwMDAQYEBAQHAAAAAAEAAgMEBREGBxIIITETCSJBUWFxFDKBkRUWM0IXI1JiJCU0Q3Kx0f/EABsBAQABBQEAAAAAAAAAAAAAAAABAgMEBQYH/8QALREAAgEDAwMBBgcAAAAAAAAAAAECAwQRBSExBhJRQRMiMmFxgQcjM1KhseH/2gAMAwEAAhEDEQA/APv4iIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAio4kDIblWOnc3/tOUNpA5EXB+PhaP8wOH6K5lbTP/LKP1KjuiMo5UVvqMcOx/ZVac9sH9VOUCqIiZQCIikBERAEREARWylwaOHnI7fNYZYN/dqNR7xXbYSx6vZV6qsdvbW3O3RwvxBE4sAzJjgXf5keWg5HIdghDaM1RWkkDz58K05Plx8qMoZRyIrWuJOPorlJIyB5KK2U4ZkgnB+Cj3frqa2r6bLNBf92Ky7UtBUcsV1FYamqhiIc1oEkkMbmREl7Q0PI5d8Z7qMZYJCd6b+zm5XXqbXSzjszGfi1Y1svvJorf3b+k3R26qamezV75W0c9VSPgdJ6cjo3ODXgHHJpAJxnCy8eAolFMjZnh1lpvFMDJbK13bw1xzleRU7h3TTr+GoLY7gPzSRhZk4Z8H4rrXK1UN0hNPWU7XhwwQWrDr29XGaUsMolCXMWebYNf6Y1I3/lt0Y53xjc/Dv2K9pruQyB5+OVDu53T3c5ed926u0lHWs95kbXdiR9Fgmj+rXV21uomaI3xtUkTHSBkNw78XfXP/wBWlqa89PrKlfRcU+Jen+GNK6dGWKq28mzwIzj6Kq87TWpLNqq2RXixV7KinlZybJG4EFd8nl2AOF0lOrTqwU4PKfqZikpLKLkRFcJCo89ux+yquG411HbKGa5XCrjp4KeN0s80sgaxjGglznE9gAAST9E5HBH/AFK7zV+0Gg4xpG2C56sv9ay1aPs+f+qr5QeLnfERRAGWR3gMYfiQtD+iu26j2P8AawX3bXWeqZrxc7jBcaS4XeoHF9dK+Flb6pHw5OjyB38hbD6W0r1B9Uu5besDbfcex6bssVNU2nb2iv2mX17/AOHmRrZLi1vrRejJUPjdjsXeiGDOCVrbuPbdw9k/a3aJv26ur7fdrre7ja5Z7nbbUaGF7J2Gh/pepJxwGkE5OcZ7KpJtNeS1J8N+T6C7Z7v0uvdca30Q6JkVVpO/Q0ZjPZzoZKOCZsh+hfJK0fP01HXUX10aZ2m1vQ7Jba2M6t19dqhkFJZaeqbHDTPfjiaiU9o+x5cfPEZPEEOMWe0V26332ev9f1XdN2pKy3fj7Syg1rBQRNe70o+0dXxcHA8W+6XAcowA4EAvI+eFn1pq2waxp9wLVfqpl6pK8VsFxdIXy/iA7kHlzs8iXdznOc4OfC8H6y/EfU+nrhaZ7Jqo5bzxzDPMfng5vU9ZrWM1R7d88+V8j7SbLP6jp6aWr36k0hHI+MGnotLxVOYj27Plmfh/b5NHf4rob1dV+1OyGoLXoa91Ffd9U3t7W2bSWnqX8TcKrJwHcOQbGzsfekLR7rjnscYt0L9XND1T7bPqLvTMotTWQsg1Bbg0taHEHhMwHvwfxcQD3a5rh3wHHTfog1FvdvB1u7jb3WHRlqv+qaeGqjpzqO9upKe0maYRNcQyOR7wyJhiEbQDxcQXNyvYNBura/0qnXoTc4tcvn7/AEN/b1YToxlBtp+eTdbYrrZ293v3VvuxTtJ6g01q7TzHSV1lv8EPJ0bXNa5zHwySMdxL2579w4Ech3UM+2n3MqbJsNYdnbM8vrtY39vOnZ3dJT0wDy3HxzM+DH2KkPpP6OaTZrd7U+9m6O5lJqrczUkbp7o6kiEENvgnl5FsURcX8XOiDWvcB7sQaAMOzA3UPdbf1A+1k01oq7V8TNObZW6O4XmondiGEU8ZrpXvPgDkYI3H/b9FuFjOxee8TbbRLNu+jrpislt17qSls9m0lp+mp7jcKhx4mZrBzIABL3PlLiGtBJLsDJWDR+0U0LJoAb1T7L7gwbf/AIsQO1rLaqYU4zIIxL6IqDUGHmePqCIjJAxnstePbCa3u+7E+z2iNF3OV2mtWl1fRTmJ8bKuWV0EcLy14B9xk2cOAIE3jupc9pzqDSGwvQJNtNYo4oGXJlBYbFSN7YiicyRxA8kCOEgn5vHzTG6yM4Nibxu1pS3bX/4vWVlfqGzSUUVZSHTVC+tmq4ZC3i6KOMFzxh2TjwASfBUUaN9o90+bg6GuGvdJUep62OkrzRUltp7E6StuMzYTPI2nhY4uc2OL35Hu4sYHDkRkLFemK+6g6Z/ZY0etNbiWKrtWk6+5UdPU5a5omlmkpIyD+Xl6kQA+HPCwn2M+x7I9jLnu7q2ijqP49VVVvs8U0eWtogWiodjwfVkYGu+Yp2D5KMLknubexs10z9Tm2vVdt7JuNthJW/hKevfRVdNcaYRTQTNa13Fwa5zSOL2kEOOQfnkDvby7J6O3d07Pab/bInvfGQybh3BXd2l2a2w2L0t/JO0ujaSyWs1clS+kpS5wdK/HJznOJc44AHc9gAB2AWUZ5AZCw7y0oXtCVKrHMWRUpxqw7ZrKZonojdzWvRNvE3bnW1XNU6ZrJ+FPJK4n0Wk9u5W8OntQWvU1ogvdorGT09TEHxSRuyCCFpv7XCwWiDRdu1E1rWVRnLWkEZPZZn7LDXOotW7FPpb3O+WOhqfSpXvz+X5d15h03qtxpPVlbQKj7ofFB+F4NHZXE6GoO0e65RtIieUXrR0BZH5yW4yPiVG/UZ002TqTsQ0pq3cjV9qtD4+FbbNOXWOmhrW+cTAxPMg/254nAyCpLTA+SAjnp96eNP8ATZo12g9Ja51Pd7UzgKGk1FcWVIoIwHe5DxjZxYS4kjv38Y8KKtwfZf7Qbra0i3H3B3f3Iul6pzGKS41N/p2y0zWPL2NjLaYcA1xLhx8HJ891s1xa3u0AZPdU4tAxgEH4FRlohpEGa73E1btJpNmzOj9otwNy7kykdDHdLvFA6CrLyT/xNW/048YdxJDD2GCPJUYdFfszbNtTdo93d74LfcdRukM1vs9MznRWlxOcjP8AUkaOwPhmO3IgOW4LmAu/L+uE4Nb/AG/FczedMWWpapC9vvzHD4U0sLP9sw52VKrWVSp72OF4IgtmyNdpzrGl3n09Qtp7TeNDSUN5MQDRLXR1ULoXuGQS70TIOWPyxgfRY5qD2eW243mr99dp9zNXbf3278/4x/KtdA2CqL3B0hMcsTwC5wDiPy8ve45WwgAycAKuB8lurGxo6fGUaWyk28fUyKdKFNNR85ML2l2R0Rs5Q1rtPCtrbldZBLe9Q3utdVXC5SNGGummeckNHZrG8WMBIa1uSovv3s5djNSdQV53/u961FJLqAAXvTkdxEdvru8ZMczWsEkkTnRxudE5/AkdwW+6thCAfIVA1oGA0YHgYWbuXMEedQHTTtT1LaOh0buTbJWtoKhtRaLjbaj0Ku2zN7CSGQAhpxgYILTgZHZuMGrugXQuvdcWnXnUFubqrceewMDbNb9SyUsdFB3BLnQU0EYlcS1pcX558QHBwGFPnFv+kfsnFpGCAmWkMLJgXUJsJpXqT2rqtn9Z3e50Nprp4Jao2WeOKWQRSCRsfJ7HDiXNZnA+A8L1tntqdMbJbaWbafRTZharHRCnpTUvDpX4cXF7yAAXOcXOOABknt8sn8H/AN5VryIxnngfdU92242RV2Mdl16+sp7fSPrKqZrGRtJc5zgAB9z4WOa/3l0Ht1bZK/UN5YHMaT6UbgXH9FqjvFvNv/1c1Mu3Wytint1imcWVdycHMY9mce8/tkfRvlc1rfUttpdPtor2lV8Rjvv836GHc3kKEdvefokRL147yXHqu3sodmdpWvuFPSVPoNlhBLJJScOOR/a3ySfkt5OkrZCj2I2gt2j4femELX1MmO7pCO5WH9JHQ7onp9of4xWtbX3ydg/FXCZo5fPi0f2N+n7qfwGMbxb4XN9HdMXlDUKusal+vV4X7V4MLTrGpCtK5rfFL+EXIiL0s3QREQDAPkJgfJEQBERAEREAVOTf9Q/dUlYZG8Qcd1wPt3Ps6U4VMnL0IycktdSw/wBSUD9V0qzVNopO8lSPsMq92nqKQ5kBd9yqs0/bGeKVn7KzL274KX3+h4VfuISSy02eeodnthi8C7QbtauBp6WSK1wu7F8jsvA+wUhx2+mi7NhaPsFytjYz8rQFjTs6ldYqTf22Lcqcpr3mRJb+lTSVdXC6a7qqi9VGeQbVvxGD/wCA8/qpIsWlbDpumbRWi2QwRMGGRxRhob9l6nEZJwhGfl+qi30uytZd0ILPn1EKFKm8pFGDvlXYHyQfJFsUi+ERFICIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgP//Z @@ -273,6 +286,7 @@ 60, Rosewood Court info@chamberworks.com +1 313 222 3456 + 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 @@ -286,6 +300,7 @@ London +44 20 1294 2193 + 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HDEKDY7SWXhz0F+zagmEcrZHvc9xc717LKpabuu1ZYyd1kBqvfL7hfuS1wLR029CpeiUuy9hS2hswHb8mc+qy/Vrh8zGRHDkoaNHur4TI14XRy2p3jwXHpysDgQPgTsd/ot3pGhbxmFZSuFhex7tuR242J3/AIkrbouqz0Kzs6za1AQQ3b6RM/MqGtf1q9MsqGZM9YhERFcLiRY2PoU8fXZXpVoq8LGhjGRtADWjyA+H+pWSiIqcz3CjO38zxHuQ5PHth1XVhhrMdz7xOYGjd55fg7y381o9UfZ8NqtpC7grOPp5fFQ04cqHczYLngtaDKNmk8+4PmOoI32263+i53WtN3Ef6ZV1S1++pEbHRHpxhobnzwB1yufM9wX19e1Hq6OhqTDY/AarvtsXyBI+0ImPkc1gHKG9efr7w32A32333OouDWcoZ7T+b4c6ogw1nD41mMbHbrCRrog57nP32O5cXkkFvmSQQrqRY+lp/wC+Vk9oL0xkQBEbRBwG5HPAA9lQp4O6yrcJstouDK6fuWMxm33rVizA/ZkThGOZmw92QGPfy297YEbbrd6h4RZCfTPD/BY3LQSR6Xux2LE1ouDpg0gkMAB2677AnoNhuVb6LP0tP9lq7XrwkGRxLuA4kR/xU7xN4M/p1xAvZzI2ajaEuENGs3dxmhshxcyXbbbYE+W/Ub+q+8Lw41kNXaD1Bm8zi559NVJqlp8XOXWGOY9jSOZvnyuAJPfcq30Wfp2bt3+81oNauxSFKRtAIGOAILT8g56Ln/h5wa1rpTM15xPomaD709smtvoOlvRsJHMyKVzPd6DoOnVxPdSfhdwzzmF4m6g19qO/jBcyXPDHTxcbmQchLf6Rwd15jyA7depJJJKtlFhltTbEclvca7d1w/dHiEEgCYmUREXQqZERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/2Q== @@ -299,6 +314,7 @@ +55 11 2402 2045 1 + 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 @@ -313,6 +329,7 @@ +54 341 324 9459 + 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 @@ -326,6 +343,7 @@ One Lincoln Street www.think-big.com + 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 @@ -341,6 +359,7 @@ 10200 S. De Anza Blvd info@seagate.com +1 800 732 4283 + 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 @@ -365,6 +384,7 @@ Liverpool L25 4RL + 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 @@ -380,6 +400,7 @@ +44 20 1294 2193 www.vicking-direct.com + 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 + - - opportunity - - - - - - - - - - - - - - opportunity - - - - - - - - + Plan to buy 60 keyboards and mouses + + + Will McEncroe + willmac@rediffmail.com + 1 rue Rockfeller + + Melbourne + + + + 1 + + + Meeting for pricing information. + + - - - - + + + + + opportunity + Interest in your Graphic Design Project + + + Agrolait + info@agrolait.com + + 69 rue de Chimay + + Wavre + 1300 + + + + 3 + + + Send Catalogue by Email + + + + + + + + opportunity + Plan to buy a Laptop + + + 12 rue Albert Einstein + + Istanbul + + + 1 + + + Call to ask system requirement + + + + + + + + opportunity + Need a new design for my website + + + Robin Smith + Global Solutions + + Union Road + + Liverpool + L25 4RL + + + 2 + + + Convert to quote + + + + + + + + opportunity + Pricing Information of Services + + + Oliver Passot BalmerInc S.A. Rue des Palais 51, bte 33 - Bruxelles - - - - - opportunity - - - + Brussels + + + + 4 + + + Send price list regarding our interventions + - - - - - - - - - Lucie Vonck - Chaussée de Namur - Grand-Rosière - - - 8 + + + + opportunity + Student's training plan in your Organization + + + Leland Martinez + Toronto University + 2488 Queens Bay + + Toronto + + + 4 + + + Call to define real needs about training + + + + + + + + opportunity + Interest in your customizable Pcs + + + Angel Cook + Chamber Works + angel.cook@chamberworks.com + + + Detroit + 7000 + + + 1 + + + Ask for the good receprion of the proposition + + + + + + + + opportunity + Interest in your Partnership Contract + + John M. Brown + Epic Technologies + john.b@tech.info + + + + 2 + + + + + + + + opportunity + “Resource Planning” project develpment + + + + + + 3 + + + + + + + + opportunity + Need script to Import external data + + + Benjamin Flores + Nebula Business + + + + + 3 + + + + + + + + opportunity + Want to subscribe to your online solution + + + + + + + 5 + + + + + + + + opportunity + Need 20 Days of Consultancy + + + info@mycompany.net + + Lima + + + + 5 + + + + + + + + + opportunity + Need to customize the solution + + + Henry Jordan + E-light Industry + henry@elight.com + Palermo, Capital Federal + C1414CMS Capital Federal + + Buenos Aires + B7313 + + + 2 + Conf call with technical service + + + + + + Kitchen design @@ -389,205 +599,7 @@ Andrew received - - - - opportunity - - - - - - - - - - - - - - - Université de Liège - Place du 20Août - Liège - - - - - - opportunity - - - - - - - - - - - - - - Bank Wealthy and sons - 1 rue Rockfeller - Paris - - - - - - - opportunity - - - - - - - - - - - - - - - - - opportunity - - - - - - - - - - - - - - Global Solutions - Union Road - Liverpool - - L25 4RL - - - - - opportunity - - - - - - - - - - - - - opportunity - - - - - - - - - - - - - opportunity - - - - - - - - - - - - - Axelor - 12 rue Albert Einstein - Champs sur Marne - - - - - - - opportunity - - - - - - - - - - - Thymbra - Palermo, Capital Federal - C1414CMS Capital Federal - Buenos Aires - - - - - - - opportunity - - - - - - - - - - - - - Epic - Chaussée de Binche, 27 - Mons - - - - - - opportunity - - - - - - - - - - - opportunity - - - - - - - - + Date: Mon, 6 Aug 2012 19:07:28 +0530 Subject: [PATCH 215/571] [IMP]: Improve validation bzr revid: aja@tinyerp.com-20120806133728-sa372lbgoc8rdebu --- openerp/tests/test_view_validation.py | 13 ++++++------- openerp/tools/view_validation.py | 24 ++++++++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/openerp/tests/test_view_validation.py b/openerp/tests/test_view_validation.py index 4e28bf4d482..c79bb367426 100644 --- a/openerp/tests/test_view_validation.py +++ b/openerp/tests/test_view_validation.py @@ -52,12 +52,13 @@ valid_form = etree.parse(StringIO('''\ invalid_graph = etree.parse(StringIO('''\ - + ''')).getroot() @@ -81,12 +82,10 @@ invalid_tree = etree.parse(StringIO('''\ valid_tree= etree.parse(StringIO('''\ - - + ''')).getroot() diff --git a/openerp/tools/view_validation.py b/openerp/tools/view_validation.py index 40e9e5be1e0..e4324d143f1 100644 --- a/openerp/tools/view_validation.py +++ b/openerp/tools/view_validation.py @@ -12,12 +12,22 @@ def valid_page_in_book(arch): def valid_field_in_graph(arch): """A `field` node must be below a `graph` node.""" - return not arch.xpath('//graph[not ((field) and (@string))]') + if arch.xpath('//graph[not (@string)]'): + return False + for child in arch.xpath('/graph/child::*'): + if child.tag != 'field': + return False + return True def valid_field_in_tree(arch): """A `field` and `button` node must be below a `tree` node. And tree must have `string` attribute.""" - return not arch.xpath('//tree[not((field) or (button)) and (@string)]') + if arch.xpath('//tree[not (@string)]'): + return False + for child in arch.xpath('/tree/child::*'): + if child.tag not in ('field', 'button'): + return False + return True def valid_att_in_field(arch): @@ -57,20 +67,18 @@ def valid_type_in_col(arch): def valid_view(arch): if arch.tag == 'form': - for pred in [valid_page_in_book,valid_att_in_form,valid_type_in_colspan,\ - valid_type_in_col,valid_att_in_field,valid_att_in_label]: + for pred in [valid_page_in_book, valid_att_in_form, valid_type_in_colspan,\ + valid_type_in_col, valid_att_in_field, valid_att_in_label]: if not pred(arch): _logger.error('Invalid XML: %s', pred.__doc__) return False elif arch.tag == 'graph': - for pred in [valid_field_in_graph,valid_type_in_colspan,valid_type_in_col,\ - valid_att_in_field,valid_att_in_label]: + for pred in [valid_field_in_graph, valid_att_in_field]: if not pred(arch): _logger.error('Invalid XML: %s', pred.__doc__) return False elif arch.tag == 'tree': - for pred in [valid_field_in_tree,valid_type_in_colspan,valid_type_in_col,\ - valid_att_in_field,valid_att_in_label]: + for pred in [valid_field_in_tree, valid_att_in_field]: if not pred(arch): _logger.error('Invalid XML: %s', pred.__doc__) return False From ce5a49fd4c67db6ae43a163d9b672675c6b09e65 Mon Sep 17 00:00:00 2001 From: "Twinkle Christian (OpenERP)" Date: Tue, 7 Aug 2012 10:30:07 +0530 Subject: [PATCH 216/571] [IMP]improve views in account bzr revid: tch@tinyerp.com-20120807050007-frozee480m1e2ux9 --- .../account_voucher/account_voucher_view.xml | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index f58f6b9c33e..5af75e245fa 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -6,20 +6,18 @@ account.voucher tree - - - - - - - - - - - - - - + + + + + + + + + + + + From c16ed1bdbbd3f0bc8f394bc9274f81f32806c1de Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Tue, 7 Aug 2012 11:36:05 +0530 Subject: [PATCH 217/571] [IMP]: crm: Improved lead tag(category) names and menu name bzr revid: rpa@tinyerp.com-20120807060605-jvapf7zpbkmu8vn0 --- addons/crm/crm_lead_data.xml | 14 +++++++------- addons/crm/crm_lead_view.xml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index ec88ca8131a..d9f2d8d0284 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -116,37 +116,37 @@ - Interested in Product + Product - Inquiry about Software + Software - Need Services + Services - Need Information + Information - Need a Website Design + Design - Interested in Training + Training - Need Consulting + Consulting diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index 3a55228d157..fa3b2d88222 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -100,7 +100,7 @@ - - - - - - + Follow-up for Project proposal + Meeting to discuss project plan and hash out the details of implementation. + + + + open - + - - - + Initial discussion + Discussion with partner for product. - - + + + + draft - + - - - + Pricing Discussion + Internal meeting for discussion for new pricing for product and services. + - - + + done - - - + Requirements review - - + + + + open - - - - - - - + Changes in Designing + info@opensides.be + + + + + draft - + - - - - - - + Presentation for new Services + + + + + done From e63254835c84d2e7cedbfe44bbcbf224c8762b2e Mon Sep 17 00:00:00 2001 From: "Twinkle Christian (OpenERP)" Date: Tue, 7 Aug 2012 13:03:59 +0530 Subject: [PATCH 222/571] [IMP]improved ciews bzr revid: tch@tinyerp.com-20120807073359-p6flrh7wr98t2pue --- addons/crm/crm_phonecall_view.xml | 2 +- addons/mrp/mrp_view.xml | 2 +- addons/project_issue/project_issue_view.xml | 2 +- addons/survey/survey_view.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml index f2c47ddee42..ebc264a3b6f 100644 --- a/addons/crm/crm_phonecall_view.xml +++ b/addons/crm/crm_phonecall_view.xml @@ -106,7 +106,7 @@ crm.phonecall form -
+
+
+
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 4469fa73fbe..de9c65fe042 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -340,7 +340,7 @@ Requests Approve hr.holidays form - {'default_type': 'add', 'search_default_approve':1} + {'default_type': 'remove', 'search_default_approve':1} [('type','=','remove')] @@ -507,7 +507,17 @@
- + + Leaves + ir.actions.act_window + hr.holidays + hr.employee + form + tree,form + {'search_default_employee_id': [active_id], 'default_employee_id': active_id} + [('type','=','remove')] + + diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml index 895474e9d7f..b141cef1bb4 100644 --- a/addons/hr_timesheet/hr_timesheet_view.xml +++ b/addons/hr_timesheet/hr_timesheet_view.xml @@ -14,7 +14,7 @@ - + @@ -42,7 +42,7 @@ - - - - -
  • - - -
  • - +
    +
    + + + +
    +
    +

    Followers

    +
      +
      +
      + + +
    • + + +
    • + + From 6aa4f80b2d9696a8dcbcc970bbd656b5842b02d4 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 10 Aug 2012 15:19:19 +0200 Subject: [PATCH 300/571] [IMP] mail: support multi routing + cleanup/lint bzr revid: odo@openerp.com-20120810131919-1zkxu41eq9oy4c74 --- addons/mail/mail_thread.py | 100 ++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index bee3eb416ef..3a2c79bbe58 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -27,7 +27,6 @@ import time import xmlrpclib from email.utils import parsedate from email.message import Message -from operator import itemgetter from osv import osv, fields from mail_message import decode, to_email @@ -37,6 +36,11 @@ from tools.safe_eval import safe_eval as eval _logger = logging.getLogger(__name__) + +def decode_header(message, header, separator=' '): + return separator.join(map(decode,message.get_all(header, []))) + + class mail_thread(osv.Model): '''Mixin model, meant to be inherited by any model that needs to act as a discussion topic on which messages can be attached. @@ -154,10 +158,9 @@ class mail_thread(osv.Model): message_obj = self.pool.get('mail.message') notification_obj = self.pool.get('mail.notification') - body = vals.get('body_html', '') if vals.get('content_subtype') == 'html' else vals.get('body_text', '') # automatically subscribe the writer of the message - if vals['user_id']: + if vals.get('user_id'): self.message_subscribe(cr, uid, [thread_id], [vals['user_id']], context=context) # create message @@ -176,12 +179,11 @@ class mail_thread(osv.Model): notification_obj.create(cr, uid, {'user_id': id, 'message_id': msg_id}, context=context) # create the email to send - email_id = self.message_create_notify_by_email(cr, uid, vals, user_to_push_ids, context=context) + self.message_create_notify_by_email(cr, uid, vals, user_to_push_ids, context=context) return msg_id def message_get_user_ids_to_notify(self, cr, uid, thread_ids, new_msg_vals, context=None): - subscription_obj = self.pool.get('mail.subscription') # get body body = new_msg_vals.get('body_html', '') if new_msg_vals.get('content_subtype') == 'html' else new_msg_vals.get('body_text', '') @@ -304,7 +306,6 @@ class mail_thread(osv.Model): threads = model_pool.browse(cr, uid, threads, context=context) ir_attachment = self.pool.get('ir.attachment') - mail_message = self.pool.get('mail.message') new_msg_ids = [] for thread in threads: @@ -504,10 +505,6 @@ class mail_thread(osv.Model): """ Retrieve all attachments names """ map_id_to_name = dict((attachment_id, '') for message in messages for attachment_id in message['attachment_ids']) - map_id_to_name = {} - for msg in messages: - for attach_id in msg["attachment_ids"]: - map_id_to_name[attach_id] = '' # use empty string as a placeholder ids = map_id_to_name.keys() names = self.pool.get('ir.attachment').name_get(cr, uid, ids, context=context) @@ -577,6 +574,8 @@ class mail_thread(osv.Model): custom_values=None, context=None): """Attempt to figure out the correct target model, thread_id, custom_values and user_id to use for an incoming message. + Multiple values may be returned, if a message had multiple + recipients matching existing mail.aliases, for example. The following heuristics are used, in this order: 1. If the message replies to an existing thread_id, and @@ -601,13 +600,13 @@ class mail_thread(osv.Model): :param int thread_id: optional ID of the record/thread from ``model`` to which this mail should be attached. Only used if the message does not reply to an existing thread and does not match any mail alias. - :return: model, thread_id, custom_values, user_id + :return: list of [model, thread_id, custom_values, user_id] """ assert isinstance(message, Message), 'message must be an email.message.Message at this point' message_id = message.get('Message-Id') # 1. Verify if this is a reply to an existing thread - references = message.get('References') or message.get('In-Reply-To') + references = decode_header(message, 'References') or decode_header(message, 'In-Reply-To') ref_match = references and tools.reference_re.search(references) if ref_match: thread_id = int(ref_match.group(1)) @@ -617,45 +616,47 @@ class mail_thread(osv.Model): and hasattr(model_pool, 'message_update'): _logger.debug('Routing mail with Message-Id %s: direct reply to model:%s, thread_id:%s, custom_values:%s, uid:%s', message_id, model, thread_id, custom_values, uid) - return model, thread_id, custom_values, uid + return [(model, thread_id, custom_values, uid)] # 2. Look for a matching mail.alias entry # Delivered-To is a safe bet in most modern MTAs, but we have to fallback on To + Cc values # for all the odd MTAs out there, as there is no standard header for the envelope's `rcpt_to` value. - rcpt_to = message.get_all('Delivered-To', []) or (message.get_all('To', []) + message.get_all('Cc', [])) - local_parts = [e.split('@')[0] for e in to_email(u','.join(map(decode,rcpt_to)))] + rcpt_tos = decode_header(message, 'Delivered-To') or \ + (decode_header(message, 'To') + decode_header(message, 'Cc') \ + + decode_header(message, 'Resent-To') + decode_header(message, 'Resent-Cc')) + local_parts = [e.split('@')[0] for e in to_email(','.join(rcpt_tos))] if local_parts: mail_alias = self.pool.get('mail.alias') alias_ids = mail_alias.search(cr, uid, [('alias_name', 'in', local_parts)]) if alias_ids: - if len(alias_ids) > 1: - _logger.warning('Multiple mail.aliases match for mail with Message-Id %s, keeping first one only: %s', - message_id, alias_ids) - alias = mail_alias.browse(cr, uid, alias_ids[0], context=context) - user_id = alias.alias_user_id.id - if not user_id: - user_id = self._message_find_user_id(cr, uid, message, context=context) - _logger.debug('Routing mail with Message-Id %s: direct alias match: model:%s, thread_id:%s, custom_values:%s, uid:%s', - message_id, model, thread_id, custom_values, uid) - return alias.alias_model_id.model, alias.alias_force_thread_id, \ - eval(alias.alias_defaults), user_id + routes = [] + for alias in mail_alias.browse(cr, uid, alias_ids, context=context): + user_id = alias.alias_user_id.id + if not user_id: + user_id = self._message_find_user_id(cr, uid, message, context=context) + routes.append((alias.alias_model_id.model, alias.alias_force_thread_id, \ + eval(alias.alias_defaults), user_id)) + _logger.debug('Routing mail with Message-Id %s: direct alias match: %r', message_id, routes) + return routes # 3. Fallback to the provided parameters, if they work model_pool = self.pool.get(model) + if not thread_id: + # Legacy: fallback to matching [ID] in the Subject + match = tools.res_re.search(decode_header(message, 'Subject')) + thread_id = match and match.group(1) assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \ "No possible route found for incoming message with Message-Id %s. " \ "Create an appropriate mail.alias or force the destination model." - if not model_pool.exists(cr, uid, thread_id): + if thread_id and not model_pool.exists(cr, uid, thread_id): _logger.warning('Received mail reply to missing document %s! Ignoring and creating new document instead for Message-Id %s', thread_id, message_id) thread_id = None _logger.debug('Routing mail with Message-Id %s: fallback to model:%s, thread_id:%s, custom_values:%s, uid:%s', message_id, model, thread_id, custom_values, uid) - return model, thread_id, custom_values, uid + return [(model, thread_id, custom_values, uid)] - - def message_process(self, cr, uid, model, message, custom_values=None, save_original=False, strip_attachments=False, thread_id=None, context=None): @@ -699,29 +700,29 @@ class mail_thread(osv.Model): if isinstance(message, unicode): message = message.encode('utf-8') msg_txt = email.message_from_string(message) - model, thread_id, custom_values, user_id = self.message_route(cr, uid, msg_txt, model, - thread_id, custom_values, - context=context) - if self._name != model: - context.update({'thread_model': model}) + routes = self.message_route(cr, uid, msg_txt, model, + thread_id, custom_values, + context=context) msg = self.pool.get('mail.message').parse_message(msg_txt, save_original=save_original, context=context) msg['state'] = 'received' if strip_attachments and 'attachments' in msg: del msg['attachments'] - - model_pool = self.pool.get(model) - assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \ - "Undeliverable mail with Message-Id %s, model %s does not accept incoming emails" % \ - (msg['message-id'], model) - if thread_id and hasattr(model_pool, 'message_update'): - model_pool.message_update(cr, user_id, [thread_id], msg, context=context) - else: - thread_id = model_pool.message_new(cr, user_id, msg, custom_values, context=context) - - # Forward the email to other followers - self.message_forward(cr, uid, model, [thread_id], msg_txt, context=context) - model_pool.message_mark_as_unread(cr, uid, [thread_id], context=context) - return thread_id + for model, thread_id, custom_values, user_id in routes: + if self._name != model: + context.update({'thread_model': model}) + model_pool = self.pool.get(model) + assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \ + "Undeliverable mail with Message-Id %s, model %s does not accept incoming emails" % \ + (msg['message-id'], model) + if thread_id and hasattr(model_pool, 'message_update'): + model_pool.message_update(cr, user_id, [thread_id], msg, context=context) + else: + thread_id = model_pool.message_new(cr, user_id, msg, custom_values, context=context) + + # Forward the email to other followers + self.message_forward(cr, uid, model, [thread_id], msg_txt, context=context) + model_pool.message_mark_as_unread(cr, uid, [thread_id], context=context) + return True def message_new(self, cr, uid, msg_dict, custom_values=None, context=None): """Called by ``message_process`` when a new message is received @@ -811,7 +812,6 @@ class mail_thread(osv.Model): """ model_pool = self.pool.get(model) smtp_server_obj = self.pool.get('ir.mail_server') - mail_message = self.pool.get('mail.message') for res in model_pool.browse(cr, uid, thread_ids, context=context): if hasattr(model_pool, 'message_thread_followers'): followers = model_pool.message_thread_followers(cr, uid, [res.id])[res.id] From 2da4b1b3f5ed22289fb8db6d664b4e5dabd12810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 10 Aug 2012 16:05:49 +0200 Subject: [PATCH 301/571] [FIX] base.sql: added a partner_id integer field on res.users, to avoid the ORM being unable to set a not null constraint on it. bzr revid: tde@openerp.com-20120810140549-w70l7nzwn4kt1oav --- openerp/addons/base/base.sql | 3 ++- openerp/addons/base/res/res_users.py | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/base.sql b/openerp/addons/base/base.sql index 7b532736165..c6ca6dbb76d 100644 --- a/openerp/addons/base/base.sql +++ b/openerp/addons/base/base.sql @@ -155,6 +155,7 @@ CREATE TABLE res_users ( -- No FK references below, will be added later by ORM -- (when the destination rows exist) company_id int, + partner_id int, primary key(id) ); alter table res_users add constraint res_users_login_uniq unique (login); @@ -383,7 +384,7 @@ CREATE TABLE ir_model_relation ( -- Users --------------------------------- -insert into res_users (id,login,password,name,active,company_id,lang) values (1,'admin','admin','Administrator',True,1,'en_US'); +insert into res_users (id,login,password,name,active,company_id,partner_id,lang) values (1,'admin','admin','Administrator',True,1,1,'en_US'); insert into ir_model_data (name,module,model,noupdate,res_id) values ('user_root','base','res.users',True,1); -- Compatibility purpose, to remove V6.0 diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 93291cb2bdd..ab3674a09d9 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -152,13 +152,13 @@ class users(osv.osv): # context is set. 'company_id': fields.many2one('res.company', 'Company', required=True, help='The company this user is currently working for.', context={'user_preference': True}), - 'context_company_id': fields.many2one('res.company', 'Company', required=True, - help='The company this user is currently working for.', context={'user_preference': True}), + # 'context_company_id': fields.many2one('res.company', 'Company', required=True, + # help='The company this user is currently working for.', context={'user_preference': True}), 'company_ids':fields.many2many('res.company','res_company_users_rel','user_id','cid','Companies'), # backward compatibility fields 'user_email': fields.related('email', type='char', deprecated='Use the email field instead of user_email. This field will be removed as of OpenERP 7.1.'), - 'date': fields.related('date', type='date', + 'date': fields.related('date', type='date', store=True, deprecated='use the login_date field instead of date. This field will be removed as of OpenERP 7.1.'), } From 7657aedc4ea77c9ad38fb1e177872d4d6c888837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 10 Aug 2012 16:12:19 +0200 Subject: [PATCH 302/571] [IMP] auth_ldap, auth_openid, base_crypt: update login_date instead of date on res.users. bzr revid: tde@openerp.com-20120810141219-qa0howq34k03ynxh --- addons/auth_ldap/users_ldap.py | 2 +- addons/auth_openid/res_users.py | 2 +- addons/base_crypt/crypt.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/auth_ldap/users_ldap.py b/addons/auth_ldap/users_ldap.py index e4615907c79..47fc41c3645 100644 --- a/addons/auth_ldap/users_ldap.py +++ b/addons/auth_ldap/users_ldap.py @@ -255,7 +255,7 @@ class users(osv.osv): cr, SUPERUSER_ID, conf, login, entry) if user_id: cr.execute("""UPDATE res_users - SET date=now() AT TIME ZONE 'UTC' + SET login_date=now() AT TIME ZONE 'UTC' WHERE login=%s""", (tools.ustr(login),)) cr.commit() diff --git a/addons/auth_openid/res_users.py b/addons/auth_openid/res_users.py index 3fb8cefcbd4..506c7e1c094 100644 --- a/addons/auth_openid/res_users.py +++ b/addons/auth_openid/res_users.py @@ -66,7 +66,7 @@ class res_users(osv.osv): else: with utils.cursor(db) as cr: cr.execute("""UPDATE res_users - SET date=now() AT TIME ZONE 'UTC' + SET login_date=now() AT TIME ZONE 'UTC' WHERE login=%s AND openid_key=%s AND active=%s RETURNING id""", (tools.ustr(login), tools.ustr(password), True)) res = cr.fetchone() diff --git a/addons/base_crypt/crypt.py b/addons/base_crypt/crypt.py index f7e200560a3..b27dad22363 100644 --- a/addons/base_crypt/crypt.py +++ b/addons/base_crypt/crypt.py @@ -213,7 +213,7 @@ class users(osv.osv): # Check if the encrypted password matches against the one in the db. cr.execute("""UPDATE res_users - SET date=now() AT TIME ZONE 'UTC' + SET login_date=now() AT TIME ZONE 'UTC' WHERE id=%s AND password=%s AND active RETURNING id""", (int(id), encrypted_pw.encode('utf-8'))) From 18f1bd6fb5c7092efdffb1ad7e3fd905ecbcd96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 10 Aug 2012 16:12:34 +0200 Subject: [PATCH 303/571] [IMP] res_users: update login_date instead of date at login. bzr revid: tde@openerp.com-20120810141234-yntr5ye3evepjakg --- openerp/addons/base/res/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index ab3674a09d9..66fa4f420de 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -372,7 +372,7 @@ class users(osv.osv): AND active FOR UPDATE NOWAIT""", (tools.ustr(login), tools.ustr(password))) cr.execute("""UPDATE res_users - SET date = now() AT TIME ZONE 'UTC' + SET login_date = now() AT TIME ZONE 'UTC' WHERE login=%s AND password=%s AND active RETURNING id""", (tools.ustr(login), tools.ustr(password))) From 620b7e9b118f102d03aed6935ac1978fd2963809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 10 Aug 2012 16:43:39 +0200 Subject: [PATCH 304/571] [IMP] Addons: user_email -> email. bzr revid: tde@openerp.com-20120810144339-30ro9omgfxtjtjyz --- addons/account/edi/invoice_action_data.xml | 8 ++++---- .../cron_account_analytic_account.py | 4 ++-- addons/auth_signup/auth_signup.py | 4 ++-- addons/base_action_rule/base_action_rule.py | 8 ++++---- addons/base_status/base_stage.py | 14 +++++++------- addons/base_status/base_state.py | 2 +- addons/crm/crm_action_rule.py | 4 ++-- addons/crm/crm_lead.py | 6 +++--- .../wizard/crm_forward_to_partner.py | 13 +++++-------- addons/event/email_template.xml | 4 ++-- addons/event/event.py | 2 +- addons/hr/hr.py | 2 +- addons/hr_recruitment/hr_recruitment.py | 2 +- addons/lunch/report/order.rml | 2 +- addons/mail/data/mail_group_data.xml | 2 +- addons/mail/mail_message.py | 11 ++++++++--- addons/mail/mail_thread.py | 10 +++++----- addons/mail/res_users.py | 15 ++++++++++----- addons/mail/wizard/mail_compose_message.py | 6 +++--- addons/portal_crm/wizard/contact.py | 2 +- addons/project/project.py | 2 +- addons/project_issue/project_issue.py | 2 +- addons/project_mailgate/project_mailgate.py | 2 +- .../edi/purchase_order_action_data.xml | 8 ++++---- addons/sale/edi/sale_order_action_data.xml | 8 ++++---- addons/share/wizard/share_wizard.py | 18 +++++++++--------- addons/survey/survey.py | 2 +- addons/survey/wizard/survey_answer.py | 4 ++-- 28 files changed, 87 insertions(+), 80 deletions(-) diff --git a/addons/account/edi/invoice_action_data.xml b/addons/account/edi/invoice_action_data.xml index ce837c6662b..0eec6d27785 100644 --- a/addons/account/edi/invoice_action_data.xml +++ b/addons/account/edi/invoice_action_data.xml @@ -38,7 +38,7 @@ Automated Invoice Notification Mail - ${object.user_id.user_email or object.company_id.email or 'noreply@localhost'} + ${object.user_id.email or object.company_id.email or 'noreply@localhost'} ${object.company_id.name} Invoice (Ref ${object.number or 'n/a' }) ${object.partner_id.email or ''} @@ -58,7 +58,7 @@ % if object.origin:   Order reference: ${object.origin}
      % endif -   Your contact: ${object.user_id.name} +   Your contact: ${object.user_id.name}

      @@ -133,7 +133,7 @@ A new invoice is available for ${object.partner_id.name}: % if object.origin: | Order reference: ${object.origin} % endif - | Your contact: ${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} + | Your contact: ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} You can view the invoice document, download it and pay online using the following link: ${ctx.get('edi_web_url_view') or 'n/a'} @@ -160,7 +160,7 @@ Thank you for choosing ${object.company_id.name}! -- -${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} +${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} ${object.company_id.name} % if object.company_id.street: ${object.company_id.street or ''} diff --git a/addons/account_analytic_analysis/cron_account_analytic_account.py b/addons/account_analytic_analysis/cron_account_analytic_account.py index caa9067b227..065fdc5b907 100644 --- a/addons/account_analytic_analysis/cron_account_analytic_account.py +++ b/addons/account_analytic_analysis/cron_account_analytic_account.py @@ -53,7 +53,7 @@ class analytic_account(osv.osv): ('name', 'not ilike', 'maintenance'), ('partner_id', '!=', False), ('user_id', '!=', False), - ('user_id.user_email', '!=', False), + ('user_id.email', '!=', False), ('state', 'in', ('draft', 'open')), '|', ('date', '<', time.strftime('%Y-%m-%d')), ('date', '=', False), ] @@ -70,7 +70,7 @@ class analytic_account(osv.osv): for user, data in users.iteritems(): subject = '[OPENERP] Reporting: Analytic Accounts' body = Template(MAKO_TEMPLATE).render_unicode(user=user, partners=data) - tools.email_send('noreply@openerp.com', [user.user_email, ], subject, body) + tools.email_send('noreply@openerp.com', [user.email, ], subject, body) return True diff --git a/addons/auth_signup/auth_signup.py b/addons/auth_signup/auth_signup.py index ebc72b3aeac..fedce607206 100644 --- a/addons/auth_signup/auth_signup.py +++ b/addons/auth_signup/auth_signup.py @@ -4,7 +4,7 @@ class res_users(osv.Model): _inherit = 'res.users' _sql_constraints = [ - ('email_uniq', 'UNIQUE (user_email)', 'You can not have two users with the same email!') + ('email_uniq', 'UNIQUE (email)', 'You can not have two users with the same email!') ] class signup_signup(osv.TransientModel): @@ -24,7 +24,7 @@ class signup_signup(osv.TransientModel): new_user = { 'name': values['name'], 'login': values['email'], - 'user_email': values['email'], + 'email': values['email'], 'password': values['password'], 'active': True, } diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index 7699256985c..b6eacda63c0 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -292,7 +292,7 @@ the rule to mark CC(mail to any other person defined in actions)."), 'object_description': hasattr(obj, 'description') and obj.description or False, 'object_user': hasattr(obj, 'user_id') and (obj.user_id and obj.user_id.name) or '/', 'object_user_email': hasattr(obj, 'user_id') and (obj.user_id and \ - obj.user_id.user_email) or '/', + obj.user_id.email) or '/', 'object_user_phone': hasattr(obj, 'partner_address_id') and (obj.partner_address_id and \ obj.partner_address_id.phone) or '/', 'partner': hasattr(obj, 'partner_id') and (obj.partner_id and obj.partner_id.name) or '/', @@ -319,8 +319,8 @@ the rule to mark CC(mail to any other person defined in actions)."), mail_message = self.pool.get('mail.message') body = self.format_mail(obj, body) if not emailfrom: - if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.user_email: - emailfrom = obj.user_id.user_email + if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: + emailfrom = obj.user_id.email name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) emailfrom = tools.ustr(emailfrom) @@ -419,7 +419,7 @@ the rule to mark CC(mail to any other person defined in actions)."), emails = [] if hasattr(obj, 'user_id') and action.act_mail_to_user: if obj.user_id: - emails.append(obj.user_id.user_email) + emails.append(obj.user_id.email) if action.act_mail_to_watchers: emails += (action.act_email_cc or '').split(',') diff --git a/addons/base_status/base_stage.py b/addons/base_status/base_stage.py index 44e9de89162..775de51394c 100644 --- a/addons/base_status/base_stage.py +++ b/addons/base_status/base_stage.py @@ -57,7 +57,7 @@ class base_stage(object): if not context or not context.get('portal'): return False user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - return user.user_email + return user.email def _get_default_user(self, cr, uid, context=None): """ Gives current user id @@ -301,15 +301,15 @@ class base_stage(object): for case in self.browse(cr, uid, ids, context=context): if not destination and not case.email_from: return False - if not case.user_id.user_email: + if not case.user_id.email: return False if destination and case.section_id.user_id: - case_email = case.section_id.user_id.user_email + case_email = case.section_id.user_id.email else: - case_email = case.user_id.user_email + case_email = case.user_id.email src = case_email - dest = case.user_id.user_email or "" + dest = case.user_id.email or "" body = case.description or "" for message in case.message_ids: if message.email_from and message.body_text: @@ -366,8 +366,8 @@ class base_stage(object): l=[] if case.email_cc: l.append(case.email_cc) - if case.user_id and case.user_id.user_email: - l.append(case.user_id.user_email) + if case.user_id and case.user_id.email: + l.append(case.user_id.email) res[case.id] = l return res diff --git a/addons/base_status/base_state.py b/addons/base_status/base_state.py index 4247e67f435..8fa2f92e22a 100644 --- a/addons/base_status/base_state.py +++ b/addons/base_status/base_state.py @@ -55,7 +55,7 @@ class base_state(object): if not context or not context.get('portal'): return False user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - return user.user_email + return user.email def _get_default_user(self, cr, uid, context=None): """ Gives current user id diff --git a/addons/crm/crm_action_rule.py b/addons/crm/crm_action_rule.py index 96d182113c8..3e3bdc90d08 100644 --- a/addons/crm/crm_action_rule.py +++ b/addons/crm/crm_action_rule.py @@ -49,8 +49,8 @@ class base_action_rule(osv.osv): mail_message = self.pool.get('mail.message') body = self.format_mail(obj, body) if not emailfrom: - if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.user_email: - emailfrom = obj.user_id.user_email + if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: + emailfrom = obj.user_id.email name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) emailfrom = tools.ustr(emailfrom) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 29d3eefec70..451dd795a94 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -243,7 +243,7 @@ class crm_lead(base_stage, osv.osv): 'partner_address_name': fields.related('partner_id', 'name', type='char', string='Partner Contact Name', readonly=True), 'partner_address_email': fields.related('partner_id', 'email', type='char', string='Partner Contact Email', readonly=True), 'company_currency': fields.related('company_id', 'currency_id', 'symbol', type='char', string='Company Currency', readonly=True), - 'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), + 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True), 'user_login': fields.related('user_id', 'login', type='char', string='User Login', readonly=True), # Fields for address, due to separation from crm and res.partner @@ -692,11 +692,11 @@ class crm_lead(base_stage, osv.osv): """ #TOFIX: mail template should be used here instead of fix subject, body text. message = self.pool.get('mail.message') - email_to = lead.user_id and lead.user_id.user_email + email_to = lead.user_id and lead.user_id.email if not email_to: return False - email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.user_email or email_to + email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.email or email_to partner = lead.partner_id and lead.partner_id.name or lead.partner_name subject = "lead %s converted into opportunity" % lead.name body = "Info \n Id : %s \n Subject: %s \n Partner: %s \n Description : %s " % (lead.id, lead.name, lead.partner_id.name, lead.description) diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py index 2bc2d67d00a..d479f8b1bd5 100644 --- a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py +++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py @@ -43,16 +43,13 @@ class crm_lead_forward_to_partner(osv.osv_memory): _defaults = { 'send_to' : 'email', 'history': 'latest', - 'email_from': lambda self, cr, uid, *a: self.pool.get('res.users')._get_email_from(cr, uid, uid)[uid], + 'email_from': lambda s, cr, uid, c: s.pool.get('res.users').browse(cr, uid, uid, c).email, } - - - def on_change_email(self, cr, uid, ids, user): + def on_change_email(self, cr, uid, ids, user, context=None): if not user: return {'value': {'email_to': False}} - email = self.pool.get('res.users')._get_email_from(cr, uid, [user])[user] - return {'value': {'email_to': email}} + return {'value': {'email_to': self.pool.get('res.users').browse(cr, uid, uid, context=context).email}} def on_change_history(self, cr, uid, ids, history_type, context=None): """Gives message body according to type of history selected @@ -80,7 +77,7 @@ class crm_lead_forward_to_partner(osv.osv_memory): partner = partner_obj.browse(cr, uid, [partner_id]) user_id = partner and partner[0].user_id or False data.update({'email_from': partner and partner[0].email or "", - 'email_cc' : user_id and user_id.user_email or '', + 'email_cc' : user_id and user_id.user or '', 'user_id': user_id and user_id.id or False}) return {'value' : data} @@ -185,7 +182,7 @@ class crm_lead_forward_to_partner(osv.osv_memory): if partner_assigned_id: assigned_partner = partner.browse(cr, uid, partner_assigned_id, context=context) user_id = assigned_partner.user_id and assigned_partner.user_id.id or False - email_cc = assigned_partner.user_id and assigned_partner.user_id.user_email or '' + email_cc = assigned_partner.user_id and assigned_partner.user_id.email or '' email = assigned_partner.email res.update({ diff --git a/addons/event/email_template.xml b/addons/event/email_template.xml index 4485dfc785a..2666ece9921 100644 --- a/addons/event/email_template.xml +++ b/addons/event/email_template.xml @@ -4,7 +4,7 @@ Confirmation of the Event - ${object.user_id.user_email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'} + ${object.user_id.email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'} ${object.email} Your registration at ${object.event_id.name} @@ -24,7 +24,7 @@ Confirmation of the Registration - ${object.user_id.user_email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'} + ${object.user_id.email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'} ${object.email} Your registration at ${object.event_id.name} diff --git a/addons/event/event.py b/addons/event/event.py index 4279b8fcd7e..7f0c77661e4 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -230,7 +230,7 @@ class event_event(osv.osv): curr_reg_ids = register_pool.search(cr, uid, [('user_id', '=', user.id), ('event_id', '=' , ids[0])]) #the subscription is done with SUPERUSER_ID because in case we share the kanban view, we want anyone to be able to subscribe if not curr_reg_ids: - curr_reg_ids = [register_pool.create(cr, SUPERUSER_ID, {'event_id': ids[0] ,'email': user.user_email, 'name':user.name, 'user_id': user.id, 'nb_register': num_of_seats})] + curr_reg_ids = [register_pool.create(cr, SUPERUSER_ID, {'event_id': ids[0] ,'email': user.email, 'name':user.name, 'user_id': user.id, 'nb_register': num_of_seats})] else: register_pool.write(cr, uid, curr_reg_ids, {'nb_register': num_of_seats}, context=context) return register_pool.confirm_registration(cr, SUPERUSER_ID, curr_reg_ids, context=context) diff --git a/addons/hr/hr.py b/addons/hr/hr.py index 47432e1f527..966c29cab07 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -252,7 +252,7 @@ class hr_employee(osv.osv): def onchange_user(self, cr, uid, ids, user_id, context=None): work_email = False if user_id: - work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).user_email + work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).email return {'value': {'work_email' : work_email}} def _get_default_image(self, cr, uid, context=None): diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 1db79172dc5..ee85ecc22a3 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -228,7 +228,7 @@ class hr_applicant(base_stage, osv.Model): multi='day_close', type="float", store=True), 'color': fields.integer('Color Index'), 'emp_id': fields.many2one('hr.employee', 'employee'), - 'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), + 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True), } _defaults = { diff --git a/addons/lunch/report/order.rml b/addons/lunch/report/order.rml index 30c16ad4894..b09b59bb96b 100644 --- a/addons/lunch/report/order.rml +++ b/addons/lunch/report/order.rml @@ -103,7 +103,7 @@ [[ user.name ]] [[ user.login ]] - [[ user.user_email ]] + [[ user.email ]] diff --git a/addons/mail/data/mail_group_data.xml b/addons/mail/data/mail_group_data.xml index 09a6ca29a2d..49c6fbdc1b6 100644 --- a/addons/mail/data/mail_group_data.xml +++ b/addons/mail/data/mail_group_data.xml @@ -21,7 +21,7 @@ Welcome to OpenERP! Your homepage is a summary of messages you received and key information about documents you follow. -The top menu bar contains all applications you installed. You can use this <i>Settings</i> menu to intall more applications, activate others features or give access to new users. +The top menu bar contains all applications you installed. You can use this <i>Settings</i> menu to install more applications, activate others features or give access to new users. To setup your preferences (name, email signature, avatar), click on the top right corner. diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index b96b6e3791e..8845b3750b9 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -93,6 +93,9 @@ class mail_message_common(osv.TransientModel): return result def name_get(self, cr, uid, ids, context=None): + # name_get may receive int id instead of an id list + if isinstance(ids, (int, long)): + ids = [ids] res = [] for message in self.browse(cr, uid, ids, context=context): name = '' @@ -208,12 +211,13 @@ class mail_message(osv.Model): 'partner_id': fields.many2one('res.partner', 'Related partner', help="Deprecated field. Use partner_ids instead."), 'partner_ids': fields.many2many('res.partner', - 'mail_message_destination_partner_rel', + 'mail_message_res_partner_rel', 'message_id', 'partner_id', 'Destination partners', help="When sending emails through the social network composition wizard"\ "you may choose to send a copy of the mail to partners."), 'user_id': fields.many2one('res.users', 'Related User', readonly=1), - 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', 'message_id', 'attachment_id', 'Attachments'), + 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', + 'message_id', 'attachment_id', 'Attachments'), 'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing mail server', readonly=1), 'state': fields.selection([ ('outgoing', 'Outgoing'), @@ -371,7 +375,8 @@ class mail_message(osv.Model): } email_msg_id = self.create(cr, uid, msg_vals, context) attachment_ids = [] - for fname, fcontent in attachments.iteritems(): + for attachment in attachments: + fname, fcontent = attachment attachment_data = { 'name': fname, 'datas_fname': fname, diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index f0dd023bf06..068dd844829 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -353,7 +353,7 @@ class mail_thread(osv.Model): data.update({ 'email_to': email_to, 'email_from': email_from or \ - (hasattr(thread, 'user_id') and thread.user_id and thread.user_id.user_email), + (hasattr(thread, 'user_id') and thread.user_id and thread.user_id.email), 'email_cc': email_cc, 'email_bcc': email_bcc, 'references': references, @@ -771,7 +771,7 @@ class mail_thread(osv.Model): for thread in self.browse(cr, uid, ids, context=context): l = set() for message in thread.message_ids: - l.add((message.user_id and message.user_id.user_email) or '') + l.add((message.user_id and message.user_id.email) or '') l.add(message.email_from or '') l.add(message.email_cc or '') res[thread.id] = filter(None, l) @@ -985,9 +985,9 @@ class mail_thread(osv.Model): if not user.notification_email_pref == 'all' and \ not (user.notification_email_pref == 'to_me' and user.id in user_to_push_from_parse_ids): continue - if not user.user_email: + if not user.email: continue - email_to = '%s, %s' % (email_to, user.user_email) + email_to = '%s, %s' % (email_to, user.email) email_to = email_to.lstrip(', ') # did not find any email address: not necessary to create an email @@ -998,7 +998,7 @@ class mail_thread(osv.Model): current_user = res_users_obj.browse(cr, uid, [uid], context=context)[0] email_from = new_msg_values.get('email_from') if not email_from: - email_from = current_user.user_email + email_from = current_user.email # get email content, create it (with mail_message.create) email_values = self.message_create_notify_get_email_dict(cr, uid, new_msg_values, email_from, email_to, context) diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py index 8a590fc318f..c299df588d5 100644 --- a/addons/mail/res_users.py +++ b/addons/mail/res_users.py @@ -40,9 +40,8 @@ class res_users(osv.osv): _columns = { 'notification_email_pref': fields.selection([ - ('all', 'All feeds'), - ('comments', 'Only comments'), - ('to_me', 'Only when sent directly to me'), + ('all', 'All Feeds'), + ('to_me', 'Only send directly to me'), ('none', 'Never') ], 'Receive Feeds by Email', required=True, help="Choose in which case you want to receive an email when you "\ @@ -101,8 +100,14 @@ class res_users(osv.osv): self.message_subscribe(cr, uid, [user_id], [user_id], context=context) # create a welcome message company_name = user.company_id.name if user.company_id else _('the company') - message = _('%s joined the %s network! Take a moment to welcome %s.') % (user.name, company_name, user.name) - self.message_append_note(cr, uid, [user_id], body=message, type='comment', context=context) + message = '''%s has joined %s! Welcome in OpenERP ! + +Your homepage is a summary of messages you received and key information about documents you follow. + +The top menu bar contains all applications you installed. You can use this Settings menu to install more applications, activate others features or give access to new users. + +To setup your preferences (name, email signature, avatar), click on the top right corner.''' % (user.name, company_name) + self.message_append_note(cr, uid, [user_id], subject='Welcome to OpenERP', body=message, type='comment', content_subtype='html', context=context) return user_id def write(self, cr, uid, ids, vals, context=None): diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index d26511464f8..fe87b7584e0 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -100,7 +100,7 @@ class mail_compose_message(osv.TransientModel): # Try to provide default email_from if not specified yet if not result.get('email_from'): current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - result['email_from'] = current_user.user_email or False + result['email_from'] = current_user.email or False return result _columns = { @@ -133,7 +133,7 @@ class mail_compose_message(osv.TransientModel): result.update({ 'model': model, 'res_id': res_id, - 'email_from': user.user_email or tools.config.get('email_from', False), + 'email_from': user.email or tools.config.get('email_from', False), 'body_html': False, 'body_text': False, 'subject': False, @@ -223,7 +223,7 @@ class mail_compose_message(osv.TransientModel): 'dest_partner_ids': dest_partner_ids, 'model': message_data.model or False, 'res_id': message_data.res_id or False, - 'email_from': current_user.user_email or message_data.email_to or False, + 'email_from': current_user.email or message_data.email_to or False, 'email_to': message_data.reply_to or message_data.email_from or False, 'email_cc': message_data.email_cc or False, 'user_id': uid, diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py index 505bb62bb16..036993e1720 100644 --- a/addons/portal_crm/wizard/contact.py +++ b/addons/portal_crm/wizard/contact.py @@ -50,7 +50,7 @@ class crm_contact_us(osv.TransientModel): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) if (user.login != 'anonymous'): - return user.user_email + return user.email else: return None diff --git a/addons/project/project.py b/addons/project/project.py index 707df5607c6..355665152a2 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -794,7 +794,7 @@ class task(base_stage, osv.osv): 'company_id': fields.many2one('res.company', 'Company'), 'id': fields.integer('ID', readonly=True), 'color': fields.integer('Color Index'), - 'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), + 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True), } _defaults = { diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 935935e28ca..33c2693d7bb 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -256,7 +256,7 @@ class project_issue(base_stage, osv.osv): 'inactivity_days': fields.function(_compute_day, string='Days since last action', \ multi='compute_day', type="integer", help="Difference in days between last action and current date"), 'color': fields.integer('Color Index'), - 'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), + 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True), 'date_action_last': fields.datetime('Last Action', readonly=1), 'date_action_next': fields.datetime('Next Action', readonly=1), 'progress': fields.function(_hours_get, string='Progress (%)', multi='hours', group_operator="avg", help="Computed as: Time Spent / Total Time.", diff --git a/addons/project_mailgate/project_mailgate.py b/addons/project_mailgate/project_mailgate.py index 0ca2687b7f0..ba3cd702760 100644 --- a/addons/project_mailgate/project_mailgate.py +++ b/addons/project_mailgate/project_mailgate.py @@ -73,7 +73,7 @@ class project_tasks(osv.osv): followers = super(project_tasks,self).message_thread_followers(cr, uid, ids, context=context) for task in self.browse(cr, uid, followers.keys(), context=context): task_followers = set(followers[task.id]) - task_followers.add(task.user_id.user_email) + task_followers.add(task.user_id.email) followers[task.id] = filter(None, task_followers) return followers diff --git a/addons/purchase/edi/purchase_order_action_data.xml b/addons/purchase/edi/purchase_order_action_data.xml index 70d402de598..b97da91fa1d 100644 --- a/addons/purchase/edi/purchase_order_action_data.xml +++ b/addons/purchase/edi/purchase_order_action_data.xml @@ -38,7 +38,7 @@ Automated Purchase Order Notification Mail - ${object.validator.user_email or ''} + ${object.validator.email or ''} ${object.company_id.name} Order (Ref ${object.name or 'n/a' }) ${object.partner_id.email} @@ -61,7 +61,7 @@ % if object.partner_ref:   Your reference: ${object.partner_ref}
      % endif -   Your contact: ${object.validator.name} +   Your contact: ${object.validator.name}

      @@ -121,7 +121,7 @@ Here is a ${object.state in ('draft', 'sent') and 'request for quotation' or 'pu % if object.partner_ref: | Your reference: ${object.partner_ref}
      % endif - | Your contact: ${object.validator.name} ${object.validator.user_email and '<%s>'%(object.validator.user_email) or ''} + | Your contact: ${object.validator.name} ${object.validator.email and '<%s>'%(object.validator.email) or ''} You can view the ${object.state in ('draft', 'sent') and 'request for quotation' or 'order confirmation'} and download it using the following link: ${ctx.get('edi_web_url_view') or 'n/a'} @@ -132,7 +132,7 @@ Thank you! -- -${object.validator.name} ${object.validator.user_email and '<%s>'%(object.validator.user_email) or ''} +${object.validator.name} ${object.validator.email and '<%s>'%(object.validator.email) or ''} ${object.company_id.name} % if object.company_id.street: ${object.company_id.street or ''} diff --git a/addons/sale/edi/sale_order_action_data.xml b/addons/sale/edi/sale_order_action_data.xml index 2fe0a8cbfd3..181bd8183d7 100644 --- a/addons/sale/edi/sale_order_action_data.xml +++ b/addons/sale/edi/sale_order_action_data.xml @@ -37,7 +37,7 @@ Automated Sale Order Notification Mail - ${object.user_id.user_email or ''} + ${object.user_id.email or ''} ${object.company_id.name} Order (Ref ${object.name or 'n/a' }) ${object.partner_invoice_id.email} @@ -60,7 +60,7 @@ % if object.client_order_ref:   Your reference: ${object.client_order_ref}
      % endif -   Your contact: ${object.user_id.name} +   Your contact: ${object.user_id.name}

      @@ -139,7 +139,7 @@ Here is your ${object.state in ('draft', 'sent') and 'quotation' or 'order confi % if object.client_order_ref: | Your reference: ${object.client_order_ref}
      % endif - | Your contact: ${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} + | Your contact: ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} You can view the ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'}, download it and even pay online using the following link: ${ctx.get('edi_web_url_view') or 'n/a'} @@ -166,7 +166,7 @@ Thank you for choosing ${object.company_id.name}! -- -${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} +${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} ${object.company_id.name} % if object.company_id.street: ${object.company_id.street or ''} diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index b14da39633e..598bb085967 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -196,7 +196,7 @@ class share_wizard(osv.TransientModel): } def has_email(self, cr, uid, context=None): - return bool(self.pool.get('res.users').browse(cr, uid, uid, context=context).user_email) + return bool(self.pool.get('res.users').browse(cr, uid, uid, context=context).email) def go_step_1(self, cr, uid, ids, context=None): wizard_data = self.browse(cr,uid,ids,context)[0] @@ -241,7 +241,7 @@ class share_wizard(osv.TransientModel): if not wizard_data.invite: existing = user_obj.search(cr, UID_ROOT, [('login', '=', new_user)]) else: - existing = user_obj.search(cr, UID_ROOT, [('user_email', '=', new_user)]) + existing = user_obj.search(cr, UID_ROOT, [('email', '=', new_user)]) existing_ids.extend(existing) if existing: new_line = { 'user_id': existing[0], @@ -253,7 +253,7 @@ class share_wizard(osv.TransientModel): 'login': new_user, 'password': new_pass, 'name': new_user, - 'user_email': new_user, + 'email': new_user, 'groups_id': [(6,0,[group_id])], 'share': True, 'message_email_pref': 'all', @@ -825,12 +825,12 @@ class share_wizard(osv.TransientModel): message_obj = self.pool.get('mail.message') notification_obj = self.pool.get('mail.notification') user = self.pool.get('res.users').browse(cr, UID_ROOT, uid) - if not user.user_email: + if not user.email: raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.')) # TODO: also send an HTML version of this mail for result_line in wizard_data.result_line_ids: - email_to = result_line.user_id.user_email + email_to = result_line.user_id.email if not email_to: continue subject = _('Invitation to collaborate about %s') % (wizard_data.record_name) @@ -849,20 +849,20 @@ class share_wizard(osv.TransientModel): body += "--\n" body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n" "It is open source and can be found on http://www.openerp.com.") - msg_id = message_obj.schedule_with_attach(cr, uid, user.user_email, [email_to], subject, body, model='', context=context) + msg_id = message_obj.schedule_with_attach(cr, uid, user.email, [email_to], subject, body, model='', context=context) notification_obj.create(cr, uid, {'user_id': result_line.user_id.id, 'message_id': msg_id}, context=context) def send_emails(self, cr, uid, wizard_data, context=None): _logger.info('Sending share notifications by email...') mail_message = self.pool.get('mail.message') user = self.pool.get('res.users').browse(cr, UID_ROOT, uid) - if not user.user_email: + if not user.email: raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.')) # TODO: also send an HTML version of this mail msg_ids = [] for result_line in wizard_data.result_line_ids: - email_to = result_line.user_id.user_email + email_to = result_line.user_id.email if not email_to: continue subject = wizard_data.name @@ -883,7 +883,7 @@ class share_wizard(osv.TransientModel): body += "--\n" body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n" "It is open source and can be found on http://www.openerp.com.") - msg_ids.append(mail_message.schedule_with_attach(cr, uid, user.user_email, [email_to], subject, body, model='share.wizard', context=context)) + msg_ids.append(mail_message.schedule_with_attach(cr, uid, user.email, [email_to], subject, body, model='share.wizard', context=context)) # force direct delivery, as users expect instant notification mail_message.send(cr, uid, msg_ids, context=context) _logger.info('%d share notification(s) sent.', len(msg_ids)) diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 0a96d1fde1c..93bd48be30c 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -740,7 +740,7 @@ class survey_request(osv.osv): if user_id: user_obj = self.pool.get('res.users') user = user_obj.browse(cr, uid, user_id, context=context) - return {'value': {'email': user.user_email}} + return {'value': {'email': user.email}} return {} survey_request() diff --git a/addons/survey/wizard/survey_answer.py b/addons/survey/wizard/survey_answer.py index b3f27ed2970..66098b45fa8 100644 --- a/addons/survey/wizard/survey_answer.py +++ b/addons/survey/wizard/survey_answer.py @@ -414,8 +414,8 @@ class survey_question_wiz(osv.osv_memory): file.close() os.remove(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf") - user_email = user_obj.browse(cr, uid, uid, context).user_email - resp_email = survey_data.responsible_id and survey_data.responsible_id.user_email or False + user_email = user_obj.browse(cr, uid, uid, context).email + resp_email = survey_data.responsible_id and survey_data.responsible_id.email or False if user_email and resp_email: user_name = user_obj.browse(cr, uid, uid, context=context).name From e8e7c91138608c88b5ca7d92204dc3a44177073e Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 10 Aug 2012 17:11:08 +0200 Subject: [PATCH 305/571] [IMP] hr_expense: small improvements bzr revid: qdp-launchpad@openerp.com-20120810151108-lxqlaxh7m6yd31fi --- addons/hr_expense/hr_expense_view.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 4e4d221c342..1f9d49ee7c1 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -68,7 +68,7 @@ From 4dc0440cb1900b05bf1f84e6bdd33fe6746c0b25 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 12 Aug 2012 19:43:06 +0200 Subject: [PATCH 312/571] wip options bzr revid: al@openerp.com-20120812174306-p47bfuzo2r030r3t --- addons/auth_signup/res_users.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py index 46f264c6729..1b73dc2f622 100644 --- a/addons/auth_signup/res_users.py +++ b/addons/auth_signup/res_users.py @@ -5,6 +5,9 @@ class res_users(osv.Model): _inherit = 'res.users' def auth_signup_create(self, cr, uid, new_user, context=None): + # add login, email, name passowrd + # if options groups + # add groups user_template_id = self.pool.get('ir.config_parameter').get_param(cr, uid, 'auth.signup_template_user_id', 0) if user_template_id: self.pool.get('res.users').copy(cr, 1, user_template_id, new_user, context=context) From aa93e7186d560122ba8be7465fb806a123a6c840 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 12 Aug 2012 23:48:27 +0200 Subject: [PATCH 313/571] [IMP] web controller helpers - move helpers on top - move some code from controllers to helpers - deprecate module dependecy processing in standalone client bzr revid: al@openerp.com-20120812214827-m1wrv7y1jvnro9ew --- addons/web/controllers/main.py | 589 +++++++++++++++++---------------- 1 file changed, 297 insertions(+), 292 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 9239dae3f4c..a90d231e471 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -31,9 +31,138 @@ from .. import common openerpweb = common.http #---------------------------------------------------------- -# OpenERP Web web Controllers +# OpenERP Web helpers #---------------------------------------------------------- +def sass2scss(src): + # Validated by diff -u of sass2scss against: + # sass-convert -F sass -T scss openerp.sass openerp.scss + block = [] + sass = ('', block) + reComment = re.compile(r'//.*$') + reIndent = re.compile(r'^\s+') + reIgnore = re.compile(r'^\s*(//.*)?$') + reFixes = { re.compile(r'\(\((.*)\)\)') : r'(\1)', } + lastLevel = 0 + prevBlocks = {} + for l in src.split('\n'): + l = l.rstrip() + if reIgnore.search(l): continue + l = reComment.sub('', l) + l = l.rstrip() + indent = reIndent.match(l) + level = indent.end() if indent else 0 + l = l[level:] + if level>lastLevel: + prevBlocks[lastLevel] = block + newBlock = [] + block[-1] = (block[-1], newBlock) + block = newBlock + elif level=0: + out += indent+sass[0]+" {\n" + for e in sass[1]: + out += write(e, level+1) + if level>=0: + out = out.rstrip(" \n") + out += ' }\n' + if level==0: + out += "\n" + else: + out += indent+sass+";\n" + return out + return write(sass) + +def db_list(req): + proxy = req.session.proxy("db") + dbs = proxy.list() + h = req.httprequest.environ['HTTP_HOST'].split(':')[0] + d = h.split('.')[0] + r = req.config.dbfilter.replace('%h', h).replace('%d', d) + dbs = [i for i in dbs if re.match(r, i)] + return dbs + +def module_topological_sort(modules): + """ Return a list of module names sorted so that their dependencies of the + modules are listed before the module itself + + modules is a dict of {module_name: dependencies} + + :param modules: modules to sort + :type modules: dict + :returns: list(str) + """ + + dependencies = set(itertools.chain.from_iterable(modules.itervalues())) + # incoming edge: dependency on other module (if a depends on b, a has an + # incoming edge from b, aka there's an edge from b to a) + # outgoing edge: other module depending on this one + + # [Tarjan 1976], http://en.wikipedia.org/wiki/Topological_sorting#Algorithms + #L ← Empty list that will contain the sorted nodes + L = [] + #S ← Set of all nodes with no outgoing edges (modules on which no other + # module depends) + S = set(module for module in modules if module not in dependencies) + + visited = set() + #function visit(node n) + def visit(n): + #if n has not been visited yet then + if n not in visited: + #mark n as visited + visited.add(n) + #change: n not web module, can not be resolved, ignore + if n not in modules: return + #for each node m with an edge from m to n do (dependencies of n) + for m in modules[n]: + #visit(m) + visit(m) + #add n to L + L.append(n) + #for each node n in S do + for n in S: + #visit(n) + visit(n) + return L + +def module_installed(req): + # Candidates module the current heuristic is the /static dir + loadable = openerpweb.addons_manifest.keys() + modules = {} + # Retrieve database installed modules + Modules = req.session.model('ir.module.module') + domain = [('state','=','installed'), ('name','in', loadable)] + for module in Modules.search_read(domain, ['name', 'dependencies_id']): + modules[module['name']] = [] + deps = module.get('dependencies_id') + if deps: + deps_read = req.session.model('ir.module.module.dependency').read(deps, ['name']) + dependencies = [i['name'] for i in deps_read] + modules[module['name']] = dependencies + + sorted_modules = module_topological_sort(modules) + return sorted_modules + +def module_boot(req): + addons = [] + for i in req.config.server_wide_modules: + if i in openerpweb.addons_manifest: + addons.append(i) + return addons + def concat_xml(file_list): """Concatenate xml files @@ -89,64 +218,9 @@ def concat_files(file_list, reader=None, intersperse=""): files_concat = intersperse.join(files_content) return files_concat, checksum.hexdigest() -def sass2scss(src): - # Validated by diff -u of sass2scss against: - # sass-convert -F sass -T scss openerp.sass openerp.scss - block = [] - sass = ('', block) - reComment = re.compile(r'//.*$') - reIndent = re.compile(r'^\s+') - reIgnore = re.compile(r'^\s*(//.*)?$') - reFixes = { re.compile(r'\(\((.*)\)\)') : r'(\1)', } - lastLevel = 0 - prevBlocks = {} - for l in src.split('\n'): - l = l.rstrip() - if reIgnore.search(l): continue - l = reComment.sub('', l) - l = l.rstrip() - indent = reIndent.match(l) - level = indent.end() if indent else 0 - l = l[level:] - if level>lastLevel: - prevBlocks[lastLevel] = block - newBlock = [] - block[-1] = (block[-1], newBlock) - block = newBlock - elif level=0: - out += indent+sass[0]+" {\n" - for e in sass[1]: - out += write(e, level+1) - if level>=0: - out = out.rstrip(" \n") - out += ' }\n' - if level==0: - out += "\n" - else: - out += indent+sass+";\n" - return out - return write(sass) - -def server_wide_modules(req): - addons = [i for i in req.config.server_wide_modules if i in openerpweb.addons_manifest] - return addons - def manifest_glob(req, addons, key): if addons is None: - addons = server_wide_modules(req) + addons = module_boot(req) else: addons = addons.split(',') r = [] @@ -214,6 +288,164 @@ def make_conditional(req, response, last_modified=None, etag=None): response.set_etag(etag) return response.make_conditional(req.httprequest) +def login_and_redirect(req, db, login, key, redirect_url='/'): + req.session.authenticate(db, login, key, {}) + redirect = werkzeug.utils.redirect(redirect_url, 303) + cookie_val = urllib2.quote(simplejson.dumps(req.session_id)) + redirect.set_cookie('instance0|session_id', cookie_val) + return redirect + +def eval_context_and_domain(session, context, domain=None): + e_context = session.eval_context(context) + # should we give the evaluated context as an evaluation context to the domain? + e_domain = session.eval_domain(domain or []) + + return e_context, e_domain + +def load_actions_from_ir_values(req, key, key2, models, meta): + context = req.session.eval_context(req.context) + Values = req.session.model('ir.values') + actions = Values.get(key, key2, models, meta, context) + + return [(id, name, clean_action(req, action)) + for id, name, action in actions] + +def clean_action(req, action, do_not_eval=False): + action.setdefault('flags', {}) + + context = req.session.eval_context(req.context) + eval_ctx = req.session.evaluation_context(context) + + if not do_not_eval: + # values come from the server, we can just eval them + if action.get('context') and isinstance(action.get('context'), basestring): + action['context'] = eval( action['context'], eval_ctx ) or {} + + if action.get('domain') and isinstance(action.get('domain'), basestring): + action['domain'] = eval( action['domain'], eval_ctx ) or [] + else: + if 'context' in action: + action['context'] = parse_context(action['context'], req.session) + if 'domain' in action: + action['domain'] = parse_domain(action['domain'], req.session) + + action_type = action.setdefault('type', 'ir.actions.act_window_close') + if action_type == 'ir.actions.act_window': + return fix_view_modes(action) + return action + +# I think generate_views,fix_view_modes should go into js ActionManager +def generate_views(action): + """ + While the server generates a sequence called "views" computing dependencies + between a bunch of stuff for views coming directly from the database + (the ``ir.actions.act_window model``), it's also possible for e.g. buttons + to return custom view dictionaries generated on the fly. + + In that case, there is no ``views`` key available on the action. + + Since the web client relies on ``action['views']``, generate it here from + ``view_mode`` and ``view_id``. + + Currently handles two different cases: + + * no view_id, multiple view_mode + * single view_id, single view_mode + + :param dict action: action descriptor dictionary to generate a views key for + """ + view_id = action.get('view_id') or False + if isinstance(view_id, (list, tuple)): + view_id = view_id[0] + + # providing at least one view mode is a requirement, not an option + view_modes = action['view_mode'].split(',') + + if len(view_modes) > 1: + if view_id: + raise ValueError('Non-db action dictionaries should provide ' + 'either multiple view modes or a single view ' + 'mode and an optional view id.\n\n Got view ' + 'modes %r and view id %r for action %r' % ( + view_modes, view_id, action)) + action['views'] = [(False, mode) for mode in view_modes] + return + action['views'] = [(view_id, view_modes[0])] + +def fix_view_modes(action): + """ For historical reasons, OpenERP has weird dealings in relation to + view_mode and the view_type attribute (on window actions): + + * one of the view modes is ``tree``, which stands for both list views + and tree views + * the choice is made by checking ``view_type``, which is either + ``form`` for a list view or ``tree`` for an actual tree view + + This methods simply folds the view_type into view_mode by adding a + new view mode ``list`` which is the result of the ``tree`` view_mode + in conjunction with the ``form`` view_type. + + TODO: this should go into the doc, some kind of "peculiarities" section + + :param dict action: an action descriptor + :returns: nothing, the action is modified in place + """ + if not action.get('views'): + generate_views(action) + + id_form = None + for index, (id, mode) in enumerate(action['views']): + if mode == 'form': + id_form = id + break + + if action.pop('view_type', 'form') != 'form': + return action + + action['views'] = [ + [id, mode if mode != 'tree' else 'list'] + for id, mode in action['views'] + ] + + return action + +def parse_domain(domain, session): + """ Parses an arbitrary string containing a domain, transforms it + to either a literal domain or a :class:`common.nonliterals.Domain` + + :param domain: the domain to parse, if the domain is not a string it + is assumed to be a literal domain and is returned as-is + :param session: Current OpenERP session + :type session: openerpweb.openerpweb.OpenERPSession + """ + if not isinstance(domain, basestring): + return domain + try: + return ast.literal_eval(domain) + except ValueError: + # not a literal + return common.nonliterals.Domain(session, domain) + +def parse_context(context, session): + """ Parses an arbitrary string containing a context, transforms it + to either a literal context or a :class:`common.nonliterals.Context` + + :param context: the context to parse, if the context is not a string it + is assumed to be a literal domain and is returned as-is + :param session: Current OpenERP session + :type session: openerpweb.openerpweb.OpenERPSession + """ + if not isinstance(context, basestring): + return context + try: + return ast.literal_eval(context) + except ValueError: + return common.nonliterals.Context(session, context) + +#---------------------------------------------------------- +# OpenERP Web web Controllers +#---------------------------------------------------------- + html_template = """ @@ -246,21 +478,14 @@ class Home(openerpweb.Controller): r = html_template % { 'js': js, 'css': css, - 'modules': simplejson.dumps(server_wide_modules(req)), + 'modules': simplejson.dumps(module_boot(req)), 'init': 'var wc = new s.web.WebClient();wc.appendTo($(document.body));' } return r @openerpweb.httprequest def login(self, req, db, login, key): - return self._login(req, db, login, key) - - def _login(self, req, db, login, key, redirect_url='/'): - req.session.authenticate(db, login, key, {}) - redirect = werkzeug.utils.redirect(redirect_url, 303) - cookie_val = urllib2.quote(simplejson.dumps(req.session_id)) - redirect.set_cookie('instance0|session_id', cookie_val) - return redirect + return login_and_redirect(req, db, login, key) class WebClient(openerpweb.Controller): _cp_path = "/web/webclient" @@ -410,12 +635,7 @@ class Database(openerpweb.Controller): @openerpweb.jsonrequest def get_list(self, req): - proxy = req.session.proxy("db") - dbs = proxy.list() - h = req.httprequest.environ['HTTP_HOST'].split(':')[0] - d = h.split('.')[0] - r = req.config.dbfilter.replace('%h', h).replace('%d', d) - dbs = [i for i in dbs if re.match(r, i)] + dbs = db_list(req) return {"db_list": dbs} @openerpweb.jsonrequest @@ -484,50 +704,6 @@ class Database(openerpweb.Controller): return {'error': e.faultCode, 'title': 'Change Password'} return {'error': 'Error, password not changed !', 'title': 'Change Password'} -def topological_sort(modules): - """ Return a list of module names sorted so that their dependencies of the - modules are listed before the module itself - - modules is a dict of {module_name: dependencies} - - :param modules: modules to sort - :type modules: dict - :returns: list(str) - """ - - dependencies = set(itertools.chain.from_iterable(modules.itervalues())) - # incoming edge: dependency on other module (if a depends on b, a has an - # incoming edge from b, aka there's an edge from b to a) - # outgoing edge: other module depending on this one - - # [Tarjan 1976], http://en.wikipedia.org/wiki/Topological_sorting#Algorithms - #L ← Empty list that will contain the sorted nodes - L = [] - #S ← Set of all nodes with no outgoing edges (modules on which no other - # module depends) - S = set(module for module in modules if module not in dependencies) - - visited = set() - #function visit(node n) - def visit(n): - #if n has not been visited yet then - if n not in visited: - #mark n as visited - visited.add(n) - #change: n not web module, can not be resolved, ignore - if n not in modules: return - #for each node m with an edge from m to n do (dependencies of n) - for m in modules[n]: - #visit(m) - visit(m) - #add n to L - L.append(n) - #for each node n in S do - for n in S: - #visit(n) - visit(n) - return L - class Session(openerpweb.Controller): _cp_path = "/web/session" @@ -593,34 +769,9 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def modules(self, req): - # Compute available candidates module - loadable = openerpweb.addons_manifest - loaded = set(req.config.server_wide_modules) - candidates = [mod for mod in loadable if mod not in loaded] - - # already installed modules have no dependencies - modules = dict.fromkeys(loaded, []) - - # Compute auto_install modules that might be on the web side only - modules.update((name, openerpweb.addons_manifest[name].get('depends', [])) - for name in candidates - if openerpweb.addons_manifest[name].get('auto_install')) - - # Retrieve database installed modules - Modules = req.session.model('ir.module.module') - for module in Modules.search_read( - [('state','=','installed'), ('name','in', candidates)], - ['name', 'dependencies_id']): - deps = module.get('dependencies_id') - if deps: - dependencies = map( - operator.itemgetter('name'), - req.session.model('ir.module.module.dependency').read(deps, ['name'])) - modules[module['name']] = list( - set(modules.get(module['name'], []) + dependencies)) - - sorted_modules = topological_sort(modules) - return [module for module in sorted_modules if module not in loaded] + loaded = module_boot(req) + modules = module_installed(req) + return [module for module in modules if module not in loaded] @openerpweb.jsonrequest def eval_domain_and_context(self, req, contexts, domains, @@ -724,120 +875,6 @@ class Session(openerpweb.Controller): def destroy(self, req): req.session._suicide = True -def eval_context_and_domain(session, context, domain=None): - e_context = session.eval_context(context) - # should we give the evaluated context as an evaluation context to the domain? - e_domain = session.eval_domain(domain or []) - - return e_context, e_domain - -def load_actions_from_ir_values(req, key, key2, models, meta): - context = req.session.eval_context(req.context) - Values = req.session.model('ir.values') - actions = Values.get(key, key2, models, meta, context) - - return [(id, name, clean_action(req, action)) - for id, name, action in actions] - -def clean_action(req, action, do_not_eval=False): - action.setdefault('flags', {}) - - context = req.session.eval_context(req.context) - eval_ctx = req.session.evaluation_context(context) - - if not do_not_eval: - # values come from the server, we can just eval them - if action.get('context') and isinstance(action.get('context'), basestring): - action['context'] = eval( action['context'], eval_ctx ) or {} - - if action.get('domain') and isinstance(action.get('domain'), basestring): - action['domain'] = eval( action['domain'], eval_ctx ) or [] - else: - if 'context' in action: - action['context'] = parse_context(action['context'], req.session) - if 'domain' in action: - action['domain'] = parse_domain(action['domain'], req.session) - - action_type = action.setdefault('type', 'ir.actions.act_window_close') - if action_type == 'ir.actions.act_window': - return fix_view_modes(action) - return action - -# I think generate_views,fix_view_modes should go into js ActionManager -def generate_views(action): - """ - While the server generates a sequence called "views" computing dependencies - between a bunch of stuff for views coming directly from the database - (the ``ir.actions.act_window model``), it's also possible for e.g. buttons - to return custom view dictionaries generated on the fly. - - In that case, there is no ``views`` key available on the action. - - Since the web client relies on ``action['views']``, generate it here from - ``view_mode`` and ``view_id``. - - Currently handles two different cases: - - * no view_id, multiple view_mode - * single view_id, single view_mode - - :param dict action: action descriptor dictionary to generate a views key for - """ - view_id = action.get('view_id') or False - if isinstance(view_id, (list, tuple)): - view_id = view_id[0] - - # providing at least one view mode is a requirement, not an option - view_modes = action['view_mode'].split(',') - - if len(view_modes) > 1: - if view_id: - raise ValueError('Non-db action dictionaries should provide ' - 'either multiple view modes or a single view ' - 'mode and an optional view id.\n\n Got view ' - 'modes %r and view id %r for action %r' % ( - view_modes, view_id, action)) - action['views'] = [(False, mode) for mode in view_modes] - return - action['views'] = [(view_id, view_modes[0])] - -def fix_view_modes(action): - """ For historical reasons, OpenERP has weird dealings in relation to - view_mode and the view_type attribute (on window actions): - - * one of the view modes is ``tree``, which stands for both list views - and tree views - * the choice is made by checking ``view_type``, which is either - ``form`` for a list view or ``tree`` for an actual tree view - - This methods simply folds the view_type into view_mode by adding a - new view mode ``list`` which is the result of the ``tree`` view_mode - in conjunction with the ``form`` view_type. - - TODO: this should go into the doc, some kind of "peculiarities" section - - :param dict action: an action descriptor - :returns: nothing, the action is modified in place - """ - if not action.get('views'): - generate_views(action) - - id_form = None - for index, (id, mode) in enumerate(action['views']): - if mode == 'form': - id_form = id - break - - if action.pop('view_type', 'form') != 'form': - return action - - action['views'] = [ - [id, mode if mode != 'tree' else 'list'] - for id, mode in action['views'] - ] - - return action - class Menu(openerpweb.Controller): _cp_path = "/web/menu" @@ -1202,39 +1239,6 @@ class View(openerpweb.Controller): def load(self, req, model, view_id, view_type, toolbar=False): return self.fields_view_get(req, model, view_id, view_type, toolbar=toolbar) -def parse_domain(domain, session): - """ Parses an arbitrary string containing a domain, transforms it - to either a literal domain or a :class:`common.nonliterals.Domain` - - :param domain: the domain to parse, if the domain is not a string it - is assumed to be a literal domain and is returned as-is - :param session: Current OpenERP session - :type session: openerpweb.openerpweb.OpenERPSession - """ - if not isinstance(domain, basestring): - return domain - try: - return ast.literal_eval(domain) - except ValueError: - # not a literal - return common.nonliterals.Domain(session, domain) - -def parse_context(context, session): - """ Parses an arbitrary string containing a context, transforms it - to either a literal context or a :class:`common.nonliterals.Context` - - :param context: the context to parse, if the context is not a string it - is assumed to be a literal domain and is returned as-is - :param session: Current OpenERP session - :type session: openerpweb.openerpweb.OpenERPSession - """ - if not isinstance(context, basestring): - return context - try: - return ast.literal_eval(context) - except ValueError: - return common.nonliterals.Context(session, context) - class ListView(View): _cp_path = "/web/listview" @@ -1308,7 +1312,6 @@ class SearchView(View): del filter['context'] del filter['domain'] return filters - class Binary(openerpweb.Controller): _cp_path = "/web/binary" @@ -1955,3 +1958,5 @@ class Import(View): message, record) return '' % ( jsonp, simplejson.dumps({'error': {'message':msg}})) + +# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: From 1d0c2968ce0b5589e1774d65183bcad0e9847266 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 12 Aug 2012 23:55:17 +0200 Subject: [PATCH 314/571] [FIX] standalone client bzr revid: al@openerp.com-20120812215517-qxqnd1fvc9hcxezh --- addons/web_mobile/controllers.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/addons/web_mobile/controllers.py b/addons/web_mobile/controllers.py index 2b12a178c15..225f78ee111 100644 --- a/addons/web_mobile/controllers.py +++ b/addons/web_mobile/controllers.py @@ -1,11 +1,19 @@ #!/usr/bin/env python -from openerp.addons.web.common import http as oeweb import werkzeug -class Mobile(oeweb.Controller): +try: + # embedded + import openerp.addons.web.common.http as openerpweb + from openerp.addons.web.controllers.main import View +except ImportError: + # standalone + import web.common.http as openerpweb + from web.controllers.main import View + +class Mobile(openerpweb.Controller): _cp_path = '/mobile' - @oeweb.httprequest + @openerpweb.httprequest def index(self, req): return werkzeug.utils.redirect('/web_mobile/static/src/web_mobile.html', 301) From 2a7d95ac75ccb5b8161118d4ec48b3e3102001b0 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 13 Aug 2012 00:29:01 +0200 Subject: [PATCH 315/571] [IMP] load all modules at boot in single db mode bzr revid: al@openerp.com-20120812222901-tjz9443oylidd7sy --- addons/web/controllers/main.py | 39 ++++++++++++++++++++++++++++++-- addons/web/static/src/js/boot.js | 5 +++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index a90d231e471..84317d8a4f7 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -142,7 +142,9 @@ def module_installed(req): # Candidates module the current heuristic is the /static dir loadable = openerpweb.addons_manifest.keys() modules = {} + # Retrieve database installed modules + # TODO The following code should move to ir.module.module.list_installed_modules() Modules = req.session.model('ir.module.module') domain = [('state','=','installed'), ('name','in', loadable)] for module in Modules.search_read(domain, ['name', 'dependencies_id']): @@ -156,11 +158,44 @@ def module_installed(req): sorted_modules = module_topological_sort(modules) return sorted_modules +def module_installed_bypass_session(dbname): + loadable = openerpweb.addons_manifest.keys() + modules = {} + try: + import openerp.modules.registry + registry = openerp.modules.registry.RegistryManager.get(dbname) + cr = registry.db.cursor() + try: + m = registry.get('ir.module.module') + # TODO The following code should move to ir.module.module.list_installed_modules() + domain = [('state','=','installed'), ('name','in', loadable)] + ids = m.search(cr, 1, [('state','=','installed'), ('name','in', loadable)]) + for module in m.read(cr, 1, ids, ['name', 'dependencies_id']): + modules[module['name']] = [] + deps = module.get('dependencies_id') + if deps: + deps_read = registry.get('ir.module.module.dependency').read(cr, 1, deps, ['name']) + dependencies = [i['name'] for i in deps_read] + modules[module['name']] = dependencies + finally: + cr.close() + except Exception,e: + pass + sorted_modules = module_topological_sort(modules) + return sorted_modules + def module_boot(req): - addons = [] + dbs = db_list(req) + serverside = [] + dbside = [] for i in req.config.server_wide_modules: if i in openerpweb.addons_manifest: - addons.append(i) + serverside.append(i) + if len(dbs) == 1: + # if only one db load every module at boot + dbside = module_installed_bypass_session(dbs[0]) + dbside = [i for i in dbside if i not in serverside] + addons = serverside + dbside return addons def concat_xml(file_list): diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js index 844dd88a0ac..05ce709e80a 100644 --- a/addons/web/static/src/js/boot.js +++ b/addons/web/static/src/js/boot.js @@ -37,7 +37,10 @@ }; openerp.instances[new_instance._session_id] = new_instance; for(var i=0; i < modules.length; i++) { - openerp[modules[i]](new_instance,new_instance[modules[i]]); + new_instance[modules[i]] = {}; + if (openerp[modules[i]]) { + openerp[modules[i]](new_instance,new_instance[modules[i]]); + } } return new_instance; } From 7ff74cc4b118e317a8fc25a5a507b807deeafd26 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 13 Aug 2012 01:26:12 +0200 Subject: [PATCH 316/571] oauth wip bzr revid: al@openerp.com-20120812232612-9cib8w333no9hg3d --- addons/auth_oauth/__init__.py | 22 +-------- addons/auth_oauth/controllers/__init__.py | 3 ++ addons/auth_oauth/controllers/main.py | 39 ++++++++++++++++ addons/auth_oauth/res_users.py | 40 ++++++++++++++++ addons/auth_oauth/static/src/js/auth_oauth.js | 46 ++++++------------- 5 files changed, 97 insertions(+), 53 deletions(-) create mode 100644 addons/auth_oauth/controllers/__init__.py create mode 100644 addons/auth_oauth/controllers/main.py create mode 100644 addons/auth_oauth/res_users.py diff --git a/addons/auth_oauth/__init__.py b/addons/auth_oauth/__init__.py index a55097cb836..68bb6c79406 100644 --- a/addons/auth_oauth/__init__.py +++ b/addons/auth_oauth/__init__.py @@ -1,20 +1,2 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2010-2011 OpenERP s.a. (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## \ No newline at end of file +import controllers +import res_users diff --git a/addons/auth_oauth/controllers/__init__.py b/addons/auth_oauth/controllers/__init__.py new file mode 100644 index 00000000000..e11f9ba81bb --- /dev/null +++ b/addons/auth_oauth/controllers/__init__.py @@ -0,0 +1,3 @@ +import main + +# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py new file mode 100644 index 00000000000..ea50c6a23e6 --- /dev/null +++ b/addons/auth_oauth/controllers/main.py @@ -0,0 +1,39 @@ +import logging + +import werkzeug.urls + +import openerp.modules.registry +import openerp.addons.web.controllers.main +import openerp.addons.web.common.http as openerpweb + +_logger = logging.getLogger(__name__) + +class OAuthController(openerpweb.Controller): + _cp_path = '/auth_oauth' + + @openerpweb.httprequest + def signin(self, req, **kw): + dbname = kw.get("state") + registry = openerp.modules.registry.RegistryManager.get(dbname) + cr = registry.db.cursor() + try: + try: + u = registry.get('res.users') + r = u.auth_oauth(cr, 1, kw) + cr.commit() + return openerp.addons.web.controllers.main.login_and_redirect(req, *r) + # or + req.authenticate(*r) + url = "/" + except AttributeError: + # auth_signup is not installed + url = "/#action=auth_signup&error=1" + except Exception,e: + # signup error + url = "/#action=auth_signup&error=2" + finally: + cr.close() + return "" + return werkzeug.utils.redirect(url) + +# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth/res_users.py b/addons/auth_oauth/res_users.py new file mode 100644 index 00000000000..68e9a31e3eb --- /dev/null +++ b/addons/auth_oauth/res_users.py @@ -0,0 +1,40 @@ +import urllib2 + +import openerp + +from openerp.osv import osv, fields + +class res_users(osv.Model): + _inherit = 'res.users' + + def auth_oauth(self, cr, uid, params, context=None): + print params + url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' + params.get('access_token') + f = urllib2.urlopen(url) + validation = f.read() + print validation + r = (cr.dbname, login, password) + try: + # check for existing user + if not self.auth_signup_check(cr, uid, login, password): + print "NEW USER" + # new user + new_user = { + 'name': name, + 'login': login, + 'user_email': login, + 'password': password, + 'active': True, + } + self.auth_signup_create(cr,uid, new_user) + return r + else: + print "Existing same" + # already existing with same password + return r + except openerp.exceptions.AccessDenied: + print "Existing different" + # already existing with diffrent password + raise + +# diff --git a/addons/auth_oauth/static/src/js/auth_oauth.js b/addons/auth_oauth/static/src/js/auth_oauth.js index a49d6777e7d..057865cab4e 100644 --- a/addons/auth_oauth/static/src/js/auth_oauth.js +++ b/addons/auth_oauth/static/src/js/auth_oauth.js @@ -1,5 +1,4 @@ openerp.auth_oauth = function(instance) { - var QWeb = instance.web.qweb; instance.web.Login = instance.web.Login.extend({ @@ -8,56 +7,37 @@ openerp.auth_oauth = function(instance) { var self = this; self.$element.on('click', '.oe_login_oauth a', this.on_google_oauth); }, - on_google_oauth: function(ev) { - var url = this._oauth_url(); - window.location = url; - }, - _oauth_url: function() { + oauth_url: function(state) { var endpoint = 'https://accounts.google.com/o/oauth2/auth'; - var params = { + var params = { response_type: 'token', client_id: '108010644258-duuhmp6pu7li4tsmnqg7j9rvdeklg0ki.apps.googleusercontent.com', redirect_uri: 'https://localhost/', scope: 'https://www.googleapis.com/auth/userinfo.email', - state: 'TEST', + state: state, }; var url = endpoint + '?' + $.param(params); return url; }, - // do_warn: function(title, msg) { - // }, - // reset_error_message: function() { - // } + on_google_oauth: function(ev) { + var dbname = self.$("form [name=db]").val(); + var url = this.oauth_url(dbname); + window.location = url; + }, }); instance.web.WebClient = instance.web.WebClient.extend({ start: function() { this._super.apply(this, arguments); - // console.log($.deparam(window.location.hash)); var params = $.deparam(window.location.hash); if (params.hasOwnProperty('access_token')) { - console.log(params); - // Do login using Google User credentials - var url = { - - }; + // fix params for python marshmalling + params.state = params["#state"] + delete params["#state"] + var url = "/auth_oauth/signin" + '?' + $.param(params); + window.location = url; } }, - bind_hashchange: function() { - var state = $.bbq.getState(true); - if (state.hasOwnProperty("access_token")) { - state.action = "login"; - $.bbq.setState(state); - } - this._super(); - - }, - // on_hashchange: function(event) { - // console.log(event); - // this._super.apply(this, arguments); - // }, }); }; - -// https://accounts.google.com/o/oauth2/auth?state=%2Fprofile&redirect_uri=http%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode&response_type=code&client_id=812741506391.apps.googleusercontent.com&approval_prompt=force&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile \ No newline at end of file From d946d35ee0590829b16b4403145a2b25b52be251 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 13 Aug 2012 02:01:49 +0200 Subject: [PATCH 317/571] oauth wip bzr revid: al@openerp.com-20120813000149-lslqyhszzz8axhrv --- addons/auth_signup/res_users.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py index 1b73dc2f622..1c9e531c180 100644 --- a/addons/auth_signup/res_users.py +++ b/addons/auth_signup/res_users.py @@ -5,9 +5,14 @@ class res_users(osv.Model): _inherit = 'res.users' def auth_signup_create(self, cr, uid, new_user, context=None): - # add login, email, name passowrd - # if options groups - # add groups + # new_user: + # login + # email + # name (optional) + # partner_id (optional) + # groups (optional) + # sign (for partner_id and groups) + # user_template_id = self.pool.get('ir.config_parameter').get_param(cr, uid, 'auth.signup_template_user_id', 0) if user_template_id: self.pool.get('res.users').copy(cr, 1, user_template_id, new_user, context=context) From 2d105770009ffd5cbd5a69346cbb4ac529d6d7e7 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Mon, 13 Aug 2012 05:25:37 +0000 Subject: [PATCH 318/571] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120813052537-ans6r1oi6i0xrzyy --- addons/pad_project/i18n/pt_BR.po | 38 +++++++ addons/project_issue_sheet/i18n/pt_BR.po | 16 +-- addons/project_mrp/i18n/nb.po | 127 +++++++++++++++++++++++ 3 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 addons/pad_project/i18n/pt_BR.po create mode 100644 addons/project_mrp/i18n/nb.po diff --git a/addons/pad_project/i18n/pt_BR.po b/addons/pad_project/i18n/pt_BR.po new file mode 100644 index 00000000000..9d803b9c8d6 --- /dev/null +++ b/addons/pad_project/i18n/pt_BR.po @@ -0,0 +1,38 @@ +# Brazilian Portuguese translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-08-13 03:40+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-08-13 05:25+0000\n" +"X-Generator: Launchpad (build 15791)\n" + +#. module: pad_project +#: constraint:project.task:0 +msgid "Error ! Task end-date must be greater then task start-date" +msgstr "Erro ! A data final deve ser maior do que a data inicial" + +#. module: pad_project +#: model:ir.model,name:pad_project.model_project_task +msgid "Task" +msgstr "Tarefa" + +#. module: pad_project +#: view:project.task:0 +msgid "Pad" +msgstr "Pad" + +#. module: pad_project +#: constraint:project.task:0 +msgid "Error ! You cannot create recursive tasks." +msgstr "Erro! Você não pode criar tarefas recursivas." diff --git a/addons/project_issue_sheet/i18n/pt_BR.po b/addons/project_issue_sheet/i18n/pt_BR.po index 3126bea6e51..d3a44c56b48 100644 --- a/addons/project_issue_sheet/i18n/pt_BR.po +++ b/addons/project_issue_sheet/i18n/pt_BR.po @@ -8,14 +8,15 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-01-29 13:06+0000\n" -"Last-Translator: Adriano Prado \n" +"PO-Revision-Date: 2012-08-13 03:17+0000\n" +"Last-Translator: Fábio Martinelli - http://zupy.com.br " +"\n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-09 04:57+0000\n" -"X-Generator: Launchpad (build 15761)\n" +"X-Launchpad-Export-Date: 2012-08-13 05:25+0000\n" +"X-Generator: Launchpad (build 15791)\n" #. module: project_issue_sheet #: model:ir.model,name:project_issue_sheet.model_account_analytic_line @@ -26,12 +27,12 @@ msgstr "Linha Analítica" #: code:addons/project_issue_sheet/project_issue_sheet.py:57 #, python-format msgid "The Analytic Account is in pending !" -msgstr "" +msgstr "A Conta Analítica está pendente!" #. module: project_issue_sheet #: model:ir.model,name:project_issue_sheet.model_project_issue msgid "Project Issue" -msgstr "Problema do Projeto" +msgstr "Questões do Projeto" #. module: project_issue_sheet #: model:ir.model,name:project_issue_sheet.model_hr_analytic_timesheet @@ -65,6 +66,7 @@ msgstr "Planilhas de Horas" #: constraint:hr.analytic.timesheet:0 msgid "You cannot modify an entry in a Confirmed/Done timesheet !." msgstr "" +"Você não pode modificar uma entrada que está como Confirmada/Concluída" #. module: project_issue_sheet #: field:hr.analytic.timesheet,issue_id:0 @@ -74,7 +76,7 @@ msgstr "Problema" #. module: project_issue_sheet #: constraint:account.analytic.line:0 msgid "You can not create analytic line on view account." -msgstr "" +msgstr "Você não pode criar uma linha analítica em conta de visualização" #~ msgid "Add the Timesheet support for Issue Management in Project Management" #~ msgstr "" diff --git a/addons/project_mrp/i18n/nb.po b/addons/project_mrp/i18n/nb.po new file mode 100644 index 00000000000..294f813998b --- /dev/null +++ b/addons/project_mrp/i18n/nb.po @@ -0,0 +1,127 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-08-12 17:15+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-08-13 05:25+0000\n" +"X-Generator: Launchpad (build 15791)\n" + +#. module: project_mrp +#: sql_constraint:sale.order:0 +msgid "Order Reference must be unique per Company!" +msgstr "Ordrereferanse må være unik pr. firma!" + +#. module: project_mrp +#: model:process.node,note:project_mrp.process_node_procuretasktask0 +msgid "For each product, on type service and on order" +msgstr "For hvert produkt, type service og ordre" + +#. module: project_mrp +#: model:process.transition,name:project_mrp.process_transition_procuretask0 +msgid "Procurement Task" +msgstr "Innkjøps oppgave" + +#. module: project_mrp +#: model:ir.model,name:project_mrp.model_sale_order +msgid "Sales Order" +msgstr "Salgsordre" + +#. module: project_mrp +#: field:procurement.order,sale_line_id:0 +msgid "Sale order line" +msgstr "Salgs ordre linje" + +#. module: project_mrp +#: model:process.transition,note:project_mrp.process_transition_createtask0 +msgid "Product type is service, then its creates the task." +msgstr "" + +#. module: project_mrp +#: model:process.transition,note:project_mrp.process_transition_procuretask0 +msgid "if product type is 'service' then it creates the task." +msgstr "" + +#. module: project_mrp +#: constraint:project.task:0 +msgid "Error ! Task end-date must be greater then task start-date" +msgstr "" + +#. module: project_mrp +#: model:process.node,name:project_mrp.process_node_saleordertask0 +msgid "Sale Order Task" +msgstr "Salgs ordre oppgave" + +#. module: project_mrp +#: model:ir.model,name:project_mrp.model_product_product +msgid "Product" +msgstr "Produkt" + +#. module: project_mrp +#: constraint:product.product:0 +msgid "Error: Invalid ean code" +msgstr "Feil: Ugyldig ean kode" + +#. module: project_mrp +#: field:product.product,project_id:0 +msgid "Project" +msgstr "Prosjekt" + +#. module: project_mrp +#: model:ir.model,name:project_mrp.model_procurement_order +#: field:project.task,procurement_id:0 +msgid "Procurement" +msgstr "Innkjøp" + +#. module: project_mrp +#: model:ir.model,name:project_mrp.model_project_task +#: model:process.node,name:project_mrp.process_node_mrptask0 +#: model:process.node,name:project_mrp.process_node_procuretasktask0 +#: field:procurement.order,task_id:0 +msgid "Task" +msgstr "Oppgave" + +#. module: project_mrp +#: model:process.node,note:project_mrp.process_node_mrptask0 +msgid "A task is created to provide the service." +msgstr "" + +#. module: project_mrp +#: model:process.transition,name:project_mrp.process_transition_ordertask0 +msgid "Order Task" +msgstr "Ordre oppgave" + +#. module: project_mrp +#: constraint:project.task:0 +msgid "Error ! You cannot create recursive tasks." +msgstr "" + +#. module: project_mrp +#: model:process.transition,name:project_mrp.process_transition_createtask0 +msgid "Create Task" +msgstr "Lag oppgave" + +#. module: project_mrp +#: model:process.transition,note:project_mrp.process_transition_ordertask0 +msgid "If procurement method is Make to order and supply method is produce" +msgstr "" + +#. module: project_mrp +#: model:process.node,note:project_mrp.process_node_saleordertask0 +msgid "In case you sell services on sale order" +msgstr "" + +#. module: project_mrp +#: field:project.task,sale_line_id:0 +msgid "Sale Order Line" +msgstr "" From 98e591c2a741279a14121680281d2a564610e18d Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 12:47:20 +0530 Subject: [PATCH 319/571] [IMP]: point_of_sale: Improved remaining product name translation bzr revid: rpa@tinyerp.com-20120813071720-kcsjouksbz4v0act --- addons/point_of_sale/point_of_sale_demo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/point_of_sale/point_of_sale_demo.xml b/addons/point_of_sale/point_of_sale_demo.xml index c134bb140cb..6836d0e7c4d 100644 --- a/addons/point_of_sale/point_of_sale_demo.xml +++ b/addons/point_of_sale/point_of_sale_demo.xml @@ -237,7 +237,7 @@ 5.70 - Nectarine + Peach True From 5fd7ad04c16ef6eda76b35d66206bfc838d76d43 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 12:57:38 +0530 Subject: [PATCH 320/571] [REM]: hr: Removed duplicate employee and department from demo bzr revid: rpa@tinyerp.com-20120813072738-temucs10vhcubepv --- addons/hr/hr_demo.xml | 6 +----- addons/project_timesheet/project_timesheet_demo.xml | 5 +---- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/addons/hr/hr_demo.xml b/addons/hr/hr_demo.xml index 811416b8bbe..20d3e093505 100644 --- a/addons/hr/hr_demo.xml +++ b/addons/hr/hr_demo.xml @@ -139,11 +139,6 @@ - - Human Ressources Manager - - - Consultant @@ -156,6 +151,7 @@ Human Resources Manager + diff --git a/addons/project_timesheet/project_timesheet_demo.xml b/addons/project_timesheet/project_timesheet_demo.xml index 66caf4bc70b..6d3dfb23767 100644 --- a/addons/project_timesheet/project_timesheet_demo.xml +++ b/addons/project_timesheet/project_timesheet_demo.xml @@ -48,11 +48,8 @@ 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 - - Fabian + - - From db7e49ca91d483213c8ba61d4314411c899e0f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 10:10:54 +0200 Subject: [PATCH 321/571] [FIX] project_timesheet tests: user creation should also have its partner. bzr revid: tde@openerp.com-20120813081054-csyaq8p7lf7e1nvh --- addons/mail/res_users.py | 1 - .../test/worktask_entry_to_timesheetline_entry.yml | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py index 3d8ed92609b..6a18560de31 100644 --- a/addons/mail/res_users.py +++ b/addons/mail/res_users.py @@ -85,7 +85,6 @@ class res_users(osv.osv): cr.execute('ALTER TABLE res_users ALTER COLUMN alias_id SET NOT NULL') except Exception: pass - def create(self, cr, uid, data, context=None): # create default alias same as the login diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml index 214aa04d25b..8b58791f699 100644 --- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml +++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml @@ -1,11 +1,13 @@ - Create a user 'HR Manager' - + !record {model: res.partner, id: res_partner_hrmanager0}: + name: HR Manager + lang: en_US !record {model: res.users, id: res_users_hrmanager0}: company_id: base.main_company - lang: en_US + partner_id: res_partner_hrmanager0 login: hr - name: HR Manager password: hr groups_id: - base.group_hr_manager From fd471af0d8c76b9695beca87f8ccdecd64491ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 11:06:41 +0200 Subject: [PATCH 322/571] [IMP] mail_thread: replaced hasattr by check in columns. bzr revid: tde@openerp.com-20120813090641-n8o08be2ecfxxtdz --- addons/mail/mail_thread.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index f0dd023bf06..a79b5a6475a 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -189,7 +189,7 @@ class mail_thread(osv.Model): notif_user_ids += self.message_parse_users(cr, uid, body, context=context) # add users requested to perform an action (need_action mechanism) - if hasattr(self, 'get_needaction_user_ids'): + if self._columns.get('user_id'): user_ids_dict = self.get_needaction_user_ids(cr, uid, thread_ids, context=context) for id, user_ids in user_ids_dict.iteritems(): notif_user_ids += user_ids @@ -805,7 +805,7 @@ class mail_thread(osv.Model): forward_to = [i for i in message_followers_emails if (i and (i not in message_recipients))] if forward_to: # TODO: we need an interface for this for all types of objects, not just leads - if hasattr(res, 'section_id'): + if model_pool._columns.get('section_id'): del msg['reply-to'] msg['reply-to'] = res.section_id.reply_to @@ -1047,14 +1047,14 @@ class mail_thread(osv.Model): """ When creating a new message, set as unread if uid is not the object responsible. """ for obj in self.browse(cr, uid, ids, context=context): - if obj.message_state and hasattr(obj, 'user_id') and (not obj.user_id or obj.user_id.id != uid): + if obj.message_state and self._columns.get('user_id') and (not obj.user_id or obj.user_id.id != uid): self.message_mark_as_unread(cr, uid, [obj.id], context=context) def message_check_and_set_unread(self, cr, uid, ids, context=None): """ Set unread if uid is the object responsible or if the object has no responsible. """ for obj in self.browse(cr, uid, ids, context=context): - if obj.message_state and hasattr(obj, 'user_id') and (not obj.user_id or obj.user_id.id == uid): + if obj.message_state and self._columns.get('user_id') and (not obj.user_id or obj.user_id.id == uid): self.message_mark_as_unread(cr, uid, [obj.id], context=context) def message_mark_as_unread(self, cr, uid, ids, context=None): @@ -1064,7 +1064,7 @@ class mail_thread(osv.Model): def message_check_and_set_read(self, cr, uid, ids, context=None): """ Set read if uid is the object responsible. """ for obj in self.browse(cr, uid, ids, context=context): - if not obj.message_state and hasattr(obj, 'user_id') and obj.user_id and obj.user_id.id == uid: + if not obj.message_state and self._columns.get('user_id') and obj.user_id and obj.user_id.id == uid: self.message_mark_as_read(cr, uid, [obj.id], context=context) def message_mark_as_read(self, cr, uid, ids, context=None): From 246b47602002424c6ec45ed854251e99846d75b9 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Mon, 13 Aug 2012 14:45:19 +0530 Subject: [PATCH 323/571] Workflow editor label. bzr revid: tta@openerp.com-20120813091519-lcxiemc2wojfx2d6 --- openerp/addons/base/ir/workflow/workflow_view.xml | 3 ++- openerp/addons/base/rng/view.rng | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openerp/addons/base/ir/workflow/workflow_view.xml b/openerp/addons/base/ir/workflow/workflow_view.xml index c20eeaed085..084d66f720f 100644 --- a/openerp/addons/base/ir/workflow/workflow_view.xml +++ b/openerp/addons/base/ir/workflow/workflow_view.xml @@ -41,7 +41,7 @@ workflow diagram - + @@ -55,6 +55,7 @@ + diff --git a/openerp/addons/base/rng/view.rng b/openerp/addons/base/rng/view.rng index 8f7b2647237..0d6527e5972 100644 --- a/openerp/addons/base/rng/view.rng +++ b/openerp/addons/base/rng/view.rng @@ -181,12 +181,12 @@ - + - - - - + + + + From 55e9fdf3606f3ce79b593ceefa5a554614ee75f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 11:16:27 +0200 Subject: [PATCH 324/571] [FIX] res.users: defer onchange_type calls from partner form view to the partner. bzr revid: tde@openerp.com-20120813091627-nfv0vkfjo87jhplp --- openerp/addons/base/res/res_users.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index ada625c6bcf..f8c745edc10 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -171,6 +171,14 @@ class users(osv.osv): } } + def onchange_type(self, cr, uid, ids, is_company, context=None): + """ Wrapper on the user.partner onchange_type, because some calls to the + partner form view applied to the user may trigger the + partner.onchange_type method, but applied to the user object. + """ + partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] + return self.pool.get('res_partner').onchange_type(cr, uid, partner_ids, is_company, context=context) + def read(self,cr, uid, ids, fields=None, context=None, load='_classic_read'): def override_password(o): if 'password' in o and ( 'id' not in o or o['id'] != uid ): From e120d9a699247c6fbdfbf21648a71e321642b2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 11:17:19 +0200 Subject: [PATCH 325/571] [REV] Reverted last fixes. Think it comes from outer space. bzr revid: tde@openerp.com-20120813091719-6551uziq8ts4kj6a --- .../test/worktask_entry_to_timesheetline_entry.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml index 8b58791f699..8bb570bd7d8 100644 --- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml +++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml @@ -1,9 +1,6 @@ - Create a user 'HR Manager' - - !record {model: res.partner, id: res_partner_hrmanager0}: - name: HR Manager - lang: en_US !record {model: res.users, id: res_users_hrmanager0}: company_id: base.main_company partner_id: res_partner_hrmanager0 From c2c6a912ccd2734928007dc69dd03252b66dd451 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 14:55:52 +0530 Subject: [PATCH 326/571] [IMP]: base: Improved country_id search by direct reference of xml_id bzr revid: rpa@tinyerp.com-20120813092552-q9mrusns0jok7ztl --- openerp/addons/base/base_data.xml | 2 +- openerp/addons/base/res/res_partner_demo.xml | 40 ++++++++++---------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index 338435d2e75..12c90437e93 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -1064,7 +1064,7 @@ 45, Rue du Palais Paris 75016 - + +33 1 49 51 23 94 info@yourcompany.com www.yourcompany.com diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index 926b29a97fe..b01b2e05f18 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -85,7 +85,7 @@ 1 Taipei 106 - + 31 Hong Kong street info@asustek.com (+886) (02) 4162 2023 @@ -98,7 +98,7 @@ 1 Wavre 1300 - + 69 rue de Chimay info@agrolait.com +32 10 588 558 @@ -113,6 +113,7 @@ Shanghai 200000 + 52 Chop Suey street info@chinaexport.com +86 21 6484 5671 @@ -128,7 +129,7 @@ 1 Fremont CA 94538 - + 3661 Station Street info@deltapc.com @@ -142,7 +143,7 @@ 1 - + 60610 Chicago @@ -160,7 +161,7 @@ 1 Chicago IL 60623 - + 23 Rockwell Lane info@elecimport.com @@ -177,7 +178,7 @@ 81 Academy Avenue Birmingham B46 3AG - + +44 121 690 4596 email@wealthyandsons.com www.wealthyandsons.com/ @@ -193,7 +194,7 @@ Munich Luckenwalder Strasse 80352 - + +49 8932 450203 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 @@ -205,7 +206,7 @@ 1 203, Systems Plaza Mumbai - + info@bestdesigners.in +91 22 3445 0349 www.bestdesigners.com @@ -218,7 +219,7 @@ 1 Miami FL 33169 - + contact@jackson.com +1 786 525 0724 @@ -234,6 +235,7 @@ 1 Constitución, 80 + Barcelona 08078 +34 934 340 230 @@ -250,7 +252,7 @@ Le Bourget du Lac 73377 +33 4 49 23 44 54 - + 93, Press Avenue info@c2c.com www.camptocamp.com @@ -264,7 +266,7 @@ 1 Champs sur Marne 77420 - + info@axelor.com +33 1 64 61 04 01 12 rue Albert Einstein @@ -281,7 +283,7 @@ 1 Detroit MI 48212 - + 60, Rosewood Court info@chamberworks.com @@ -297,7 +299,7 @@ 1 89 Lingfield Tower - + London +44 20 1294 2193 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HDEKDY7SWXhz0F+zagmEcrZHvc9xc717LKpabuu1ZYyd1kBqvfL7hfuS1wLR029CpeiUuy9hS2hswHb8mc+qy/Vrh8zGRHDkoaNHur4TI14XRy2p3jwXHpysDgQPgTsd/ot3pGhbxmFZSuFhex7tuR242J3/AIkrbouqz0Kzs6za1AQQ3b6RM/MqGtf1q9MsqGZM9YhERFcLiRY2PoU8fXZXpVoq8LGhjGRtADWjyA+H+pWSiIqcz3CjO38zxHuQ5PHth1XVhhrMdz7xOYGjd55fg7y381o9UfZ8NqtpC7grOPp5fFQ04cqHczYLngtaDKNmk8+4PmOoI32263+i53WtN3Ef6ZV1S1++pEbHRHpxhobnzwB1yufM9wX19e1Hq6OhqTDY/AarvtsXyBI+0ImPkc1gHKG9efr7w32A32333OouDWcoZ7T+b4c6ogw1nD41mMbHbrCRrog57nP32O5cXkkFvmSQQrqRY+lp/wC+Vk9oL0xkQBEbRBwG5HPAA9lQp4O6yrcJstouDK6fuWMxm33rVizA/ZkThGOZmw92QGPfy297YEbbrd6h4RZCfTPD/BY3LQSR6Xux2LE1ouDpg0gkMAB2677AnoNhuVb6LP0tP9lq7XrwkGRxLuA4kR/xU7xN4M/p1xAvZzI2ajaEuENGs3dxmhshxcyXbbbYE+W/Ub+q+8Lw41kNXaD1Bm8zi559NVJqlp8XOXWGOY9jSOZvnyuAJPfcq30Wfp2bt3+81oNauxSFKRtAIGOAILT8g56Ln/h5wa1rpTM15xPomaD709smtvoOlvRsJHMyKVzPd6DoOnVxPdSfhdwzzmF4m6g19qO/jBcyXPDHTxcbmQchLf6Rwd15jyA7depJJJKtlFhltTbEclvca7d1w/dHiEEgCYmUREXQqZERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/2Q== @@ -312,7 +314,7 @@ 01060-324 Rua Dom Carlos, 1073 +55 11 2402 2045 - + 1 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 @@ -327,7 +329,7 @@ 34 Westwood Avenue Capital Federal +54 341 324 9459 - + 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 @@ -340,7 +342,7 @@ MA 02203 info@thinkbig.com +1 857 349 3049 - + One Lincoln Street www.think-big.com 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 @@ -354,7 +356,7 @@ 1 Cupertino CA 95014 - + 10200 S. De Anza Blvd info@seagate.com @@ -382,7 +384,7 @@ default Union Road Liverpool - + L25 4RL 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 @@ -398,7 +400,7 @@ Leicester LE4 2BN +44 20 1294 2193 - + www.vicking-direct.com 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 From 659f3cc996922959ab314666909115ff829dfc04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 11:36:41 +0200 Subject: [PATCH 327/571] [FIX] Bloody res_partner should be res.partner. bzr revid: tde@openerp.com-20120813093641-ssyfm4au52nupbi1 --- openerp/addons/base/res/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index f8c745edc10..9e0abb446cf 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -177,7 +177,7 @@ class users(osv.osv): partner.onchange_type method, but applied to the user object. """ partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] - return self.pool.get('res_partner').onchange_type(cr, uid, partner_ids, is_company, context=context) + return self.pool.get('res.partner').onchange_type(cr, uid, partner_ids, is_company, context=context) def read(self,cr, uid, ids, fields=None, context=None, load='_classic_read'): def override_password(o): From 4067f46ff7fd75966cec799fb223ec944b108a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 11:36:56 +0200 Subject: [PATCH 328/571] [IMP] base.sql: no need to have a 'name' column on res.users I think. bzr revid: tde@openerp.com-20120813093656-ywab7wjdpc5gwl02 --- openerp/addons/base/base.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openerp/addons/base/base.sql b/openerp/addons/base/base.sql index c6ca6dbb76d..441fe536a0a 100644 --- a/openerp/addons/base/base.sql +++ b/openerp/addons/base/base.sql @@ -146,7 +146,6 @@ select setval('ir_ui_menu_id_seq', 2); CREATE TABLE res_users ( id serial NOT NULL, - name varchar(64) not null, active boolean default True, login varchar(64) NOT NULL UNIQUE, password varchar(64) default null, @@ -384,7 +383,7 @@ CREATE TABLE ir_model_relation ( -- Users --------------------------------- -insert into res_users (id,login,password,name,active,company_id,partner_id,lang) values (1,'admin','admin','Administrator',True,1,1,'en_US'); +insert into res_users (id,login,password,active,company_id,partner_id,lang) values (1,'admin','admin',True,1,1,'en_US'); insert into ir_model_data (name,module,model,noupdate,res_id) values ('user_root','base','res.users',True,1); -- Compatibility purpose, to remove V6.0 From 2d7f9ea474ed01309bc5878cdd8df5a260f8c34d Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 15:20:10 +0530 Subject: [PATCH 329/571] [FIX]: base: Fixed xml_id of country uk bzr revid: rpa@tinyerp.com-20120813095010-3eak04yezq4aorix --- openerp/addons/base/res/res_partner_demo.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index b01b2e05f18..220c3535d82 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -178,7 +178,7 @@ 81 Academy Avenue Birmingham B46 3AG - + +44 121 690 4596 email@wealthyandsons.com www.wealthyandsons.com/ @@ -299,7 +299,7 @@ 1 89 Lingfield Tower - + London +44 20 1294 2193 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HDEKDY7SWXhz0F+zagmEcrZHvc9xc717LKpabuu1ZYyd1kBqvfL7hfuS1wLR029CpeiUuy9hS2hswHb8mc+qy/Vrh8zGRHDkoaNHur4TI14XRy2p3jwXHpysDgQPgTsd/ot3pGhbxmFZSuFhex7tuR242J3/AIkrbouqz0Kzs6za1AQQ3b6RM/MqGtf1q9MsqGZM9YhERFcLiRY2PoU8fXZXpVoq8LGhjGRtADWjyA+H+pWSiIqcz3CjO38zxHuQ5PHth1XVhhrMdz7xOYGjd55fg7y381o9UfZ8NqtpC7grOPp5fFQ04cqHczYLngtaDKNmk8+4PmOoI32263+i53WtN3Ef6ZV1S1++pEbHRHpxhobnzwB1yufM9wX19e1Hq6OhqTDY/AarvtsXyBI+0ImPkc1gHKG9efr7w32A32333OouDWcoZ7T+b4c6ogw1nD41mMbHbrCRrog57nP32O5cXkkFvmSQQrqRY+lp/wC+Vk9oL0xkQBEbRBwG5HPAA9lQp4O6yrcJstouDK6fuWMxm33rVizA/ZkThGOZmw92QGPfy297YEbbrd6h4RZCfTPD/BY3LQSR6Xux2LE1ouDpg0gkMAB2677AnoNhuVb6LP0tP9lq7XrwkGRxLuA4kR/xU7xN4M/p1xAvZzI2ajaEuENGs3dxmhshxcyXbbbYE+W/Ub+q+8Lw41kNXaD1Bm8zi559NVJqlp8XOXWGOY9jSOZvnyuAJPfcq30Wfp2bt3+81oNauxSFKRtAIGOAILT8g56Ln/h5wa1rpTM15xPomaD709smtvoOlvRsJHMyKVzPd6DoOnVxPdSfhdwzzmF4m6g19qO/jBcyXPDHTxcbmQchLf6Rwd15jyA7depJJJKtlFhltTbEclvca7d1w/dHiEEgCYmUREXQqZERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/2Q== @@ -384,7 +384,7 @@ default Union Road Liverpool - + L25 4RL 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 @@ -400,7 +400,7 @@ Leicester LE4 2BN +44 20 1294 2193 - + www.vicking-direct.com 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 From 0e554c738d870a88ed4e426ef1ea105bfc96db77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 12:06:22 +0200 Subject: [PATCH 330/571] [FIX] Fixed last revision, about name removel in base.sql and so on. bzr revid: tde@openerp.com-20120813100622-jhqv244dskhlh2er --- openerp/addons/base/res/res_users.py | 2 +- openerp/service/web_services.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 9e0abb446cf..115b78d93e6 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -110,7 +110,7 @@ class users(osv.osv): } _name = "res.users" _description = 'Users' - _order = 'name' + _order = 'login' def _set_new_password(self, cr, uid, id, name, value, args, context=None): if value is False: diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index ccb753acdc8..7c08003bf7a 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -77,7 +77,7 @@ def _initialize_db(serv, id, db_name, demo, lang, user_password): cr.execute('UPDATE res_users SET password=%s, lang=%s, active=True WHERE login=%s', ( user_password, lang, 'admin')) - cr.execute('SELECT login, password, name ' \ + cr.execute('SELECT login, password ' \ ' FROM res_users ' \ ' ORDER BY login') serv.actions[id].update(users=cr.dictfetchall(), clean=True) From 401bbbc940100bc655a0d85f93ae49e850b6e25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 12:18:47 +0200 Subject: [PATCH 331/571] [IMP] res.users: added a wrapper on onchange_address, for partner form view delegated to res.users. bzr revid: tde@openerp.com-20120813101847-rmctiebnhm2pmfcz --- openerp/addons/base/res/res_users.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 115b78d93e6..f4335357a4b 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -179,6 +179,14 @@ class users(osv.osv): partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] return self.pool.get('res.partner').onchange_type(cr, uid, partner_ids, is_company, context=context) + def onchange_address(self, cr, uid, ids, use_parent_address, parent_id, context=None): + """ Wrapper on the user.partner onchange_address, because some calls to the + partner form view applied to the user may trigger the + partner.onchange_type method, but applied to the user object. + """ + partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] + return self.pool.get('res.partner').onchange_address(cr, uid, partner_ids, is_company, context=context) + def read(self,cr, uid, ids, fields=None, context=None, load='_classic_read'): def override_password(o): if 'password' in o and ( 'id' not in o or o['id'] != uid ): From b479fbf64acbf507565b51e91ae828efb4e2ae28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 12:30:38 +0200 Subject: [PATCH 332/571] [IMP] mail_thread: continuing to translate hasattr to something else. bzr revid: tde@openerp.com-20120813103038-4o1xwtsmjnvjj0b4 --- addons/mail/mail_thread.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index a79b5a6475a..ea426327e10 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -330,7 +330,7 @@ class mail_thread(osv.Model): data = { 'subject': subject, - 'body_text': body_text or (hasattr(thread, 'description') and thread.description or ''), + 'body_text': body_text or thread._model._columns.get('description') and thread.description or ''), 'body_html': body_html or '', 'parent_id': parent_id, 'date': email_date or fields.datetime.now(), @@ -353,7 +353,7 @@ class mail_thread(osv.Model): data.update({ 'email_to': email_to, 'email_from': email_from or \ - (hasattr(thread, 'user_id') and thread.user_id and thread.user_id.user_email), + thread._model._columns.get('user_id') and thread.user_id and thread.user_id.user_email), 'email_cc': email_cc, 'email_bcc': email_bcc, 'references': references, From b50dfe4f8f6aee5733e1088182ea28601667fab7 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 13 Aug 2012 12:32:56 +0200 Subject: [PATCH 333/571] [IMP] Adapt openerp.web.Dialog's position and maxHeight to the new jquery bootstrap theme. bzr revid: fme@openerp.com-20120813103256-zhw7od30g9j406uv --- addons/web/static/src/js/chrome.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 4b2e0751e8d..43747d8e3cf 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -66,9 +66,9 @@ instance.web.Dialog = instance.web.Widget.extend({ max_width: '95%', height: 'auto', min_height: 0, - max_height: this.get_height('100%') - 140, + max_height: this.get_height('100%') - 200, autoOpen: false, - position: [false, 50], + position: [false, 40], buttons: {}, beforeClose: function () { self.on_close(); }, resizeStop: this.on_resized From f4402a11445f05b33449554f3697840703cc1770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 12:41:35 +0200 Subject: [PATCH 334/571] [FIX] Wrapper on onchange_address. bzr revid: tde@openerp.com-20120813104135-6ft7wh4ssdl7ouid --- openerp/addons/base/res/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index f4335357a4b..573d0468f18 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -185,7 +185,7 @@ class users(osv.osv): partner.onchange_type method, but applied to the user object. """ partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] - return self.pool.get('res.partner').onchange_address(cr, uid, partner_ids, is_company, context=context) + return self.pool.get('res.partner').onchange_address(cr, uid, partner_ids, use_parent_address, parent_id, context=context) def read(self,cr, uid, ids, fields=None, context=None, load='_classic_read'): def override_password(o): From f80c2478120e4fcf4e80f5c2932328dce88218b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 12:54:20 +0200 Subject: [PATCH 335/571] [FIX] Still fixing stpid bugs. bzr revid: tde@openerp.com-20120813105420-stxm7cjc981bj8fq --- .../test/worktask_entry_to_timesheetline_entry.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml index 8bb570bd7d8..fad8e2af2c5 100644 --- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml +++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml @@ -3,7 +3,6 @@ - !record {model: res.users, id: res_users_hrmanager0}: company_id: base.main_company - partner_id: res_partner_hrmanager0 login: hr password: hr groups_id: From c2c27b18582db97b0d17f9c32291f28c76cf8edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 13:15:21 +0200 Subject: [PATCH 336/571] [FIX$] This time, it's the good fix. bzr revid: tde@openerp.com-20120813111521-uws1uophrd39krfg --- .../test/worktask_entry_to_timesheetline_entry.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml index fad8e2af2c5..e670f5bae06 100644 --- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml +++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml @@ -3,6 +3,7 @@ - !record {model: res.users, id: res_users_hrmanager0}: company_id: base.main_company + name: HR Manager login: hr password: hr groups_id: From 7341bd30cc02a4360406864a17fd2e8b801cd6b3 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 13 Aug 2012 13:46:19 +0200 Subject: [PATCH 337/571] Added html field type bzr revid: nicolas.vanhoren@openerp.com-20120813114619-lqr9zu0rkz6737rp --- openerp/osv/fields.py | 3 +++ openerp/osv/orm.py | 1 + 2 files changed, 4 insertions(+) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 4ff23956050..b361ab664b6 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -227,6 +227,9 @@ class char(_column): class text(_column): _type = 'text' +class html(text): + _type = 'html' + import __builtin__ class float(_column): diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 563c514726c..069664cfebe 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -545,6 +545,7 @@ FIELDS_TO_PGTYPES = { fields.boolean: 'bool', fields.integer: 'int4', fields.text: 'text', + fields.html: 'text', fields.date: 'date', fields.datetime: 'timestamp', fields.binary: 'bytea', From d8796d429cf0a1b1df896944445ad2c6f91a8859 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 13 Aug 2012 13:46:38 +0200 Subject: [PATCH 338/571] Now uses the html field type for cl editor bzr revid: nicolas.vanhoren@openerp.com-20120813114638-pla647nupeha1tim --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index baf8c151b83..1ee5d8477f6 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4802,7 +4802,7 @@ instance.web.form.widgets = new instance.web.Registry({ 'email' : 'instance.web.form.FieldEmail', 'url' : 'instance.web.form.FieldUrl', 'text' : 'instance.web.form.FieldText', - 'text_html' : 'instance.web.form.FieldTextHtml', + 'html' : 'instance.web.form.FieldTextHtml', 'date' : 'instance.web.form.FieldDate', 'datetime' : 'instance.web.form.FieldDatetime', 'selection' : 'instance.web.form.FieldSelection', From 540a3c2b0a8c9f69b82d6294f9cdfe8c69af3f2d Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Mon, 13 Aug 2012 13:51:54 +0200 Subject: [PATCH 339/571] [IMP] removing structure bzr revid: fp@tinyerp.com-20120813115154-1ppf7mmaolbywku1 --- openerp/addons/base/res/res_partner_demo.xml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index fece3c480aa..68d291077c4 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -18,52 +18,43 @@ Employee - Gold Partner + Gold - Silver Partner + Silver - Bronze Partner + Bronze IT Services - Consultancy Services - Components Buyer - Services - Office Supplies - Distributor - Manufacturer - Wholesaler - Retailer - Company Contact From f7d274850e9ff73f5ef3e572935c341a3b435a0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 13 Aug 2012 14:22:07 +0200 Subject: [PATCH 340/571] [IMP] [CLEAN] res_partner: image_medium used in view, because image_small was too small; cleaned some print statemetns in res_users. bzr revid: tde@openerp.com-20120813122207-04f91lvor03g1xek --- openerp/addons/base/res/res_partner_view.xml | 2 +- openerp/addons/base/res/res_users.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml index b5bfda2f0a0..c26987cafaa 100644 --- a/openerp/addons/base/res/res_partner_view.xml +++ b/openerp/addons/base/res/res_partner_view.xml @@ -99,7 +99,7 @@

      - +
      ";this.g.innerHTML=b;if(a.timeSelect){for(var c=this.g.getElementsByTagName("select"),d=this.ec,e=0;e"+f+"
      ";d+=this.W[0]}for(var g=0;g<7;g++){var h=(c+g)%7,i=dhx.Date.Locale.day_short[h], -j="dhx_cal_day_name",k=this.W[g+e]-1;g==6&&(j+=" dhx_cal_day_name_last",k+=1);h===0&&(j+=" dhx_sunday");h==6&&(j+=" dhx_saturday");b+="
      "+i+"
      ";d+=this.W[g+e]}return b},Bd:function(){var a=this.a,b=0,c=dhx.Date.add(this.ke,-this.lb,"day"),c=dhx.Date.datePart(c),d=0,e="";if(a.weekNumber){var d=1,f=dhx.Date.add(c,(this.vd+1)%2,"day");e+='';for(var g= -0;g=7||g==this.G-2&&this.Ob==14))k="dhx_next_month",j="";g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+="";f=dhx.Date.add(f,7,"day")}e+="
      ";e+="
      "+j+"
      ";e+="
      "}var o=dhx.Date.datePart(new Date);e+='';for(var m= -this.G*7-1,g=0;g";for(var l=0;l<7;l++){var n=a.calendarDay(c),p=this.rc(c),k="dhx_cal_day_num";bm-this.Ob&&(k="dhx_next_month",p=n="");h=this.Da[g]-2;i=this.W[l+d]-2;l==6&&(k+=" dhx_cal_day_num_rborder",i+=1);g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+=""; -c=dhx.Date.add(c,1,"day");b++}e+=""}e+="
      ";o.valueOf()==c.valueOf()&&(k+=" dhx_cal_current_day");e+="
      "+n+"
      ";e+="
      ";return e},Ue:function(){for(var a=this.a,b="";b+="";return b},le:function(){var a="
      ";return a+"prev"+b+a+"next"+b},on_click:{dhx_cal_arrow:function(a,b,c){var d=c.className.match(/prev/i)?-1:1,e=new Date(this.L),f=new Date(e);f.setDate(1);f=dhx.Date.add(f,d,"month");this.callEvent("onBeforeMonthChange",[e,f])&&(this.showCalendar(f),this.selectDate(this.a.date,!1),this.callEvent("onAfterMonthChange",[f,e]))},dhx_cal_day_num:function(a,b,c){var d=c.getAttribute("date"),e=this.Cd(d);if(this.a.timeSelect){var f=this.ec;e.setMinutes(f[0].value*60+f[1].value* -1)}this.selectDate(e);this.callEvent("onDateSelect",[e]);this.callEvent("onChange",[e])}}},dhx.MouseEvents,dhx.Settings,dhx.EventSystem,dhx.Movable,dhx.ui.view);dhx.Modality={modal_setter:function(a){if(a){if(!this.qa)this.qa=dhx.html.create("div",{"class":a=="rich"?"dhx_modal_rich":"dhx_modal"}),this.qa.style.zIndex=dhx.ui.zIndex(),this.b.style.zIndex=dhx.ui.zIndex(),document.body.appendChild(this.qa)}else this.qa&&dhx.html.remove(this.qa),this.qa=null;return a}}; -dhx.protoUI({name:"window",$init:function(a){this.b.innerHTML="
      ";this.g=this.b.firstChild;this.eb=this.g.childNodes[0];this.pc=this.g.childNodes[1];this.b.className+=" dhx_window";this.R=this.h=null;this.a.k={top:!1,left:!1,right:!1,bottom:!1};if(!a.id)a.id=dhx.uid()},Zc:function(){this.h={destructor:function(){}}},ac:function(a){this.h.destructor();this.h=a;this.h.D=this;this.pc.appendChild(this.h.b); -this.resize()},show:function(a,b,c){this.a.hidden=!1;this.b.style.zIndex=dhx.ui.zIndex();this.a.modal&&this.modal_setter(!0);var d,e,f;if(a){typeof a=="object"&&!a.tagName?(d={x:a.clientX-this.$[0]/2,y:a.clientY},e=document.body.offsetWidth,f=1):a=dhx.toNode(a);var g=document.body.offsetWidth,h=document.body.offsetHeight;e=e||a.offsetWidth;f=f||a.offsetHeight;var i=this.$;d=d||dhx.html.offset(a);var j=6,k=6,o=6,c="top",m=0,l=0,n=0,p=0;b=="right"?(p=d.x+j+e,k=-f,c="left",m=Math.round(d.y+f/2),l=p- -o):b=="left"?(p=d.x-j-i[0]-1,k=-f,c="right",m=Math.round(d.y+f/2),l=p+i[0]+1):(p=g-d.x>i[0]?d.x:g-j-i[0],l=Math.round(d.x+e/2),l>p+i[0]&&(l=p+i[0]/2));h-f-d.y-k>i[1]?(n=f+d.y+k,m||(c="top",m=n-o)):(n=d.y-k-i[1],n<0?(n=0,c=!1):m||(c="bottom",n--,m=n+i[1]+1));this.setPosition(p,n);c&&this.cd&&this.cd(c,l,m)}this.Le=new Date;this.b.style.display="block";if(this.la){for(var q=0;q250&&this.hide()},$getSize:function(){var a=this.h.$getSize();if(a[3])this.a.height=a[3]+this.a.padding*2;if(a[1])this.a.width=a[1]+this.a.padding*2;if(a[0]||a[2])this.a.gravity=Math.max(a[0],a[2]);return dhx.ui.view.prototype.$getSize.call(this)}, -$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))a=this.j-this.a.padding*2,b=this.m-this.a.padding*2,this.g.style.padding=this.a.padding+"px",this.eb.style.display="none",this.h.$setSize(a,b)},body_setter:function(a){a=dhx.ui.window.prototype.body_setter.call(this,a);this.h.a.k={top:!1,left:!1,right:!1,bottom:!1};return a},defaults:{padding:8},head_setter:null,cd:function(a,b,c){this.Fc();document.body.appendChild(this.Ka=dhx.html.create("DIV",{"class":"dhx_point_"+a},"")); -this.Ka.style.zIndex=dhx.ui.zIndex();this.Ka.style.top=c+"px";this.Ka.style.left=b+"px"},Fc:function(){this.Ka=dhx.html.remove(this.Ka)}},dhx.ui.window); -dhx.protoUI({name:"alert",defaults:{position:"center",head:{template:"Info",css:"dhx_alert_template"},height:170,modal:!0,callback:null,body:{type:"clean",rows:[{template:"
      #text#
      ",data:{text:"You have forgot to define the text :) "}},{view:"button",height:60,id:"dhx_alert_ok",type:"big",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}}]}},$init:function(){(!this.b.parentNode||!this.b.parentNode.tagName)&&document.body.appendChild(this.b);this.$ready.push(this.resize)}, -Yc:function(a){typeof a=="string"&&(a={title:this.defaults.head.template,message:a});dhx.extend(a,this.defaults);delete a.head;delete a.body;this.Rb(a,{});this.resize();this.show()},title_setter:function(a){this.R.define("template",a);this.R.render()},message_setter:function(a){var b=this.h.c[0];b.data={text:a};b.render()},labelOk_setter:function(a){var b=this.h.c[1];b.config.label=a;b.render()},labelCancel_setter:function(a){var b=this.h.c[2];b.config.label=a;b.render()},Bb:function(a){this.hide(); -this.a.callback&&dhx.toFunctor(this.a.callback).call(this,a,this.a.details)}},dhx.ui.window);dhx.alert=dhx.single(dhx.ui.alert); -dhx.protoUI({name:"confirm",defaults:{height:210,body:{type:"clean",rows:[{id:"dhx_confirm_message",template:"
      #text#
      ",data:{text:"You have forgot to define the text :) "}},{height:53,view:"button",type:"big",id:"dhx_confirm_ok",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}},{height:55,view:"button",type:"biground",id:"dhx_confirm_cancel",label:"Cancel",click:function(){this.getParent().getParent().Bb(!1)}}]}}},dhx.ui.alert);dhx.confirm=dhx.single(dhx.ui.confirm); -dhx.dp=function(a){if(typeof a=="object"&&a.a)a=a.a.id;if(dhx.dp.Tb[a])return dhx.dp.Tb[a];if(typeof a=="string"||typeof a=="number")a={master:dhx.ui.get(a)};var b=new dhx.DataProcessor(a);return dhx.dp.Tb[b.a.master.a.id]=b};dhx.dp.Tb={}; -dhx.DataProcessor=dhx.proto({defaults:{autoupdate:!0,mode:"post"},$init:function(){this.V=[];this.bf=[];this.X=null;this.na=!1;this.name="DataProcessor";this.$ready.push(this.zb)},master_setter:function(a){var b=a;if(a.name!="DataStore")b=a.data;this.a.store=b;return a},zb:function(){this.a.store.attachEvent("onStoreUpdated",dhx.bind(this.Sc,this))},ignore:function(a,b){var c=this.na;this.na=!0;a.call(b||this);this.na=c},off:function(){this.na=!0},on:function(){this.na=!1},Kd:function(a){var b={}, -c;for(c in a)c.indexOf("$")!==0&&(b[c]=a[c]);return b},save:function(a,b){b=b||"update";this.Sc(a,this.a.store.item(a),b)},Sc:function(a,b,c){if(this.na===!0||!c)return!0;var d={id:a,data:this.Kd(b)};switch(c){case "update":d.operation="update";break;case "add":d.operation="insert";break;case "delete":d.operation="delete";break;default:return!0}if(d.operation!="delete"&&!this.validate(d.data))return!1;this.Gd(d)&&this.V.push(d);this.a.autoupdate&&this.send();return!0},Gd:function(a){for(var b=0;b< -this.V.length;b++){var c=this.V[b];if(c.id==a.id){if(a.operation=="delete")c.operation=="insert"?this.V.splice(b,1):c.operation="delete";c.data=a.data;return!1}}return!0},send:function(){this.Ge()},Ge:function(){if(this.a.url){for(var a=this.V,b=[],c=0;c=0&&this.V.splice(i,1),h.tid!=h.sid&&this.a.store.changeId(h.sid,h.tid),this.callEvent("onAfter"+h.type,[h])}this.callEvent("onAfterSync",[f,a,b,c])},escape:function(a){return this.a.escape?this.a.escape(a):encodeURIComponent(a)}},dhx.Settings,dhx.EventSystem,dhx.ValidateData); -(function(){var a=dhx.Touch={config:{longTouchDelay:1E3,scrollDelay:150,gravity:500,deltaStep:30,speed:"0ms",finish:1500},disable:function(){a.Fb=!0},enable:function(){a.Fb=!1},$init:function(){dhx.env.touch?(dhx.event(document.body,"touchstart",a.nd),dhx.event(document.body,"touchmove",a.gc),dhx.event(document.body,"touchend",a.md)):(a.bb=a.Wd,dhx.event(document.body,"mousedown",a.nd),dhx.event(document.body,"mousemove",a.gc),dhx.event(document.body,"mouseup",a.md),document.body.style.overflowX= -document.body.style.overflowY="hidden");dhx.event(document.body,"dragstart",function(a){return dhx.html.preventEvent(a)});dhx.event(document.body,"touchstart",function(b){if(!a.Fb&&dhx.env.isSafari)return b.srcElement.tagName=="SELECT"?!0:dhx.html.preventEvent(b)});a.Ca()},Ca:function(){a.A=a.w=a.ca=null;a.H=a.v=a.n=null;a.I={wb:0,xb:0,Na:0};if(a.Xa)dhx.html.removeCss(a.Xa,"dhx_touch"),a.Xa=null;window.clearTimeout(a.Kc);a.ud=!0;a.Sa=!0;a.Ta=!0;a.ic||a.ua()},md:function(b){if(a.A){if(a.H){var c=a.Hb(a.v), -d=c.e,e=c.f,f=a.config.finish,g=a.Bc(b,!0);if(g.Na){var h=d+a.config.gravity*g.wb/g.Na,i=e+a.config.gravity*g.xb/g.Na,j=a.q[0]?a.Wa(h,!1,!1,a.n.dx,a.n.px):d,k=a.q[1]?a.Wa(i,!1,!1,a.n.dy,a.n.py):e,o=Math.max(Math.abs(j-d),Math.abs(k-e));o<150&&(f=f*o/150);if(j!=d||k!=e)f=Math.round(f*Math.max((j-d)/(h-d),(k-e)/(i-e)));var m={e:j,f:k},l=dhx.ui.get(a.v);l&&l.callEvent&&l.callEvent("onAfterScroll",[m]);f=Math.max(100,f);d!=m.e||e!=m.f?(a.wa(a.v,m.e,m.f,f+"ms"),a.dd(m.e,m.f,f+"ms")):a.ua()}else a.ua()}else if(a.Ta&& -!a.Sa)a.ya("onSwipeX");else if(a.Sa&&!a.Ta)a.ya("onSwipeY");else if(dhx.env.isSafari){var n=a.A.target;dhx.delay(function(){var a=document.createEvent("MouseEvents");a.initEvent("click",!0,!0);n.dispatchEvent(a)})}a.ya("onTouchEnd");a.Ca()}},gc:function(b){if(a.A){var c=a.Bc(b);a.ya("onTouchMove");if(a.H)a.ed(c);else if(a.Sa=a.lc(c.Ye,"x",a.Sa),a.Ta=a.lc(c.Ze,"y",a.Ta),a.H){var d=a.Cc("onBeforeScroll");if(d){var e={};d.callEvent("onBeforeScroll",[e]);if(e.update)a.config.speed=e.speed,a.config.scale= -e.scale}a.ce(c)}return dhx.html.preventEvent(b)}},ed:function(){if(a.v){var b=a.Hb(a.v),c=b.e,d=b.f,e=a.ca||a.A;if(a.q[0])b.e=a.Wa(b.e-e.x+a.w.x,!0,b.e,a.n.dx,a.n.px);if(a.q[1])b.f=a.Wa(b.f-e.y+a.w.y,!0,b.f,a.n.dy,a.n.py);a.wa(a.v,b.e,b.f,"0ms");a.dd(b.e,b.f,"0ms")}},dd:function(b,c,d){var e=a.n.px/a.n.dx*-b,f=a.n.py/a.n.dy*-c;a.q[0]&&a.wa(a.q[0],e,0,d);a.q[1]&&a.wa(a.q[1],0,f,d)},wa:function(b,c,d,e){a.ic=!0;b.style[dhx.env.transformPrefix+"Transform"]=dhx.env.translate+"("+Math.round(c)+"px, "+ -Math.round(d)+"px"+(dhx.env.translate=="translate3d"?", 0":"")+")";b.style[dhx.env.transformPrefix+"TransitionDuration"]=e},Hb:function(a){var c=window.getComputedStyle(a)[dhx.env.transformPrefix+"Transform"];if(c=="none")return{e:0,f:0};else{if(window.WebKitCSSMatrix)return new WebKitCSSMatrix(c);for(var d=c.replace(/(matrix\()(.*)(\))/gi,"$2"),d=d.replace(/\s/gi,""),d=d.split(","),e={},f="a,b,c,d,e,f".split(","),g=0;g0)return c?d+h*Math.sqrt(g):0;var i=e-f;return i+a<0?c?d-Math.sqrt(-(a-d)):-i:a},ce:function(){a.H.indexOf("x")!=-1&&(a.q[0]=a.vc("x",a.n.dx,a.n.px,"width"));a.H.indexOf("y")!=-1&&(a.q[1]=a.vc("y",a.n.dy,a.n.py,"height"));if(!a.v.scroll_enabled){a.v.scroll_enabled=!0;a.v.parentNode.style.position="relative";var b=dhx.env.transformCSSPrefix;a.v.style.cssText+=b+"transition: "+b+"transform; "+b+"user-select:none; "+b+"transform-style:flat;";a.v.addEventListener(dhx.env.transitionEnd, -a.ua,!1)}window.setTimeout(a.ed,1)},vc:function(b,c,d,e){if(c-d<2)return a.H="";var f=dhx.html.create("DIV",{"class":"dhx_scroll_"+b},"");f.style[e]=d*d/c-7+"px";a.v.parentNode.appendChild(f);return f},lc:function(b,c,d){if(b>a.config.deltaStep){if(a.ud&&(a.he(c),(a.H||"").indexOf(c)==-1))a.H="";return!1}return d},ua:function(){if(!a.H)dhx.html.remove(a.q),a.q=[null,null];a.ic=!1},he:function(b){window.clearTimeout(a.Kc);a.ud=!1;a.Jc(b)},nd:function(b){if(!a.Fb){a.A=a.bb(b);a.ya("onTouchStart");a.q[0]|| -a.q[1]?a.Re(b,a.q[0]?"x":"y"):a.Kc=window.setTimeout(a.ie,a.config.longTouchDelay);var c=dhx.ui.get(b);if(c&&c.touchable&&(!b.target.className||b.target.className.indexOf("dhx_view")!==0))a.Xa=c.getNode(b),dhx.html.addCss(a.Xa,"dhx_touch")}},ie:function(){a.ya("onLongTouch");dhx.callEvent("onClick",[a.A]);a.Ca()},Re:function(b,c){a.Jc(c);var d=a.q[0]||a.q[1];if(d&&(!a.v||d.parentNode!=a.v.parentNode))a.Ca(),a.ua(),a.A=a.bb(b);a.gc(b)},Bc:function(b){a.ca=a.w;a.w=a.bb(b);a.I.Ye=Math.abs(a.A.x-a.w.x); -a.I.Ze=Math.abs(a.A.y-a.w.y);if(a.ca)a.w.time-a.ca.time";this.g=this.b.firstChild;this.map=null;this.$ready.push(this.render)},render:function(){var a=this.a,b={zoom:a.zoom,center:a.center,mapTypeId:a.mapType};this.map=new google.maps.Map(this.g,b)},center_setter:function(a){typeof a!="object"&&(a={});this.Ia(a,{x:48.724,y:8.215});a=new google.maps.LatLng(a.x,a.y);this.map&&this.map.setCenter(a);return a}, -mapType_setter:function(a){a=google.maps.MapTypeId[a];this.map&&this.map.setMapTypeId(a);return a},zoom_setter:function(a){this.map&&this.map.setZoom(a);return a},defaults:{zoom:5,center:{},mapType:"ROADMAP"},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments);google.maps.event.trigger(this.map,"resize")}},dhx.ui.view);if(!window.scheduler)window.scheduler={config:{},templates:{},xy:{},locale:{}};if(!scheduler.locale)scheduler.locale={}; -scheduler.locale.labels={list_tab:"List",day_tab:"Day",month_tab:"Month",icon_today:"Today",icon_save:"Save",icon_delete:"Delete event",icon_cancel:"Cancel",icon_edit:"Edit",icon_back:"Back",icon_close:"Close form",icon_yes:"Yes",icon_no:"No",confirm_closing:"Your changes will be lost, are your sure ?",confirm_deleting:"Event will be deleted permanently, are you sure?",label_event:"Event",label_start:"Start",label_end:"End",label_details:"Notes",label_from:"from",label_to:"to"}; -scheduler.config={init_date:new Date,form_date:"%d-%m-%Y %H:%i",xml_date:"%Y-%m-%d %H:%i",item_date:"%d.%m.%Y",header_date:"%d.%m.%Y",hour_date:"%H:%i",scale_hour:"%H",calendar_date:"%F %Y"};scheduler.config.form_rules={end_date:function(a,b){return b.start_date.valueOf()";if(dhx.Date.datePart(a.start_date).valueOf()==dhx.Date.datePart(a.end_date).valueOf()){var c=dhx.i18n.dateFormatStr(a.start_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
      "+c+"
      ";b+="
      "+scheduler.locale.labels.label_from+" "+d+" "+scheduler.locale.labels.label_to+ -" "+e+"
      "}else{var f=dhx.i18n.longDateFormatStr(a.start_date),g=dhx.i18n.longDateFormatStr(a.end_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
      "+scheduler.locale.labels.label_from+" "+d+" "+f+"
      ";b+="
      "+scheduler.locale.labels.label_to+" "+e+" "+g+"
      "}a.details&&a.details!==""&&(b+="
      "+scheduler.locale.labels.label_details+"
      ",b+="
      "+a.details+"
      "); -b+="";return b},calendar_event:function(a){return a+"
      "},event_date:function(a){return dhx.i18n.dateFormatStr(a)},event_long_date:function(a){return dhx.i18n.longDateFormatStr(a)},event_time:function(a){return dhx.i18n.timeFormatStr(a)},event_color:function(a){return a.color?"background-color:"+a.color:""},event_marker:function(a,b){return"
      "},event_title:function(a,b){return"
      "+ -b.dateStart(a.start_date)+"
      "+b.timeStart(a.start_date)+"
      "+b.marker(a,b)+"
      "+a.text+"
      "},month_event_title:function(a,b){return b.marker(a,b)+"
      "+b.timeStart(a.start_date)+"
      "+a.text+"
      "},day_event:function(a){return a.text}};scheduler.config.views=[]; -dhx.ready(function(){if(scheduler.locale&&scheduler.locale.date)dhx.Date.Locale=scheduler.locale.date;if(!scheduler.config.form)scheduler.config.form=[{view:"text",label:scheduler.locale.labels.label_event,name:"text"},{view:"datepicker",label:scheduler.locale.labels.label_start,name:"start_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"datepicker",label:scheduler.locale.labels.label_end,name:"end_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"textarea",label:scheduler.locale.labels.label_details, -name:"details",width:300,height:150},{view:"button",label:scheduler.locale.labels.icon_delete,id:"delete",type:"form",css:"delete"}];if(!scheduler.config.bottom_toolbar)scheduler.config.bottom_toolbar=[{view:"button",id:"today",label:scheduler.locale.labels.icon_today,inputWidth:scheduler.xy.icon_today,align:"left",width:scheduler.xy.icon_today+6},{view:"segmented",id:"buttons",selected:"list",align:"center",multiview:!0,options:[{value:"list",label:scheduler.locale.labels.list_tab,width:scheduler.xy.list_tab}, -{value:"day",label:scheduler.locale.labels.day_tab,width:scheduler.xy.day_tab},{value:"month",label:scheduler.locale.labels.month_tab,width:scheduler.xy.month_tab}]},{view:"button",css:"add",id:"add",align:"right",label:"",inputWidth:42,width:50},{view:"label",label:"",inputWidth:42,width:50,batch:"readonly"}];if(!scheduler.config.day_toolbar)scheduler.config.day_toolbar=[{view:"label",id:"prev",align:"left",label:"
      "},{view:"label",id:"date",align:"center", -width:200},{view:"label",id:"next",align:"right",label:"
      "}];if(!scheduler.config.selected_toolbar)scheduler.config.selected_toolbar=[{view:"button",inputWidth:scheduler.xy.icon_back,type:"prev",id:"back",align:"left",label:scheduler.locale.labels.icon_back},{view:"button",inputWidth:scheduler.xy.icon_edit,id:"edit",align:"right",label:scheduler.locale.labels.icon_edit}];if(!scheduler.config.form_toolbar)scheduler.config.form_toolbar=[{view:"button", -inputWidth:scheduler.xy.icon_cancel,id:"cancel",css:"cancel",align:"left",label:scheduler.locale.labels.icon_cancel},{view:"button",inputWidth:scheduler.xy.icon_save,id:"save",align:"right",label:scheduler.locale.labels.icon_save}];scheduler.types={event_list:{name:"EventsList",css:"events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.list_height,width:"auto",dateStart:scheduler.templates.event_date,timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker, -template:scheduler.templates.event_title},day_event_list:{name:"DayEventsList",css:"day_events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.month_list_height,width:"auto",timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker,template:scheduler.templates.month_event_title}};dhx.Type(dhx.ui.list,scheduler.types.event_list);dhx.Type(dhx.ui.list,scheduler.types.day_event_list);dhx.DataDriver.scheduler={records:"/*/event"};dhx.extend(dhx.DataDriver.scheduler, -dhx.DataDriver.xml);var a=[{id:"list",view:"list",type:"EventsList",startDate:new Date},{id:"day",rows:[{id:"dayBar",view:"toolbar",css:"dhx_topbar",elements:scheduler.config.day_toolbar},{id:"dayList",view:"dayevents"}]},{id:"month",rows:[{id:"calendar",view:"calendar",dayWithEvents:scheduler.templates.calendar_event,calendarHeader:scheduler.config.calendar_date},{id:"calendarDayEvents",view:"list",type:"DayEventsList"}]},{id:"event",animate:{type:"slide",subtype:"in",direction:"top"},rows:[{id:"eventBar", -view:"toolbar",type:"TopBar",css:"single_event",elements:scheduler.config.selected_toolbar},{id:"eventTemplate",view:"template",template:scheduler.templates.selected_event}]},{id:"form",rows:[{id:"editBar",view:"toolbar",type:"TopBar",elements:scheduler.config.form_toolbar},{id:"editForm",view:"form",elements:scheduler.config.form,rules:scheduler.config.form_rules}]}].concat(scheduler.config.views);dhx.protoUI({name:"scheduler",defaults:{rows:[{view:"multiview",id:"views",cells:a},{view:"toolbar", -id:"bottomBar",type:"SchedulerBar",visibleBatch:"default",elements:scheduler.config.bottom_toolbar}],color:"#color#",textColor:"#textColor#"},$init:function(){this.name="Scheduler";this.b.className+=" dhx_scheduler";dhx.i18n.dateFormat=scheduler.config.item_date;dhx.i18n.timeFormat=scheduler.config.hour_date;dhx.i18n.fullDateFormat=scheduler.config.xml_date;dhx.i18n.headerFormatStr=dhx.Date.dateToStr(scheduler.config.header_date);dhx.i18n.setLocale();this.data.provideApi(this);this.data.extraParser= -dhx.bind(function(a){a.start_date=dhx.i18n.fullDateFormatDate(a.start_date);a.end_date=dhx.i18n.fullDateFormatDate(a.end_date)},this);this.$ready.push(this.$d);this.data.attachEvent("onStoreUpdated",dhx.bind(this.Oe,this))},$d:function(){this.ae();this.de();this.coreData=new dhx.DataValue;this.coreData.setValue(scheduler.config.init_date);this.$$("dayList").define("date",this.coreData);this.selectedEvent=new dhx.DataRecord;this.config.readonly?this.define("readonly",this.config.readonly):scheduler.config.readonly&& -this.define("readonly",!0);if(this.config.save){var a=new dhx.DataProcessor({master:this,url:this.config.save});a.attachEvent("onBeforeDataSend",this.re)}this.$$("date")&&this.$$("date").bind(this.coreData,null,dhx.i18n.headerFormatStr);this.$$("list").sync(this);this.$$("list").bind(this.coreData,function(a,b){return ba.start_date}); -this.$$("calendar").bind(this.coreData);this.$$("calendarDayEvents").sync(this,!0);this.$$("calendarDayEvents").bind(this.coreData,function(a,b){var e=dhx.Date.datePart(b);return ea.start_date});this.$$("eventTemplate").bind(this);this.$$("editForm").bind(this);this.$$("list").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("dayList").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("calendarDayEvents").attachEvent("onItemClick",dhx.bind(this.Qb, -this))},Qb:function(a){this.setCursor(a);this.$$("event").show()},Oe:function(){this.data.blockEvent();this.data.sort(function(a,b){return a.start_date";e+="
      "+a+"
      ";e+="
      ";e+="
      "+c+"
      ";e+="
      "+d+"
      ";e+="
      ";e+="
      ";e+="
      ";e+="
      ";e+="
      ";e+="";return e},type:{templateStart:dhx.Template("
      "),template:scheduler.templates.day_event,templateEnd:dhx.Template("
      "),templateCss:dhx.Template(""),templateColor:dhx.Template("#color#"), -templateTextColor:dhx.Template("#textColor#"),padding:2},we:function(){var a=this.data.getRange(),b=[],c,d,e,f,g;for(d=0;dg)g=b[e].$sorder;c.$sorder=g+1;c.$inner=!1}else c.$sorder=0;b.push(c);if(b.length>(b.max_count||0))b.max_count=b.length}for(d=0;ddhx.Date.datePart(d).valueOf()&&(d=c);dhx.Date.datePart(c).valueOf()dhx.Date.datePart(b).valueOf()&&(d=dhx.Date.datePart(b),d.setMinutes(0),d.setHours(this.config.lastHour));if(e=this.config.lastHour)e=this.config.lastHour&&(d.setMinutes(0), -d.setHours(this.config.lastHour));var g=Math.floor((this.j-this.config.timeScaleWidth-this.config.eventOffset-8)/a.$count);a.$left=a.$sorder*g+this.config.timeScaleWidth+this.config.eventOffset;a.$inner||(g*=a.$count-a.$sorder);a.$width=g-this.config.eventOffset-this.type.padding*2;var h=c.getHours()*60+c.getMinutes(),i=d.getHours()*60+d.getMinutes()||this.config.lastHour*60;a.$top=Math.round((h-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60);a.$height=Math.max(10,(i-h)*(this.config.timeScaleHeight+ -1)/60-2)-this.type.padding*2}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.RenderStack,dhx.DataLoader,dhx.ui.view,dhx.EventSystem,dhx.Settings); diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png deleted file mode 100644 index f874fa321f76c0160b4b8f48a9daedd36cee8bd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-K!2~3QS7wv~DYlXzzhEE@1bNHYCjzN8o-U3d z9-VKm8gd;nkZ60jT|%I+@bbcQPDi;T_O`Hp6$;Z=5S?@TU|y`(N|Rpai&^>LliG7K>pl(rSzno3KoOa=R6OQ;>i`)H-Zq+|- rem;NCMy?*i15f`I>27?rBbrhEz?;bOtEaj?aro^_LoO#n0oLiZ?RyuPUpS?GqslgVeZo@nfDPL>Z59ly6Z$XQd?Wp%_+|rv zAin+&({_B_Y(4LETD{imw~SIs%Zs#+$MK)Oc_XY_)5OIud&1wMy*F!&Hls+*7R9w&bR`KG0FOwjF-VBE?4X&3fUtYA4 zZOCxh+_YJ5b5rp9hAQ(dF0b>sFK%4)^arb~S3yWRWAq}R%Naaf{an^LB{Ts5d(dK@ diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif deleted file mode 100644 index dd6595e5d9ef43bd03c486ff87079f398267e085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmZ?wbhEHblw#0e_|Cu(?klqTfBEyoYklCmVoqenVS|Pe!)>e59cFWsU9>AW zZP8U{yyh;8RlNr303RUE2#_d#_^)>0%x$Xs10t-?UO*$CP9jc$w;rijn>#HZ* ziuOA9HrlOUoN#1EY26vWko7W`kGGuIQyH^LXXo0ihgT<^dANV+jn?#K4u`fCUwwP* z-M5!ZXNH}5yl>s2_-m)ym(2>l`}us|%dq{M3y$q7@2KifR>Y}Mw6)3c8m-~M#w=7-a1 z2lYB02kd$=@8hpG|NsAI7zM*O1QdU=FfuSCFzA512+9-e9RC>(a>#gWSa7hJLs%<@ z!>y62jYpg%f??u==`spD872Y>4UJt1VGkBu+W4e}lTpRt$^pd#JWK}3LKB3T9*Ht> z{5N>MH5zv}sFyVmL)JDz@z9|n~A2ze=aoMTfc#?RCTa!a?fk(jUuvRNSo+m#7 zABgF&Eo)ezv2bzAcA+K}&I`<}M+6xCroGv*gqxjLp!QVD$^#6OloTdwc^t4{g{)f>K6CCawk>Cl{7Cw?#BK3K$BV zSs5kRIOOdXxUhBTvni|)Xl*QJN-QjLPzCavSUfPI0sfDy@jpkeH{?dy!N3 zhQbX7(}VJFMYr8B{IE5rQKCY`;NikW%s2R0UNrDKaC~s&6i8KY$lHF<>b{ktD z&gisyeO}}wWwu=IPQcysynfG5*AoY441ID30dRqYbB2hDj*oeU0SAKw43?OemjIca zmy8XQ2$l?`rlkO-{A0vp~mdytYTbG?msW^U zr#j6lvq09dT+^yuJJf1X0dM0fC;-4L+`9_kQoUzXuU`e6%*y?X_HW+7hz~0^%s6r5 zqF(Vz#(P-uVW*ZU-_3lP;(^MbIg1WWdbDW)xdf)NP2)85Uy zx9{J;VH*OpAUN;?ZyFFc{+kM-;>@E-IQ3E2UV#jV2dz}|K7IbH;;QNrz*VAWT z&%M2R_w3)xkI!-mk0eEOoX77&KNJ1{1{YYw5-_xof)G1|V4wyF7P#Pp5RRZj1OPka Cm_4ij diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif deleted file mode 100644 index 67257083540f7ea06881718da65d749f7284e165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmZ?wbhEHb6k-r!c*ek>prLT)%o*dfGgj$`HW)Az6cjY9_^@!{!iEJG{{Q%I;E^z4 z!G;SD{sW1G2@e`(9Qfam@FBrq!iozH0SOHY9(?%lzo28ogbn{4Djqzr5a{jgov`A= zh65M&@85s>_U->O8UiXVBt#?>EcoD1aG_wvg9k7EH#9UXSaD#%jt2)U1ZK{h8PM>c zVZn$0|NmdSa?Qab;lPOt4J-aPEI9Dt$A5={2S5dnpFCc$;lTAP*C%YaV3lz(dCI*9 z4g$qf)-Kp_;lhmv7j9e#Xtg?cw=gYN-LX^L zkc~}ezmnDRmHU*|uGiL?1^(|-fE8lblbd4od4L*O>-Nnixo_MTBMAhPt^YXsC%yN=J0u$6;9q86(1O;^YnlA`!OMrv9(1`BVyeag@*_CuyPgcJ8^Pz`Z*T|W<~~U06^u> AiU0rr diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif deleted file mode 100644 index 61f7dc2e5ac32fc064ffb4e231f344df03d07baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcmeH``!m}I0KmVIhu6+xXQh>06V%F?qh)EkZW3)hs&#ZarWvxNoo;QVXEiO_5K$#2 z#3Qb$#AB(~2ueM&NkRnmh*v}-2#b)=1sRIUu7ARQ-{<$wFQ2=Qf1ux~)A*ynQDB=1 z7>!1;SX|9t2@eksi-{YQYbGWpD%+Ooy0mdgS<1zCJfSY5{B?FQxA1qBY<91EWb?-a zY8rbwzjh9PJ6SZWBoGLOt+$f#1qQo*dVaraXydP?75Us=W`#mAuhFjQXBQ7zgwj7H zW17`X{rYA`ei^f}d1T@>wM?E_P*GGfRK%{yd9KW5)d%C^N}J`67;V{XQ8rguRaM1p z=*(bL)_3$%*i-#7jbe7Os&koL+aZu@cm^7wXN@X-Xe8PN?$>z29$mX=EIjrQ&;<*L&i(WN_EhjyG@vvlM zVrG|C$maLSMy7XEnzc#gZu(Qn+TR;gmL!W=PhrdQN*g*QvP4=#R@q>yX!J>8Wo_F) zgFwd@_T@dRlT5CZ)^lYoT|sVFFT;WtZ~AVk=f!jOFMXfDCf7J;?tQP z5%C`}U?5*ByZ}z^p*jFrIHdJ;4H9K?#)Xs)cZ{N1@4aZ2nl#MPhsy56Hr+^JoodF;gB)*blVN`(U9opG zg#^RL$q+kY!O!_tBK$bY7vcjlyJm!XVe*uEfFDFU_%yX* zBpYUP0@)s#hIx?ggB9V?0Qis;U5pAiJBn~N^+G`r2k&g>aq$78=Sj?4a6hoO*D{Cv z^`sPI*MctxtcXOw_a`=p`S@ET5d*XO*gT#5!C_1p3doCqUVxp5`J8S`X!C$rpo6I* zxI0Y+y%=3Z&#dh{Q3Xy-~T6X|NCUj z-+AKAj$^O4oc%v(-P4P=e*FLcf6~g^o6r1jUwo^5;nm*dx0CC)-F@*tt7XTEoe$67 z_;%s`|Hp6s*U!GR{=kbx`@T+Hb}p-J@5KlIx1IZ+(X#u*#rLa^|4XUcG-vJAQ(#*m&j9|EU{aOxyJG*p2@MJ%=AY`_F&_DE?$& zWMD97&;iMV{KUYv@WAW>4;`s~kH?3FUzRA%b1$-r3GorDP~irs!TK&W1KgS zYyNz(**XTyD^~EWWH!*5t)a)Vc?;hbJ&oC#61;5t_V44B(41|qt0=^I>a>ue?olUw ebzx;08D(L0{R_^j3Wi)SnAsUe&p%Yv$JM$_W8+`K+vL zQy1@KV`DF|zZPaRp-Va7Es`fWH{!n_taqfi)L%}l+!NRT_gf~c5vTfPAO=yP@zY`zB-u?Ry@*U>$I(GcT$y28*)fmoQIDhHFx$tYDF7dZ+ zoj;d(|GrD{K0OuZ-`~Uy| diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png deleted file mode 100644 index 24957208fdcb6ec0fdc02a6468100c686eb9ecf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 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 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png deleted file mode 100644 index f0ffbdabc108e650383ef3df89eacc043db5d9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+B%Uefj_Yf7JdxSwIm! mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$Uo3K%*7 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png deleted file mode 100644 index 9f371b4df716915175019c9422df7c12c27f64ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+C3xefj_Yf8N#)Y(Nn{ mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$UeBp3Vu diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png deleted file mode 100644 index a3bae3e018613bfa0c160ea6a36723d641e3a415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hcwlasB`Q|B`)I{(pP)|LfiV zpKt#Ebmjkt3;*Ar{{Qy)|2K#JzuNo%<<9@lxBP#$;s2A>$=A-j2WnLEba4#fn3)`q yV31Idz>(mQpplS~Fyp|6hD7GWjBVUJ{0z3Y*cxAN?N9-#X7F_Nb6Mw<&;$TzL__TW diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png deleted file mode 100644 index 31d6626cdd40848c6d900eeb8e8d4057f6dfd553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmVsi?L4DSwy6=Gyw9+ zFovGaHzsTy&(`(mA|C-TpGSSX^ClSheK+Y%@EY4KGI}?S^dBdHlI7}ny*~iZxu7XL g^hQK^3Fvj(FC=_u*5-+h;{X5v07*qoM6N<$f}pKl{{R30 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png deleted file mode 100644 index 22d630927f32a8d4c66b4cbb851f20002aad0e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^#z4%(!2~3$o)(t^DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MID|ljv*DdZ2WHv9#-I)EPr>QcFBix7yH*t@Vh9Pq$SxT zu<3%V-R-{5>$oF!%xaa|x+_&9hR3^f$)(@tYA>xRzwqPwv(VfP!nqvDPIKS5)_mcq ep0}TYnc VW}y=sH5X_cgQu&X%Q~loCII&SCFTGC diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png deleted file mode 100644 index f0314fa609946421251eeafe1bd88b61216e671d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{S!3-q3+C<%eR8)XZi0hJlSN;RRw?{v|y!`n2 z!>f?N^}pM%{@r@@@5al2*I)d*`uyLO=l?E0`*-o_ zzY9v zum3Ng%&d+z7H&;jaY@O1TaS?83{1OTQT Bb#(v$ diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif deleted file mode 100644 index f5e71df6aa432e63b71dc708a929027822689ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3951 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 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png deleted file mode 100644 index 15681b311e095bcf71a016c10b98215d2f62fdeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hBeias3Yj{~rDSclZCloB#h^ z`TzIA|G%gI|2_Wy@1g&H_x}I8^Z%bM|Nm_G|7SJho#WC#T}qxVjv*W~lLZn25)2Xw s5;zh(5;PJr5@sCO(2&S{n6ZtU!Ptv+qi^c>nLyPHp00i_>zopr08)lQEdT%j diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png deleted file mode 100644 index f43a46357b2b8a44c62bb6955413ca6c422397b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^j6n2-gBi#={doIQAhj#NC&cyt|NoEQ|GW3*->p~w zu0H>F@#()akD%!6<9|SO4vfw}`3FH4p8UJ;6r>D-E%CiATwRVHQB_&GBsJyf6H$?=Q$jla?0-X33{vuFPP+`eJUrfnOyZZ0n`!f@W=oF diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png deleted file mode 100644 index 8f9a4f6da021cb45908bfe9e8d904e042b2f047a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#!3HFY>I`du6lZ})WHAE+-w_aIoT|+y4HUHT zba4#fxSkxb>HVqtw*L+XN*+8aW?NSO|37nQJx{^4`Zq~BXM7Zz1ZN)Ya^*R*tKh#R ivt*e81LI3EMh3oTj_Eal|F_ZNmx0r(h1H*=|U3OfpzvHi}DR`OfUbAABv-upo?U|K(>>jf7 X&0u(ba8}zzpe_baS3j3^P6`1px&CF4n_O8yr)Fq>iQ?Oe~R- ZJN}%psYOZYWQNhg04>pOR|ysdYXG(YZ0G<0 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png deleted file mode 100644 index 7ee9285229449c6b3361135be958566c494f600b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^HbAVx!2~3uq|aRjQfwtbe!)N*2=bP(PXtoeJzX3_ zB3j>G-OY8#K%(uTzJx$wVG#S=qhjd?Up>&>QB}RGinHtkLtax@;ku5}S3yfIH9KFl zY%=}#!9Mud^!^DP4Bp4T{&^th_9K7kqBWtXYBy_6>*GFPB(-bulr??_@=7O=S3O<*T-G@yGywp3=X(MG diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png deleted file mode 100644 index 6e5ffb852f02941eeb6e6b7bf27e6509c93ad44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^Q9!K1!3HEb8+12=r~;43Vg?4jBOuH;Rhv&5D0t7) z#W5t~-rMWD`3@$?w0*2!+}Uxor7<$&j8OYQ-H5w#tGzEARNUyPVJLhsMNrZ9#q!Mc z2d+!ZyMO8Mk0)oRUz>2@jwRdm-_G;&!#`N>T%)K=Dy9 z8UiCN1S$f&%o!LM8A^iug8wrB^T7xPYptJY1LL2wz$3Dlfr0M`2s2LA=92~rvX^-J zy0YJ9;TPmqcHKEq1uWzmQQ}xyl96A;uyWlQ51tBm$KdF>F7ur5`BF0TK>REXvEwOJ_JB{j41*#tzY6T9lm1@b!Q5 zYnU?U{M_8syb^|QXQu53im`!|g=CiGq%y2{cS#*6qVMVA7$Pw>IpGMG1P7@BN BaBTnp diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png deleted file mode 100644 index 651215a15ae456fa3036d74224e7eddb127d51de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmaJ?Yfuws6paBQW5HUB2vX`2Dqw}Ykc6Z}3~T}nCcH8V29%I2BuaKeb|DeP2M)m( zTD1jfttbMmyiAe$2m+=ff{Kbr!BTA%N)>D|AjYB-+l>|NkJ6pl{a)vsd+&G8%2JgaK(#h7#tIA2+p<0i~Qv zUKJ#y3Dx0{LK&H>ff8~>Vp;Bb8Cy;cT?T~cIJkfc!lZysl?kI99hdw{mxIr3+f*{} z3WBZYlK)96Q5Xw^BN_+@qR;|lG$svT(kb-7r7RZ9A7IevG%Afjr85HPEKVSUL!$w& zA2J?IBTwhVgM!zw@D-P=z%Vt3O4Vw$6m1{{(PU8RY&P4b!C(a7hyZj0j7fC?FzP*} z079rtqf}!`1O{x1(ljI+KbefvAD-gdkv* z5|$%c^c7ktZBHcxHg-my*Jm=<5Wu{{LiUf1BJzB%_u9D!i(9tHBmy8hadwJUC|a%qp* zV$F_S+?C(xvZK*2i}(hM?Hr`rL)Afr(^W~_6mLpHjJ-CC8vV$t(7k5jn zR_lw&L6@spu7OvNO~h%|0!?l#Ju_QAJ^5^e$;eVBsjjmc4f_< zTsNn9^8TZ3ZT#`vW|vt7Ys`HmM~#bs?KxxZDf-5qo*u_oMyX4_)!lQu2>|0U9fQcn8$`+p`n@OX=LcRhC#m>~&0 zmhy?pm}^K8i^cCb+H=H|ku_gl^Kp@Ea->@5=hI<6*vOQE!bo zI;%77+lPAd@I|NWHO<0;Vo%ICN$@K4UY)$7bKce&#S4lAU!|Yga4W&*z+$82iR}5< zkLbv{{+QFmK)(Cl-) zwy}Lq;lS;dy90s78HyzrI>XD=#(00%pA7osPwKFtOkdBtk6bTY1FO5ZbjdspsiZ!#L6hj4pPCt8_eCF( z8Tqr)M(pS%g4P>$j=#^Zb0`i8J7mf<(S~Smay2tt&+y``2lKm9^6Q>I2SS0Uy%Zk7qpmoM1=zVJxRP Tx#+8xw%=wHUj){NrRM()d4nQp diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png deleted file mode 100644 index 901b5b7fb79f2623717d8673f12eb26e2ca35e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1975 zcmaJ?YfuyC8V=>A2-Q}Of(2cpsYr9(++a;WAkqYr2qZ|FgG$IQ5J|EjSs>g7VPqIA zMFjK+Eyt=EDbOlsEK)!UUXZ4c0#+;tXg!wE3XT*wV7=hkSh4+aIJ>j^UFLb7_kF+j znfZz%r5}2@t#cy~2p%G#AQ~Ti@XvRd3;u73a%bR!H?~88$8i0SQQwM$accZtEZd z8kkRvWlQK1Ll}~*5oQ??S(a3;&Pq`S!o=VpfM0S<%8V6wPeE*Svn3_6Vt(ik9x!G)M0M5hC< zA0i&j2q!|(g7DX|@D-n!j9~_dM$5>^pk^?ss4O#diBXLuv4H@!Y4{J>~tm4U{f((NTJ0wt3F57p`3 zpiNjb@@KyPQ`jWWG$6ES#Du09)p+9)H`zlOpfDq%!ce0eMYW5k7@3S>s3{pW0AVsV z5UbI{Xol$(S|Wi&dK0G7s}YfaPsI6DjRuA|V4#2%4zk(d0Rarg4tgj9WQ5=^$YF%i z!`b1BTmh<1(;<3nkqiIHSlGZ)}g~ajzS3Q$M{~9!VfLQAC0ex%rkQcBfdT@eFDo zRr*sXK&6}V&?%>fr@y=6deHCE6Jg2W2!pzWajo!L;RmbNR)~pzPhwl)(c|KTGm>lK zL`Ja{7Jk+X69)u}-uV8hmw%prCMud# z@w;!?_9u>Y%swYgxZbS&vg1k4x3S9YE*_y}v%}g8V=*x?@~Ef~XJ==)d8F&`p;M7i z&6&Eot<}emf36_UZ3zCh`)Yp9^5*kFiREEUO-%)U71m{Y;^I90OFUdomTz9}QFMg` zf}!{B-OHQlYZvqCiyA9J{>kESZcRLVn5`}VR|EO~O=&^tA8R}f))#>K+R?U0wv<8xQDV53+1VJvJ*Luyw487&3 z=!B!^lMa679?WI2hJH&3+B-hIM$zdsrwrYP%Iaa75@Z>mpHy4F0s_Og;(`001D zNBukYgH?X(K2f^5xGYqD^Tj#l$+J_I0B`?CyIWJA)A?C*1!r>}Zy_y&{DTtENlL9v zZdQ<6rPYyZ51#VxYkov(K$vNF@`Nwl5AVNK;238FtFUTYVyYWO1P(_GkCV3)*&?_b zUWBi$e(%8#b?N?P?h|(0)T*XaACNy<8C!4llRbWi_Tt(5!u#u=3(zYAX}U`eRPRai zfeRLrU-2iF%x+G(*QWE8RVk#A^@ucfpmeGV6~=xawad3=?xsv!d`NnJw>;)=KH$DH zP;f9xrc!Ut8GM0;VZl$OzMEr<3(wps;%aAm^RGrB(!u`8$;ov1$T7=}+4_$8)(h7M zPg5$Ty|T^kS~WdBejk^~mCC0juC+fv;uT%|J-mx2^y`C#sie@~%yB=i@rnC5PsC=k zgMW5nGMUv)mTBx<<3|rhZdcscJ7J0R``rb;kmHe!-xqp=D!Z+JYQw{RvV~ o=Y}NKLi3ZOY1>y!oF+IDTK_c`b0jYRw*4vDX4gA6@@CTake(qgK=SYet7SF@B8MPv5xjV zwW~L-rYNd55tmbB_PC>_n*4k62R@Ri0Y@{q3*~S@u^|=KP!@uOq4dENRJ5TZ&tWS? zRRKMn!I|VjxEI^yAa)vu_dx> zp-^B7%?z^pSY8kWSHtJ?5`@7Ugk>CQg5+U|7qt zrn6KgQZTltSS-(QZc1ffGWma~VJxE^oPvM+{!`dV4_S~+K?mh+m0VnIvm441B^xRj z*=d9hm#f&(k1%rjkp-kKKj_s>4HcY4bTTO>Ob08b3KMdOCVWQMH8JRyq-Z22`D4K# z&quk46pjf&UW)hvd^8dcl({le^9D3=nXCQb$`!e8BN!HmEJIsA3bmMx46vB6s8{w9 zuBf-f)hc_5ROGV64C`L&U)NkdBE91-mz$PsmfIehq}OfI)GxlzKOzs}aY7EKi*K@X zrBYkf{h%N`xH>i(pO~C{&D=(*r;(e}Ok&fGl(OEaZp^Mbt2bQwvVDM?pZj)Y^z=kF zoL@+_3*BdCrb;8vGP6w|I$t%xi#^%7H7yO*8LKJR`*H`o(6PJoTz6HRKYwTcr-QuU zc~-x1Wc*kuackW|-6iGFlk4@-s`zJi)%)vjBddZIJeA|v* zq&i8L@KOh(f}l%S5lGRG6?E`Y5FwG8mr4*tjF6&o`(|~uL)*YN-w)68ywCf7?>E{R zKT%tAw1yyv+Gs>f;Ca6@_EzKnseJDuo{peU3U$E@Do7?E+7*}vWK@%~AOR$0XmA>| z5=0fLCQ~RCJ1NLeb4w1!ZEFT*6GUs9ZAfxIKx7(ZRXsqhKAxgTRS8hto){A|f*_|x zhE32l98b!_{W7mmZO6%0TfhPuKoV(d1G**H0ji`c;I(s1Q)CH(`UBLasZ^|!3_=r- z9yjBX881V6SvT9<;`8~MNRD9{n&D`cbFn_5nG+a>-1;aS%~Uc%LJV)k!n**KL&y+l zx=<*%3(an5W@(n^c}IieTo~c9hIAy^F5PMxL50$4C_%J||k4NfRS2%11b z&`d%&P_ANU4kBpfpg{(^JY=`3E3jad(6N{h)h#6HGKh)+3iI8nstA0jBkT<|cX+~n zKg)&~p7V#q4v`H9InL{C;mTYQ%6SdwsLWM%xWS5Crx7#*M;3vpo&!qQgc?~&SWqi_ z;VbHGah1wm+ADHtY=(BO^{;C#AK~6{mfKB>H`{FwblmGEZfctS`Wioo@u=9Iv_GW3 z7mICG_x(Ko=-TM{$mOxIw|X|)-F|2K%%ysIW8~-hO0h}2I`?^bxwlVM_kDR#msnm} z>gm(8+IsoL?f3KZPv6bV914x^xss;oyNMge*iWf@jq7V`jd{a(u6ufN-}JeMYsJMk z*9X%FUY(vC_)%P$^*uQ}Vb4x##gUC)(YlKV;li`u#npwW(U-)oY9jJ+cQF&cdCPgZ M(NJ8R=s0`f4|MHo@c;k- diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png deleted file mode 100644 index 05da890fe1cf4b98f8c955cfedeb53be9cba4462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1687 zcma)+c~sI_6vuyAxsaliCrivNCoFTxG)4EhJfHhXo8l|ZQjqe%C-O!{(^9W)90K84*Yi?P=kr31XJ%2u;F|Zb{=WM`n zem(LX9l?WcOpr{a1Ep1+9uU$7A%rC{&eAC~kV1_HHffn{hd4~d4^wFgbV@iG1S)hp zT_6hoPU)mjmDCiZM3Df;1zjyDqNR!iP|t&Lp>z^JpslLp8@?x}FwRDXLQ*w z<_!t})`xjw-Ei>*(}QB~fKVfiFGN{!mm||!|2K3~{CM5IJiioJ_GQaPJ#)Tu90B}X z%YJUd_v2;GOrLi`?78ldX~Ey`Jh9QF*3;_fmdb)eMC{yO=_w3Z@mk&91;(C2*;GHZ zJ-1ra(Q+1zMy~^|J;q6Z7PgMoI$y0H^in^$&XU-_RNrYvB9Od(?I%8HZ_gX5EATDF zVJ?2F;q#NE@2qch%r)mAY0 zD=y>WCvjXZxBZ4mwWDc~sJgN;D5tlt&maSPq6k9}gkXw@c)Xtbmb93aB_-M6)v{D7 zySx_H)TbnjNa&L$!D(? zqK*pfYzU1tvw>^mP!pe|(nq_!H4&N5=8e95lS}jRwnm@MAqBm=WffROcyg*d#D%-r zopxH&EESK(KaQIW2lyEt7Nvq~tKBB}%yD=Ioj3=SUO7yjNDhc?5y zaO;RLvnlraAeExjNyH>{{5hGq* zUH$l5e$0qELdz^ZDInl&17qSUnaQj@W3$Px;Y=`r@Dq>h@S&%thPwVqh#fh9yo=+c zyqO)DUt$!Jzk~QnkynziFhhuDkcVIVekdFSL0Xl>>nLt^A&Xu zAGZFAHNPWGq*85($xDhXWWgcxZ%fKYNfzcpJ2>7AmM(0p>L}%8S4bO;{*<~9FXTUW zB?^+KCnxRM1B+-ijg*u3_8KCQn=;y_rlxv&aPqRq*w`E-|8VwVP2@h-L^pTxf=nhG z+=4_tS`Z}2#wUBrv7<8OXrq%6Tm~9sJ{#Q#N?`sG5mt!a{${VHrlx0MSy%0$Bgt+^ zUQV>wIGiiY3WbBmSuFG_U2t)+?%nOQG(2%K*9QzMc?AQ(CTVBP&=I!sHB-cB}uChvDYVsKepkD zdskOidKnF0in{=U{|pP$FC7}1>VGu2)2V>waCACi}TZ1 z^QUMZb3+r8Tp@I`;CQ|H)O9YM)3LgpO@|KwEG z%F0SzU7devTjtAi_Wfe<#mSzXi*^EuX#XDV?RuI^~J@-r=lnt~IW6I)=tan0ou6VSU#UK$c12R?jIbTT3$B3LXA zS{%KQu?cm+*k`#~ZSt_%8eFTV_Ag!@ra$Hapi6;W-`XXmLjNz|dE^AP%01-rzn2#b AcK`qY diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt deleted file mode 100644 index 67cb13ff468..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ -There are a lot of files here, but you need only part of them - -Desctop scheduler, default skin - dhtmlxscheduler.js - dhtmlxscheduler.css - imgs\ - -Desctop scheduler, glossy skin - dhtmlxscheduler.js - dhtmlxscheduler_glossy.css - imgs_glossy\ - -Mobile scheduler - dhtmlxscheduler_mobile.js - dhtmlxscheduler_mobile.css - imgs_mobile\ \ No newline at end of file From ccfa1eb25299bb954e16a13b6e065f0b17d1fd34 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 18 Aug 2012 22:16:32 +0200 Subject: [PATCH 565/571] [IMP] abstractfield options replace getter by attribute bzr revid: al@openerp.com-20120818201632-5aoioz8mhu62im3p --- addons/web/static/src/js/view_form.js | 36 +++++++++++---------------- addons/web/static/src/xml/base.xml | 6 ++--- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index e2a254773ae..f39740863f3 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1908,6 +1908,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w this.field = this.field_manager.get_field(this.name); this.widget = this.node.attrs.widget; this.string = this.node.attrs.string || this.field.string || this.name; + this.options = JSON.parse(this.node.attrs.options || '{}'); this.set({'value': false}); this.set({required: this.modifiers['required'] === true}); @@ -1993,16 +1994,6 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w focus: function() { return false; }, - /** - * Utility method to get the widget options defined in the field xml description. - */ - get_definition_options: function() { - if (!this.definition_options) { - var str = this.node.attrs.options || '{}'; - this.definition_options = JSON.parse(str); - } - return this.definition_options; - }, set_input_id: function(id) { this.id_for_label = id; }, @@ -2667,7 +2658,7 @@ instance.web.form.CompletionFieldMixin = { var slow_create = function () { self._search_create_popup("form", undefined, {"default_name": name}); }; - if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { + if (self.options.quick_create === undefined || self.options.quick_create) { new instance.web.DataSet(this, this.field.relation, self.build_context()) .name_create(name, function(data) { self.add_id(data[0]); @@ -2924,7 +2915,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var lines = _.escape(str).split("\n"); var link = ""; var follow = ""; - if (! this.get_definition_options().highlight_first_line) { + if (! this.options.highlight_first_line) { link = lines.join("
      "); } else { link = lines[0]; @@ -2935,7 +2926,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var $link = this.$element.find('.oe_form_uri') .unbind('click') .html(link); - if (! this.get_definition_options().no_open) + if (! this.options.no_open) $link.click(function () { self.do_action({ type: 'ir.actions.act_window', @@ -2954,7 +2945,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var self = this; if (value_ instanceof Array) { this.display_value = {}; - if (! this.get_definition_options().always_reload) { + if (! this.options.always_reload) { this.display_value["" + value_[0]] = value_[1]; } value_ = value_[0]; @@ -4683,10 +4674,6 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ if (this.$element.parent().is('header')) { this.$element.after('
      '); } - // preview in start only for selection fields, because of the dynamic behavior of many2one fields. - if (this.field.type in ['selection']) { - this.render_list(); - } }, set_value: function(value_) { var self = this; @@ -4705,7 +4692,6 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ return self.render_list(); }); }, - /** Get the status list and render them * to_show: [[identifier, value_to_display]] where * - identifier = key for a selection, id for a many2one @@ -4715,7 +4701,8 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ render_list: function() { var self = this; // get selection values, filter them and render them - var selection_done = this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements')); + var selection_done = + this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements')); }, /** Get the selection list to be displayed in the statusbar widget. @@ -4790,12 +4777,15 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ if (this.clickable) { this.$element.addClass("oe_form_steps_clickable"); $('.oe_form_steps_arrow').remove(); + var elemts = this.$element.find('li'); _.each(elemts, function(element){ $item = $(element); if ($item.attr("data-id") != self.selected_value) { $item.click(function(event){ var data_id = parseInt($(this).attr("data-id")) + + return this.view.recursive_save().pipe(exec_action); self.view.dataset.call('stage_set', [[self.view.datarecord.id],data_id]).then(function() { return self.view.reload(); }); @@ -4807,11 +4797,13 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ } var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}"); var color = colors[this.selected_value]; - if (color) { + if (color) { var elem = this.$element.find("li.oe_form_steps_active span"); - elem.css("color", color); + elem.css("color", color); } }, + on_click_stage: function () { + }, }); /** diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 8e6f7ffc3cb..f2e022c74e0 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1017,12 +1017,12 @@ - - + + - /
      Date: Sat, 18 Aug 2012 22:18:59 +0200 Subject: [PATCH 566/571] [IMP] abstractfield options replace getter by attribute bzr revid: al@openerp.com-20120818201859-xjpvcmipg59f0p3e --- addons/mail/static/src/js/mail.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 5eb9e5e3c72..00242ecee38 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -838,13 +838,13 @@ openerp.mail = function(session) { init: function() { this._super.apply(this, arguments); - this.params = this.get_definition_options(); + this.params = this.options; this.params.thread_level = this.params.thread_level || 0; this.thread = null; this.ds = new session.web.DataSet(this, this.view.model); this.ds_users = new session.web.DataSet(this, 'res.users'); }, - + start: function() { // NB: all the widget should be modified to check the actual_mode property on view, not use // any other method to know if the view is in create mode anymore From e9d39f98a0c9ed6846d07df6323e1be19c9141db Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 19 Aug 2012 00:10:35 +0200 Subject: [PATCH 567/571] [FIX] form field statusbar clean version bzr revid: al@openerp.com-20120818221035-zue58v11r1qmbcbo --- addons/web/static/src/js/view_form.js | 146 +++++++++----------------- addons/web/static/src/xml/base.xml | 30 +----- 2 files changed, 57 insertions(+), 119 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index f39740863f3..0ef17ac685a 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4666,11 +4666,17 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ template: "FieldStatus", - clickable: false, start: function() { this._super(); this.selected_value = null; - this.clickable = !!this.node.attrs.clickable; + // backward compatibility + this.options.clickable = this.options.clickable || (this.node.attrs || {}).clickable || false; + this.options.visible = this.options.visible || (this.node.attrs || {}).statusbar_visible || false; + this.loaded = new $.Deferred(); + if (this.options.clickable) { + this.$element.on('click','li',this.on_click_stage); + } + // TODO move the following into css :after if (this.$element.parent().is('header')) { this.$element.after('
      '); } @@ -4688,121 +4694,73 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ } // trick to be sure all values are loaded in the form, therefore // enabling the evaluation of dynamic domains + self.selection = []; $.async_when().then(function() { - return self.render_list(); + self.get_selection(); }); + return this.loaded; }, - /** Get the status list and render them - * to_show: [[identifier, value_to_display]] where - * - identifier = key for a selection, id for a many2one - * - display_val = label that will be displayed - * - ex: [[0, "New"]] (many2one) or [["new", "In Progress"]] (selection) - */ - render_list: function() { - var self = this; - // get selection values, filter them and render them - var selection_done = - this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements')); - }, - - /** Get the selection list to be displayed in the statusbar widget. + /** Get the selection and render it + * selection: [[identifier, value_to_display], ...] * For selection fields: this is directly given by this.field.selection - * For many2one fields : - * - perform a search on the relation of the many2one field (given by - * field.relation ) - * - get the field domain for the search - * - self.build_domain() gives the domain given by the view or by - * the field - * - if the optional statusbar_fold attribute is set to true, make - * an AND with build_domain to hide all 'fold=true' columns - * - make an OR with current value, to be sure it is displayed, - * with the correct order, even if it is folded + * For many2one fields: perform a search on the relation of the many2one field */ get_selection: function() { var self = this; if (this.field.type == "many2one") { - this.selection = []; - // get fold information from widget - var fold = ((this.node.attrs || {}).statusbar_fold || true); - // build final domain: if fold option required, add the - if (fold == true) { - var domain = new instance.web.CompoundDomain(['|'], ['&'], self.build_domain(), [['fold', '=', false]], [['id', '=', self.selected_value]]); - } else { - var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]]); + var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]]); + var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain); + ds.read_slice(['name'], {}).done( function (records) { + for(var i = 0; i < records.length; i++) { + self.selection.push([records[i].id, records[i].name]); + } + self.render_elements(); + self.loaded.resolve(); + }); + } else { + this.loaded.resolve(); + // For field type selection filter values according to + // statusbar_visible attribute of the field. For example: + // statusbar_visible="draft,open". + var selection = this.field.selection; + console.log(selection); + for(var i=0; i< selection.length; i++) { + var key = selection[i][0]; + if(key == this.selected_value || !this.options.visible || this.options.visible.indexOf(key) != -1) { + this.selection.push(selection[i]); + } } - // get a DataSetSearch on the current field relation (ex: crm.lead.stage_id -> crm.case.stage) - var model_ext = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain); - // fetch selection - var read_defer = model_ext.read_slice(['name'], {}).pipe( function (records) { - _(records).each(function (record) { - self.selection.push([record.id, record.name]); - }); - }); - } else { - this.selection = this.field.selection; - var read_defer = new $.Deferred().resolve(); - } - return read_defer; - }, - - /** Filters this.selection, according to values coming from the statusbar_visible - * attribute of the field. For example: statusbar_visible="draft,open" - * Currently, the key of (key, label) pairs has to be used in the - * selection of visible items. This feature is not meant to be used - * with many2one fields. - */ - filter_selection: function() { - var self = this; - var shown = _.map(((this.node.attrs || {}).statusbar_visible || "").split(","), - function(x) { return _.str.trim(x); }); - shown = _.select(shown, function(x) { return x.length > 0; }); - - if (shown.length == 0) { - this.to_show = this.selection; - } else { - this.to_show = _.select(this.selection, function(x) { - return _.indexOf(shown, x[0]) !== -1 || x[0] === self.selected_value; - }); + console.log(this.selection); + this.render_elements(); } }, - /** Renders the widget. This function also checks for statusbar_colors='{"pending": "blue"}' * attribute in the widget. This allows to set a given color to a given * state (given by the key of (key, label)). */ render_elements: function () { var self = this; - var content = instance.web.qweb.render("FieldStatus.content", {widget: this, _:_}); + var content = instance.web.qweb.render("FieldStatus.content", {widget: this}); this.$element.html(content); - if (this.clickable) { - this.$element.addClass("oe_form_steps_clickable"); - $('.oe_form_steps_arrow').remove(); - - var elemts = this.$element.find('li'); - _.each(elemts, function(element){ - $item = $(element); - if ($item.attr("data-id") != self.selected_value) { - $item.click(function(event){ - var data_id = parseInt($(this).attr("data-id")) - - return this.view.recursive_save().pipe(exec_action); - self.view.dataset.call('stage_set', [[self.view.datarecord.id],data_id]).then(function() { - return self.view.reload(); - }); - }); - } - }); - } else { - this.$element.addClass("oe_form_steps"); - } var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}"); var color = colors[this.selected_value]; if (color) { - var elem = this.$element.find("li.oe_form_steps_active span"); - elem.css("color", color); + this.$("oe_active").css("color", color); } }, - on_click_stage: function () { + on_click_stage: function (ev) { + var self = this; + var $li = $(ev.currentTarget); + var val = parseInt($li.data("id")); + if (val != self.selected_value) { + this.view.recursive_save().then(function() { + var change = {}; + change[self.name] = val; + self.view.dataset.write(self.view.datarecord.id, change).then(function() { + self.view.reload(); + }); + }); + } }, }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index f2e022c74e0..c91c156a2c4 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1083,33 +1083,13 @@ -
        +
          - - - - -
        • -
          - - - - - -
          -
        • -
          -
          - - - - - -
        • - - - + +
        • + +
        • From d43eb323f12df787e4b317094aceae8f4e04c330 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 19 Aug 2012 00:51:51 +0200 Subject: [PATCH 568/571] [FIX] form field statusbar clickable class bzr revid: al@openerp.com-20120818225151-y2nymkwwn10uvo7u --- addons/web/static/src/js/view_form.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 0ef17ac685a..4f3f1c62f13 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4666,12 +4666,15 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ template: "FieldStatus", - start: function() { - this._super(); - this.selected_value = null; - // backward compatibility + init: function(field_manager, node) { + this._super(field_manager, node); this.options.clickable = this.options.clickable || (this.node.attrs || {}).clickable || false; this.options.visible = this.options.visible || (this.node.attrs || {}).statusbar_visible || false; + this.selected_value = null; + }, + start: function() { + this._super(); + // backward compatibility this.loaded = new $.Deferred(); if (this.options.clickable) { this.$element.on('click','li',this.on_click_stage); From 7e7c583d24bbb1605f5a48e2e7b470d638e5b65f Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 19 Aug 2012 03:06:46 +0200 Subject: [PATCH 569/571] [FIX] web_api example, renamed from web_rpc bzr revid: al@openerp.com-20120819010646-ujct3dwe9j0pmjq6 --- addons/{web_rpc => web_api}/__init__.py | 0 addons/web_api/__openerp__.py | 13 +++++ addons/{web_rpc => web_api}/i18n/es_CR.po | 0 addons/{web_rpc => web_api}/i18n/web_rpc.pot | 0 addons/web_api/static/src/example.html | 55 ++++++++++++++++++++ addons/web_rpc/__openerp__.py | 24 --------- addons/web_rpc/static/src/example.html | 51 ------------------ 7 files changed, 68 insertions(+), 75 deletions(-) rename addons/{web_rpc => web_api}/__init__.py (100%) create mode 100644 addons/web_api/__openerp__.py rename addons/{web_rpc => web_api}/i18n/es_CR.po (100%) rename addons/{web_rpc => web_api}/i18n/web_rpc.pot (100%) create mode 100644 addons/web_api/static/src/example.html delete mode 100644 addons/web_rpc/__openerp__.py delete mode 100644 addons/web_rpc/static/src/example.html diff --git a/addons/web_rpc/__init__.py b/addons/web_api/__init__.py similarity index 100% rename from addons/web_rpc/__init__.py rename to addons/web_api/__init__.py diff --git a/addons/web_api/__openerp__.py b/addons/web_api/__openerp__.py new file mode 100644 index 00000000000..efc99afb7a9 --- /dev/null +++ b/addons/web_api/__openerp__.py @@ -0,0 +1,13 @@ +{ + "name" : "OpenERP Web API", + "category" : "Hidden", + "description":"""Openerp Web API.""", + "version" : "2.0", + "depends" : ['web'], + "installable" : True, + 'auto_install': False, + 'js' : [ + ], + 'css' : [ + ], +} diff --git a/addons/web_rpc/i18n/es_CR.po b/addons/web_api/i18n/es_CR.po similarity index 100% rename from addons/web_rpc/i18n/es_CR.po rename to addons/web_api/i18n/es_CR.po diff --git a/addons/web_rpc/i18n/web_rpc.pot b/addons/web_api/i18n/web_rpc.pot similarity index 100% rename from addons/web_rpc/i18n/web_rpc.pot rename to addons/web_api/i18n/web_rpc.pot diff --git a/addons/web_api/static/src/example.html b/addons/web_api/static/src/example.html new file mode 100644 index 00000000000..9c920e31fa2 --- /dev/null +++ b/addons/web_api/static/src/example.html @@ -0,0 +1,55 @@ + + + + + + OpenERP web_api example + + + + +

          OpenERP web_api examples

          +

          Example 1: Load the list of defined ir.model

          +
          +

          Code:

          +
          +<script type="text/javascript" src="/web/webclient/js"></script>
          +<script type="text/javascript">
          +
          +    var instance = openerp.init(["web"]); // get a new instance
          +    instance.session.session_bind(); // bind it to the right hostname
          +    instance.session.session_authenticate("trunk", "admin", "admin", false).then(function() {
          +        var ds = new instance.web.DataSetSearch(null, "ir.model");
          +        ds.read_slice(['name','model'], {}).then(function(models){
          +            _.each(models,function(m,i){
          +                $("#ex1res").append("<li>" + m.model + " (" + m.name + ") </li>")
          +            });
          +        });
          +    });
          +
          </script> +
          +

          Div for output:

          +
          +   +
          +
          +

          Help me to complete this examples on launchpad

          + + + diff --git a/addons/web_rpc/__openerp__.py b/addons/web_rpc/__openerp__.py deleted file mode 100644 index 44946d27cb5..00000000000 --- a/addons/web_rpc/__openerp__.py +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name" : "OpenERP Web Web", - "category" : "Hidden", - "description":"""Openerp Web Web.""", - "version" : "2.0", - "depends" : [], - "installable" : False, - 'auto_install': False, - 'js' : [ - "../web/static/lib/datejs/date-en-US.js", - "../web/static/lib/jquery/jquery-1.6.4.js", - "../web/static/lib/json/json2.js", - "../web/static/lib/qweb/qweb2.js", - "../web/static/lib/underscore/underscore.js", - "../web/static/lib/underscore/underscore.string.js", - "../web/static/src/js/boot.js", - "../web/static/src/js/core.js", - "../web/static/src/js/formats.js", - "../web/static/src/js/chrome.js", - "../web/static/src/js/data.js", - ], - 'css' : [ - ], -} diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html deleted file mode 100644 index fb5d12f73e3..00000000000 --- a/addons/web_rpc/static/src/example.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - OpenERP web_rpc example - - - - - -

          OpenERP web_rpc examples

          -

          Example 1: Display a list of defined ir.model

          -

          Code:

          -
          -<script type="text/javascript" src="/base/webclient/js?mods=web_rpc"></script> 
          -<script type="text/javascript">
          -
          -    var c = openerp.init(); // get a new webclient
          -    c._modules_loaded = true; // Hack to prevent loading of additional modules
          -
          -    var s = new c.base.Session(); // setup a Session
          -    s.login("web-trunk", "admin", "admin", function() {
          -
          -            var ds = new c.base.DataSetSearch(s, "ir.model"); // DataSetSearch used to search, read
          -            ds.read_slice(['name','model'], {}, function(users){
          -                for(var i in users) { 
          -                    $("#ex1res").append("<li>" + users[i].model + " (" + users[i].name + ") </li>")
          -                }
          -            });
          -        }
          -    );
          -
          </script> -
          -

          Div for output:

          -
          -   -
          -

          Help me to complete this example page on launchpad

          - - - From 0b639b586b12d38065c092ba96f2db3e5cc1c6ec Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 20 Aug 2012 13:02:07 +0200 Subject: [PATCH 570/571] [FIX] account_voucher: supplier payment in multi-currency. Accounting entries generation fixed bzr revid: qdp-launchpad@openerp.com-20120820110207-w2sow7o2rmpbqykl --- addons/account_voucher/account_voucher.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 1287c7b3c18..223705af85e 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -1106,7 +1106,8 @@ class account_voucher(osv.osv): # otherwise we use the rates of the system (giving the voucher date in the context) amount_currency = currency_obj.compute(cr, uid, company_currency, line.move_line_id.currency_id.id, move_line['debit']-move_line['credit'], context=ctx) if line.amount == line.amount_unreconciled and line.move_line_id.currency_id.id == voucher_currency: - foreign_currency_diff = line.move_line_id.amount_residual_currency + amount_currency + sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1 + foreign_currency_diff = sign * line.move_line_id.amount_residual_currency + amount_currency move_line['amount_currency'] = amount_currency voucher_line = move_line_obj.create(cr, uid, move_line) From 1450ebd8476d81a5b3a4181a4526c280d85294a7 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 20 Aug 2012 13:50:42 +0200 Subject: [PATCH 571/571] [FIX] base: restored translations for label 'VAT' changed into 'TIN' in revision 4344 bzr revid: qdp-launchpad@openerp.com-20120820115042-13epfxw99vzvumer --- openerp/addons/base/i18n/ab.po | 4 ++-- openerp/addons/base/i18n/af.po | 4 ++-- openerp/addons/base/i18n/am.po | 4 ++-- openerp/addons/base/i18n/ar.po | 4 ++-- openerp/addons/base/i18n/base.pot | 4 ++-- openerp/addons/base/i18n/bg.po | 4 ++-- openerp/addons/base/i18n/bs.po | 4 ++-- openerp/addons/base/i18n/ca.po | 4 ++-- openerp/addons/base/i18n/cs.po | 4 ++-- openerp/addons/base/i18n/da.po | 4 ++-- openerp/addons/base/i18n/de.po | 4 ++-- openerp/addons/base/i18n/el.po | 4 ++-- openerp/addons/base/i18n/en_GB.po | 4 ++-- openerp/addons/base/i18n/es.po | 4 ++-- openerp/addons/base/i18n/es_AR.po | 4 ++-- openerp/addons/base/i18n/es_CL.po | 4 ++-- openerp/addons/base/i18n/es_CR.po | 6 +++--- openerp/addons/base/i18n/es_EC.po | 4 ++-- openerp/addons/base/i18n/et.po | 4 ++-- openerp/addons/base/i18n/eu.po | 4 ++-- openerp/addons/base/i18n/fa.po | 4 ++-- openerp/addons/base/i18n/fa_AF.po | 4 ++-- openerp/addons/base/i18n/fi.po | 4 ++-- openerp/addons/base/i18n/fr.po | 4 ++-- openerp/addons/base/i18n/gl.po | 4 ++-- openerp/addons/base/i18n/gu.po | 4 ++-- openerp/addons/base/i18n/he.po | 4 ++-- openerp/addons/base/i18n/hr.po | 4 ++-- openerp/addons/base/i18n/hu.po | 4 ++-- openerp/addons/base/i18n/hy.po | 4 ++-- openerp/addons/base/i18n/id.po | 4 ++-- openerp/addons/base/i18n/is.po | 4 ++-- openerp/addons/base/i18n/it.po | 4 ++-- openerp/addons/base/i18n/ja.po | 4 ++-- openerp/addons/base/i18n/ka.po | 4 ++-- openerp/addons/base/i18n/kk.po | 4 ++-- openerp/addons/base/i18n/ko.po | 4 ++-- openerp/addons/base/i18n/lt.po | 4 ++-- openerp/addons/base/i18n/lt_LT.po | 2 +- openerp/addons/base/i18n/lv.po | 4 ++-- openerp/addons/base/i18n/mk.po | 4 ++-- openerp/addons/base/i18n/mn.po | 4 ++-- openerp/addons/base/i18n/nb.po | 4 ++-- openerp/addons/base/i18n/nl.po | 4 ++-- openerp/addons/base/i18n/nl_BE.po | 4 ++-- openerp/addons/base/i18n/nl_NL.po | 2 +- openerp/addons/base/i18n/pl.po | 4 ++-- openerp/addons/base/i18n/pt.po | 4 ++-- openerp/addons/base/i18n/pt_BR.po | 6 +++--- openerp/addons/base/i18n/ro.po | 4 ++-- openerp/addons/base/i18n/ru.po | 4 ++-- openerp/addons/base/i18n/sk.po | 4 ++-- openerp/addons/base/i18n/sl.po | 4 ++-- openerp/addons/base/i18n/sq.po | 4 ++-- openerp/addons/base/i18n/sr.po | 4 ++-- openerp/addons/base/i18n/sr@latin.po | 4 ++-- openerp/addons/base/i18n/sv.po | 4 ++-- openerp/addons/base/i18n/th.po | 4 ++-- openerp/addons/base/i18n/tlh.po | 4 ++-- openerp/addons/base/i18n/tr.po | 4 ++-- openerp/addons/base/i18n/uk.po | 4 ++-- openerp/addons/base/i18n/uk_UA.po | 2 +- openerp/addons/base/i18n/ur.po | 4 ++-- openerp/addons/base/i18n/vi.po | 4 ++-- openerp/addons/base/i18n/zh_CN.po | 4 ++-- openerp/addons/base/i18n/zh_HK.po | 4 ++-- openerp/addons/base/i18n/zh_TW.po | 4 ++-- 67 files changed, 133 insertions(+), 133 deletions(-) diff --git a/openerp/addons/base/i18n/ab.po b/openerp/addons/base/i18n/ab.po index e7888a8a720..5f5c450592a 100644 --- a/openerp/addons/base/i18n/ab.po +++ b/openerp/addons/base/i18n/ab.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/af.po b/openerp/addons/base/i18n/af.po index 4f2dd5fb776..597bf9ab330 100644 --- a/openerp/addons/base/i18n/af.po +++ b/openerp/addons/base/i18n/af.po @@ -3653,7 +3653,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9864,7 +9864,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/am.po b/openerp/addons/base/i18n/am.po index 1ccb028cac0..4627d531674 100644 --- a/openerp/addons/base/i18n/am.po +++ b/openerp/addons/base/i18n/am.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ar.po b/openerp/addons/base/i18n/ar.po index 1a2642d9e1f..8b2dbeb7c2e 100644 --- a/openerp/addons/base/i18n/ar.po +++ b/openerp/addons/base/i18n/ar.po @@ -3721,7 +3721,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ضريبة القيمة المضافة" #. module: base @@ -9975,7 +9975,7 @@ msgstr "الأسابيع" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/base.pot b/openerp/addons/base/i18n/base.pot index b4d28052ba8..884dac7d821 100644 --- a/openerp/addons/base/i18n/base.pot +++ b/openerp/addons/base/i18n/base.pot @@ -3383,7 +3383,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9064,7 +9064,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/bg.po b/openerp/addons/base/i18n/bg.po index ab9556f269c..2bb32e19c40 100644 --- a/openerp/addons/base/i18n/bg.po +++ b/openerp/addons/base/i18n/bg.po @@ -3705,7 +3705,7 @@ msgstr "Проверка на EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ДДС" #. module: base @@ -9961,7 +9961,7 @@ msgstr "Седмици" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/bs.po b/openerp/addons/base/i18n/bs.po index 778679bb04d..97e44c61523 100644 --- a/openerp/addons/base/i18n/bs.po +++ b/openerp/addons/base/i18n/bs.po @@ -3642,7 +3642,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9853,7 +9853,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ca.po b/openerp/addons/base/i18n/ca.po index fa5f95b14da..340ddb494f5 100644 --- a/openerp/addons/base/i18n/ca.po +++ b/openerp/addons/base/i18n/ca.po @@ -3757,7 +3757,7 @@ msgstr "Verificació EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -10082,7 +10082,7 @@ msgstr "Setmanes" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/cs.po b/openerp/addons/base/i18n/cs.po index 4819a321dda..79939664d5c 100644 --- a/openerp/addons/base/i18n/cs.po +++ b/openerp/addons/base/i18n/cs.po @@ -3787,7 +3787,7 @@ msgstr "Kontrola Ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "DIČ" #. module: base @@ -10090,7 +10090,7 @@ msgstr "Týdnů" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "DPH: " #. module: base diff --git a/openerp/addons/base/i18n/da.po b/openerp/addons/base/i18n/da.po index 2710b5c4629..854dd6e6293 100644 --- a/openerp/addons/base/i18n/da.po +++ b/openerp/addons/base/i18n/da.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Moms" #. module: base @@ -9845,7 +9845,7 @@ msgstr "Uger" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/de.po b/openerp/addons/base/i18n/de.po index 9db01f56eb0..017a2d48b6b 100644 --- a/openerp/addons/base/i18n/de.po +++ b/openerp/addons/base/i18n/de.po @@ -4266,7 +4266,7 @@ msgstr "EAN Prüfung" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "USt-IdNr. / UID" #. module: base @@ -10907,7 +10907,7 @@ msgstr "Wochen" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "UID: " #. module: base diff --git a/openerp/addons/base/i18n/el.po b/openerp/addons/base/i18n/el.po index 7a9c9db6811..f8975ee4dad 100644 --- a/openerp/addons/base/i18n/el.po +++ b/openerp/addons/base/i18n/el.po @@ -3728,7 +3728,7 @@ msgstr "Έλεγχος ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ΦΠΑ" #. module: base @@ -9997,7 +9997,7 @@ msgstr "Εβδομάδες" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/en_GB.po b/openerp/addons/base/i18n/en_GB.po index d7bc4f79bbf..259f120278d 100644 --- a/openerp/addons/base/i18n/en_GB.po +++ b/openerp/addons/base/i18n/en_GB.po @@ -4123,7 +4123,7 @@ msgstr "Ean check" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "VAT" #. module: base @@ -10427,7 +10427,7 @@ msgstr "Weeks" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es.po b/openerp/addons/base/i18n/es.po index ef47237de9f..2c3cc3414af 100644 --- a/openerp/addons/base/i18n/es.po +++ b/openerp/addons/base/i18n/es.po @@ -3977,7 +3977,7 @@ msgstr "Verificación EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -10306,7 +10306,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es_AR.po b/openerp/addons/base/i18n/es_AR.po index fdc9c0340dd..b36b88a179a 100644 --- a/openerp/addons/base/i18n/es_AR.po +++ b/openerp/addons/base/i18n/es_AR.po @@ -3668,7 +3668,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CUIT" #. module: base @@ -9900,7 +9900,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es_CL.po b/openerp/addons/base/i18n/es_CL.po index 9c200b406c5..d484cdd7f94 100644 --- a/openerp/addons/base/i18n/es_CL.po +++ b/openerp/addons/base/i18n/es_CL.po @@ -3795,7 +3795,7 @@ msgstr "Verificación EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "RUT" #. module: base @@ -10124,7 +10124,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es_CR.po b/openerp/addons/base/i18n/es_CR.po index a5124cc2596..3eaeea2e0b0 100644 --- a/openerp/addons/base/i18n/es_CR.po +++ b/openerp/addons/base/i18n/es_CR.po @@ -1975,7 +1975,7 @@ msgstr "" "``BE0477472701``\n" "será validado con la normativa belga.\n" "\n" -"Hay dos niveles diferentes de validación del número de VAT: \n" +"Hay dos niveles diferentes de validación del número de TIN: \n" "\n" "*Por defecto, un simple fuera de linea de verificación se realiza mediante " "la validación conocida\n" @@ -4391,7 +4391,7 @@ msgstr "Verificación EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -12421,7 +12421,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "IVA: " #. module: base diff --git a/openerp/addons/base/i18n/es_EC.po b/openerp/addons/base/i18n/es_EC.po index 9a8ee789f45..233214a8b3f 100644 --- a/openerp/addons/base/i18n/es_EC.po +++ b/openerp/addons/base/i18n/es_EC.po @@ -3971,7 +3971,7 @@ msgstr "Ean de verificación" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -10350,7 +10350,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "IVA " #. module: base diff --git a/openerp/addons/base/i18n/et.po b/openerp/addons/base/i18n/et.po index 92461a33610..164dbde7e9b 100644 --- a/openerp/addons/base/i18n/et.po +++ b/openerp/addons/base/i18n/et.po @@ -3665,7 +3665,7 @@ msgstr "Ean kontroll" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Käibemaks" #. module: base @@ -9890,7 +9890,7 @@ msgstr "Nädalad" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/eu.po b/openerp/addons/base/i18n/eu.po index cac59f27002..16081128c30 100644 --- a/openerp/addons/base/i18n/eu.po +++ b/openerp/addons/base/i18n/eu.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/fa.po b/openerp/addons/base/i18n/fa.po index 74885636856..fc9e0b5910a 100644 --- a/openerp/addons/base/i18n/fa.po +++ b/openerp/addons/base/i18n/fa.po @@ -3667,7 +3667,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "مالیات بر ارزش افزوده" #. module: base @@ -9894,7 +9894,7 @@ msgstr "هفته‌ها" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/fa_AF.po b/openerp/addons/base/i18n/fa_AF.po index 99a346be694..86d22d26b10 100644 --- a/openerp/addons/base/i18n/fa_AF.po +++ b/openerp/addons/base/i18n/fa_AF.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/fi.po b/openerp/addons/base/i18n/fi.po index c2de09b902d..6cf9e4d0979 100644 --- a/openerp/addons/base/i18n/fi.po +++ b/openerp/addons/base/i18n/fi.po @@ -3751,7 +3751,7 @@ msgstr "EAN tarkistus" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ALV" #. module: base @@ -10091,7 +10091,7 @@ msgstr "Viikot" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "ALV: " #. module: base diff --git a/openerp/addons/base/i18n/fr.po b/openerp/addons/base/i18n/fr.po index 3f755a59d14..4849ed703f7 100644 --- a/openerp/addons/base/i18n/fr.po +++ b/openerp/addons/base/i18n/fr.po @@ -4371,7 +4371,7 @@ msgstr "Vérification EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "TVA" #. module: base @@ -11707,7 +11707,7 @@ msgstr "Semaines" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "TVA: " #. module: base diff --git a/openerp/addons/base/i18n/gl.po b/openerp/addons/base/i18n/gl.po index 91ac9510620..bce4cfa8d20 100644 --- a/openerp/addons/base/i18n/gl.po +++ b/openerp/addons/base/i18n/gl.po @@ -3757,7 +3757,7 @@ msgstr "comprobar EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "IVE" #. module: base @@ -10069,7 +10069,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/gu.po b/openerp/addons/base/i18n/gu.po index 91597862bf5..91a923c6c5b 100644 --- a/openerp/addons/base/i18n/gu.po +++ b/openerp/addons/base/i18n/gu.po @@ -3692,7 +3692,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9903,7 +9903,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/he.po b/openerp/addons/base/i18n/he.po index 967b11c89a0..51dc0b68178 100644 --- a/openerp/addons/base/i18n/he.po +++ b/openerp/addons/base/i18n/he.po @@ -3654,7 +3654,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "מע\"מ" #. module: base @@ -9877,7 +9877,7 @@ msgstr "שבועות" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/hr.po b/openerp/addons/base/i18n/hr.po index e50c21bd73c..da97294a878 100644 --- a/openerp/addons/base/i18n/hr.po +++ b/openerp/addons/base/i18n/hr.po @@ -3784,7 +3784,7 @@ msgstr "Provjera Ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PDV" #. module: base @@ -10050,7 +10050,7 @@ msgstr "Tjedni" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "PDV " #. module: base diff --git a/openerp/addons/base/i18n/hu.po b/openerp/addons/base/i18n/hu.po index d98ee515473..94525dfaff2 100644 --- a/openerp/addons/base/i18n/hu.po +++ b/openerp/addons/base/i18n/hu.po @@ -3744,7 +3744,7 @@ msgstr "EAN ellenőrzés" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Közösségi/nemzetközi adószám" #. module: base @@ -10063,7 +10063,7 @@ msgstr "Hetek" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/hy.po b/openerp/addons/base/i18n/hy.po index 2c5ed383c32..8d3072b598f 100644 --- a/openerp/addons/base/i18n/hy.po +++ b/openerp/addons/base/i18n/hy.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/id.po b/openerp/addons/base/i18n/id.po index de2d31683ee..f71c65e63e8 100644 --- a/openerp/addons/base/i18n/id.po +++ b/openerp/addons/base/i18n/id.po @@ -3638,7 +3638,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9849,7 +9849,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/is.po b/openerp/addons/base/i18n/is.po index bab1f557502..d84c81ee518 100644 --- a/openerp/addons/base/i18n/is.po +++ b/openerp/addons/base/i18n/is.po @@ -3668,7 +3668,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "VSK" #. module: base @@ -9880,7 +9880,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/it.po b/openerp/addons/base/i18n/it.po index e1f369680a2..8b33bb7a1e7 100644 --- a/openerp/addons/base/i18n/it.po +++ b/openerp/addons/base/i18n/it.po @@ -3807,7 +3807,7 @@ msgstr "Verifica EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Partita IVA" #. module: base @@ -10132,7 +10132,7 @@ msgstr "Settimane" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ja.po b/openerp/addons/base/i18n/ja.po index 35382f62daa..a3fe9843e4e 100644 --- a/openerp/addons/base/i18n/ja.po +++ b/openerp/addons/base/i18n/ja.po @@ -4131,7 +4131,7 @@ msgstr "EANチェック" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "VAT(Value Added Tax)" #. module: base @@ -11571,7 +11571,7 @@ msgstr "週" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ka.po b/openerp/addons/base/i18n/ka.po index a7a4c233c3c..9edba583232 100644 --- a/openerp/addons/base/i18n/ka.po +++ b/openerp/addons/base/i18n/ka.po @@ -4267,7 +4267,7 @@ msgstr "EAN-ის შემოწმება" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "დღგ" #. module: base @@ -11688,7 +11688,7 @@ msgstr "კვირეები" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "დღგ: " #. module: base diff --git a/openerp/addons/base/i18n/kk.po b/openerp/addons/base/i18n/kk.po index 09a985213b8..bffba2e7eb6 100644 --- a/openerp/addons/base/i18n/kk.po +++ b/openerp/addons/base/i18n/kk.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "апта" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ko.po b/openerp/addons/base/i18n/ko.po index b66cb25933e..95a91eb27cb 100644 --- a/openerp/addons/base/i18n/ko.po +++ b/openerp/addons/base/i18n/ko.po @@ -3681,7 +3681,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "부가세" #. module: base @@ -9906,7 +9906,7 @@ msgstr "주" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/lt.po b/openerp/addons/base/i18n/lt.po index eb59a102506..fd31f08f45d 100644 --- a/openerp/addons/base/i18n/lt.po +++ b/openerp/addons/base/i18n/lt.po @@ -3646,7 +3646,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PVM" #. module: base @@ -9877,7 +9877,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/lt_LT.po b/openerp/addons/base/i18n/lt_LT.po index 13846af119e..be05dc522d1 100644 --- a/openerp/addons/base/i18n/lt_LT.po +++ b/openerp/addons/base/i18n/lt_LT.po @@ -4533,7 +4533,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/lv.po b/openerp/addons/base/i18n/lv.po index 0a83e177d06..ddffb721e47 100644 --- a/openerp/addons/base/i18n/lv.po +++ b/openerp/addons/base/i18n/lv.po @@ -3678,7 +3678,7 @@ msgstr "EAN pārbaude" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PVN" #. module: base @@ -9919,7 +9919,7 @@ msgstr "Nedēļas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/mk.po b/openerp/addons/base/i18n/mk.po index 3414ae7063c..c83e232dc72 100644 --- a/openerp/addons/base/i18n/mk.po +++ b/openerp/addons/base/i18n/mk.po @@ -3645,7 +3645,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9856,7 +9856,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/mn.po b/openerp/addons/base/i18n/mn.po index c80aa9afb14..3dfce8aabd9 100644 --- a/openerp/addons/base/i18n/mn.po +++ b/openerp/addons/base/i18n/mn.po @@ -4166,7 +4166,7 @@ msgstr "Зур.код чеклэх" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "НӨАТ" #. module: base @@ -11762,7 +11762,7 @@ msgstr "7 хоног" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "НӨАТ: " #. module: base diff --git a/openerp/addons/base/i18n/nb.po b/openerp/addons/base/i18n/nb.po index 1542c677529..fc9ab46d995 100644 --- a/openerp/addons/base/i18n/nb.po +++ b/openerp/addons/base/i18n/nb.po @@ -3686,7 +3686,7 @@ msgstr "Ean sjekk" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "MVA" #. module: base @@ -9926,7 +9926,7 @@ msgstr "Uker" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/nl.po b/openerp/addons/base/i18n/nl.po index 45560f7e363..ba5b8b3cd07 100644 --- a/openerp/addons/base/i18n/nl.po +++ b/openerp/addons/base/i18n/nl.po @@ -3863,7 +3863,7 @@ msgstr "Ean controle" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "BTW" #. module: base @@ -10292,7 +10292,7 @@ msgstr "Weken" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "BTW: " #. module: base diff --git a/openerp/addons/base/i18n/nl_BE.po b/openerp/addons/base/i18n/nl_BE.po index cf2cc84f2fd..d7f03b217f4 100644 --- a/openerp/addons/base/i18n/nl_BE.po +++ b/openerp/addons/base/i18n/nl_BE.po @@ -3649,7 +3649,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9860,7 +9860,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/nl_NL.po b/openerp/addons/base/i18n/nl_NL.po index bfb371faf05..267b058bfef 100644 --- a/openerp/addons/base/i18n/nl_NL.po +++ b/openerp/addons/base/i18n/nl_NL.po @@ -4711,7 +4711,7 @@ msgstr "html" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "BTW" #. module: base diff --git a/openerp/addons/base/i18n/pl.po b/openerp/addons/base/i18n/pl.po index b0e489d3b03..a58a4b07acc 100644 --- a/openerp/addons/base/i18n/pl.po +++ b/openerp/addons/base/i18n/pl.po @@ -3730,7 +3730,7 @@ msgstr "Sprawdzanie EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "NIP" #. module: base @@ -10025,7 +10025,7 @@ msgstr "Tygodni" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "NIP: " #. module: base diff --git a/openerp/addons/base/i18n/pt.po b/openerp/addons/base/i18n/pt.po index b60b9b98d76..ef27a385d12 100644 --- a/openerp/addons/base/i18n/pt.po +++ b/openerp/addons/base/i18n/pt.po @@ -3959,7 +3959,7 @@ msgstr "Verificar EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "IVA" #. module: base @@ -10340,7 +10340,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "IVA: " #. module: base diff --git a/openerp/addons/base/i18n/pt_BR.po b/openerp/addons/base/i18n/pt_BR.po index 97cbcce0eb6..01db31d7ebe 100644 --- a/openerp/addons/base/i18n/pt_BR.po +++ b/openerp/addons/base/i18n/pt_BR.po @@ -4164,7 +4164,7 @@ msgstr "Verificar EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Imposto" #. module: base @@ -10849,8 +10849,8 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " -msgstr "VAT: " +msgid "TIN: " +msgstr "TIN: " #. module: base #: model:res.country,name:base.af diff --git a/openerp/addons/base/i18n/ro.po b/openerp/addons/base/i18n/ro.po index f079b8bd10a..aa7d5de6a86 100644 --- a/openerp/addons/base/i18n/ro.po +++ b/openerp/addons/base/i18n/ro.po @@ -4363,7 +4363,7 @@ msgstr "Verificati codul EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "TVA" #. module: base @@ -12351,7 +12351,7 @@ msgstr "Saptamani" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "TVA: " #. module: base diff --git a/openerp/addons/base/i18n/ru.po b/openerp/addons/base/i18n/ru.po index c3ba2f63acd..d879ea9fefc 100644 --- a/openerp/addons/base/i18n/ru.po +++ b/openerp/addons/base/i18n/ru.po @@ -3811,7 +3811,7 @@ msgstr "Проверка кода Ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ИНН" #. module: base @@ -10154,7 +10154,7 @@ msgstr "Недели" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sk.po b/openerp/addons/base/i18n/sk.po index 94ee24e819d..d1da2e46b6d 100644 --- a/openerp/addons/base/i18n/sk.po +++ b/openerp/addons/base/i18n/sk.po @@ -3712,7 +3712,7 @@ msgstr "Ean kontrola" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "DPH" #. module: base @@ -9991,7 +9991,7 @@ msgstr "Týždne" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sl.po b/openerp/addons/base/i18n/sl.po index f9eeb1456c2..8a800c2d8ea 100644 --- a/openerp/addons/base/i18n/sl.po +++ b/openerp/addons/base/i18n/sl.po @@ -3741,7 +3741,7 @@ msgstr "Preveri ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "DDV" #. module: base @@ -10047,7 +10047,7 @@ msgstr "Tedni" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sq.po b/openerp/addons/base/i18n/sq.po index b1f0478ed8a..735a237fbed 100644 --- a/openerp/addons/base/i18n/sq.po +++ b/openerp/addons/base/i18n/sq.po @@ -3633,7 +3633,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9844,7 +9844,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sr.po b/openerp/addons/base/i18n/sr.po index e8c74060cc3..a1d444c03b0 100644 --- a/openerp/addons/base/i18n/sr.po +++ b/openerp/addons/base/i18n/sr.po @@ -3710,7 +3710,7 @@ msgstr "EAN provera" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PDV" #. module: base @@ -9975,7 +9975,7 @@ msgstr "Nedelje" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sr@latin.po b/openerp/addons/base/i18n/sr@latin.po index 5c187aeec8b..2632130f415 100644 --- a/openerp/addons/base/i18n/sr@latin.po +++ b/openerp/addons/base/i18n/sr@latin.po @@ -4309,7 +4309,7 @@ msgstr "EAN provera" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PDV" #. module: base @@ -11242,7 +11242,7 @@ msgstr "Nedelje" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "PDV: " #. module: base diff --git a/openerp/addons/base/i18n/sv.po b/openerp/addons/base/i18n/sv.po index 2e9ff2e0539..ba4f6334f63 100644 --- a/openerp/addons/base/i18n/sv.po +++ b/openerp/addons/base/i18n/sv.po @@ -3952,7 +3952,7 @@ msgstr "EAN kontroll" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Moms" #. module: base @@ -10426,7 +10426,7 @@ msgstr "Veckor" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "Moms: " #. module: base diff --git a/openerp/addons/base/i18n/th.po b/openerp/addons/base/i18n/th.po index df20f7a2adc..2e53f3a9734 100644 --- a/openerp/addons/base/i18n/th.po +++ b/openerp/addons/base/i18n/th.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/tlh.po b/openerp/addons/base/i18n/tlh.po index 805035cf850..58b349f8bbd 100644 --- a/openerp/addons/base/i18n/tlh.po +++ b/openerp/addons/base/i18n/tlh.po @@ -3633,7 +3633,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9844,7 +9844,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/tr.po b/openerp/addons/base/i18n/tr.po index b6670894b5c..9d54b0aed7e 100644 --- a/openerp/addons/base/i18n/tr.po +++ b/openerp/addons/base/i18n/tr.po @@ -3773,7 +3773,7 @@ msgstr "EAN kontrolü" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "KDV" #. module: base @@ -10097,7 +10097,7 @@ msgstr "Hafta" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "VNO: " #. module: base diff --git a/openerp/addons/base/i18n/uk.po b/openerp/addons/base/i18n/uk.po index 79d5db6ef59..8310cd833ce 100644 --- a/openerp/addons/base/i18n/uk.po +++ b/openerp/addons/base/i18n/uk.po @@ -3669,7 +3669,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ПДВ" #. module: base @@ -9893,7 +9893,7 @@ msgstr "Тижні" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/uk_UA.po b/openerp/addons/base/i18n/uk_UA.po index 8263fde5c5e..8a8f1d3613f 100644 --- a/openerp/addons/base/i18n/uk_UA.po +++ b/openerp/addons/base/i18n/uk_UA.po @@ -4551,7 +4551,7 @@ msgstr "html" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ПДВ" #. module: base diff --git a/openerp/addons/base/i18n/ur.po b/openerp/addons/base/i18n/ur.po index 4239bc2adf3..c48f39785d1 100644 --- a/openerp/addons/base/i18n/ur.po +++ b/openerp/addons/base/i18n/ur.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/vi.po b/openerp/addons/base/i18n/vi.po index 0255aaf2f57..51c018a9672 100644 --- a/openerp/addons/base/i18n/vi.po +++ b/openerp/addons/base/i18n/vi.po @@ -3661,7 +3661,7 @@ msgstr "Kiểm tra EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Thuế GTGT" #. module: base @@ -9878,7 +9878,7 @@ msgstr "Tuần" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/zh_CN.po b/openerp/addons/base/i18n/zh_CN.po index ee0f43d8372..3cf1f1365fb 100644 --- a/openerp/addons/base/i18n/zh_CN.po +++ b/openerp/addons/base/i18n/zh_CN.po @@ -4032,7 +4032,7 @@ msgstr "条码检查" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "增值税" #. module: base @@ -10638,7 +10638,7 @@ msgstr "周" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "增值税: " #. module: base diff --git a/openerp/addons/base/i18n/zh_HK.po b/openerp/addons/base/i18n/zh_HK.po index 96313cd3e58..216a05705bb 100644 --- a/openerp/addons/base/i18n/zh_HK.po +++ b/openerp/addons/base/i18n/zh_HK.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/zh_TW.po b/openerp/addons/base/i18n/zh_TW.po index a4804f29e56..aad1201ccfa 100644 --- a/openerp/addons/base/i18n/zh_TW.po +++ b/openerp/addons/base/i18n/zh_TW.po @@ -3639,7 +3639,7 @@ msgstr "Ean 檢查" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "增值稅" #. module: base @@ -9858,7 +9858,7 @@ msgstr "週" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base