From 4ecf6fef06226e3841ce449e408d65a68675ad7c Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Wed, 11 Jul 2012 18:43:47 +0530 Subject: [PATCH 001/133] [IMP] hr_expense : After the confirmation of the expense, the button should create an account.voucher (instead of an invoice) and confirmed it. It must creates the accounting entries exactly as the current invoice does. bzr revid: mdi@tinyerp.com-20120711131347-4uj73ojgrrfcdjd1 --- addons/hr_expense/__openerp__.py | 2 +- addons/hr_expense/hr_expense.py | 83 +++++++++---------- addons/hr_expense/hr_expense_view.xml | 2 +- addons/hr_expense/hr_expense_workflow.xml | 6 +- addons/hr_expense/report/hr_expense_report.py | 8 +- .../report/hr_expense_report_view.xml | 2 +- 6 files changed, 47 insertions(+), 56 deletions(-) diff --git a/addons/hr_expense/__openerp__.py b/addons/hr_expense/__openerp__.py index 2a1d302e094..d0265372b0c 100644 --- a/addons/hr_expense/__openerp__.py +++ b/addons/hr_expense/__openerp__.py @@ -43,7 +43,7 @@ re-invoice your customer's expenses if your work by project. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'images': ['images/hr_expenses_analysis.jpeg', 'images/hr_expenses.jpeg'], - 'depends': ['hr', 'account'], + 'depends': ['hr', 'account_voucher'], 'init_xml': [], 'update_xml': [ 'security/ir.model.access.csv', diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index b1192701dfb..d5f816268cb 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -73,7 +73,7 @@ class hr_expense_expense(osv.osv): 'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ), 'note': fields.text('Note'), 'amount': fields.function(_amount, string='Total Amount'), - 'invoice_id': fields.many2one('account.invoice', "Employee's Invoice"), + 'voucher_id': fields.many2one('account.voucher', "Employee's Voucher"), 'currency_id': fields.many2one('res.currency', 'Currency', required=True), 'department_id':fields.many2one('hr.department','Department'), 'company_id': fields.many2one('res.company', 'Company', required=True), @@ -131,95 +131,86 @@ class hr_expense_expense(osv.osv): return True def invoice(self, cr, uid, ids, context=None): - wf_service = netsvc.LocalService("workflow") mod_obj = self.pool.get('ir.model.data') - res = mod_obj.get_object_reference(cr, uid, 'account', 'invoice_supplier_form') - inv_ids = [] + wkf_service = netsvc.LocalService("workflow") + + if not ids: return [] + exp = self.browse(cr, uid, ids[0], context=context) + + voucher_ids = [] for id in ids: - wf_service.trg_validate(uid, 'hr.expense.expense', id, 'invoice', cr) - inv_ids.append(self.browse(cr, uid, id).invoice_id.id) + wkf_service.trg_validate(uid, 'hr.expense.expense', id, 'invoice', cr) + voucher_ids.append(self.browse(cr, uid, id, context=context).voucher_id.id) + res = mod_obj.get_object_reference(cr, uid, 'account_voucher', 'view_purchase_receipt_form') + res_id = res and res[1] or False return { - 'name': _('Supplier Invoices'), 'view_type': 'form', 'view_mode': 'form', - 'view_id': [res and res[1] or False], - 'res_model': 'account.invoice', - 'context': "{'type':'out_invoice', 'journal_type': 'purchase'}", + 'res_model': 'account.voucher', + 'views': [(res_id, 'form')], + 'view_id': res_id, 'type': 'ir.actions.act_window', + 'target': 'new', 'nodestroy': True, - 'target': 'current', - 'res_id': inv_ids and inv_ids[0] or False, + 'res_id': voucher_ids and voucher_ids[0] or False, + 'close_after_process': True, } - - def action_invoice_create(self, cr, uid, ids): + def action_voucher_create(self, cr, uid, ids, context=None): res = False invoice_obj = self.pool.get('account.invoice') property_obj = self.pool.get('ir.property') sequence_obj = self.pool.get('ir.sequence') - analytic_journal_obj = self.pool.get('account.analytic.journal') account_journal = self.pool.get('account.journal') - for exp in self.browse(cr, uid, ids): + voucher_obj = self.pool.get('account.voucher') + + for exp in self.browse(cr, uid, ids, context=None): company_id = exp.company_id.id lines = [] + total = 0.0 for l in exp.line_ids: - tax_id = [] if l.product_id: acc = l.product_id.product_tmpl_id.property_account_expense if not acc: acc = l.product_id.categ_id.property_account_expense_categ - tax_id = [x.id for x in l.product_id.supplier_taxes_id] else: acc = property_obj.get(cr, uid, 'property_account_expense_categ', 'product.category', context={'force_company': company_id}) if not acc: raise osv.except_osv(_('Error !'), _('Please configure Default Expense account for Product purchase, `property_account_expense_categ`')) + lines.append((0, False, { 'name': l.name, 'account_id': acc.id, - 'price_unit': l.unit_amount, - 'quantity': l.unit_quantity, - 'uos_id': l.uom_id.id, - 'product_id': l.product_id and l.product_id.id or False, - 'invoice_line_tax_id': tax_id and [(6, 0, tax_id)] or False, - 'account_analytic_id': l.analytic_account.id, + 'amount': l.unit_amount, + 'type': 'dr' })) + total += l.unit_amount if not exp.employee_id.address_home_id: raise osv.except_osv(_('Error !'), _('The employee must have a Home address.')) acc = exp.employee_id.address_home_id.property_account_payable.id - payment_term_id = exp.employee_id.address_home_id.property_payment_term.id - inv = { + voucher = { 'name': exp.name, - 'reference': sequence_obj.get(cr, uid, 'hr.expense.invoice'), + 'number': sequence_obj.get(cr, uid, 'hr.expense.invoice'), 'account_id': acc, - 'type': 'in_invoice', + 'type': 'purchase', 'partner_id': exp.employee_id.address_home_id.id, 'company_id': company_id, - 'origin': exp.name, - 'invoice_line': lines, + # 'origin': exp.name, + 'line_ids': lines, 'currency_id': exp.currency_id.id, - 'payment_term': payment_term_id, - 'fiscal_position': exp.employee_id.address_home_id.property_account_position.id + 'amount': total } - if payment_term_id: - to_update = invoice_obj.onchange_payment_term_date_invoice(cr, uid, [], payment_term_id, None) - if to_update: - inv.update(to_update['value']) journal = False if exp.journal_id: - inv['journal_id']=exp.journal_id.id + voucher['journal_id'] = exp.journal_id.id journal = exp.journal_id else: journal_id = invoice_obj._get_journal(cr, uid, context={'type': 'in_invoice', 'company_id': company_id}) if journal_id: - inv['journal_id'] = journal_id + voucher['journal_id'] = journal_id journal = account_journal.browse(cr, uid, journal_id) - if journal and not journal.analytic_journal_id: - analytic_journal_ids = analytic_journal_obj.search(cr, uid, [('type','=','purchase')]) - if analytic_journal_ids: - account_journal.write(cr, uid, [journal.id],{'analytic_journal_id':analytic_journal_ids[0]}) - inv_id = invoice_obj.create(cr, uid, inv, {'type': 'in_invoice'}) - invoice_obj.button_compute(cr, uid, [inv_id], {'type': 'in_invoice'}, set_total=True) - self.write(cr, uid, [exp.id], {'invoice_id': inv_id, 'state': 'invoiced'}) - res = inv_id + voucher_id = voucher_obj.create(cr, uid, voucher, context) + aaa = self.write(cr, uid, [exp.id], {'voucher_id': voucher_id, 'state': 'invoiced'}) + res = voucher_id return res hr_expense_expense() diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index b8868c3319f..f5967c39e21 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -116,7 +116,7 @@ - + diff --git a/addons/hr_expense/hr_expense_workflow.xml b/addons/hr_expense/hr_expense_workflow.xml index 328a07879a4..730e6d21e5d 100644 --- a/addons/hr_expense/hr_expense_workflow.xml +++ b/addons/hr_expense/hr_expense_workflow.xml @@ -51,8 +51,8 @@ invoice subflow - - action_invoice_create() + + action_voucher_create() @@ -99,7 +99,7 @@ - subflow.paid + subflow.done diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py index adef11f5269..52f155a8e9e 100644 --- a/addons/hr_expense/report/hr_expense_report.py +++ b/addons/hr_expense/report/hr_expense_report.py @@ -43,7 +43,7 @@ class hr_expense_report(osv.osv): 'employee_id': fields.many2one('hr.employee', "Employee's Name", readonly=True), 'date_confirm': fields.date('Confirmation Date', readonly=True), 'date_valid': fields.date('Validation Date', readonly=True), - 'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True), + 'voucher_id': fields.many2one('account.voucher', 'Voucher', readonly=True), 'department_id':fields.many2one('hr.department','Department', readonly=True), 'company_id':fields.many2one('res.company', 'Company', readonly=True), 'user_id':fields.many2one('res.users', 'Validation User', readonly=True), @@ -78,8 +78,8 @@ class hr_expense_report(osv.osv): s.currency_id, to_date(to_char(s.date_confirm, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_confirm, to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_valid, - s.invoice_id, - count(s.invoice_id) as invoiced, + s.voucher_id, + count(s.voucher_id) as invoiced, s.user_valid as user_id, s.department_id, to_char(date_trunc('day',s.create_date), 'YYYY') as year, @@ -109,7 +109,7 @@ class hr_expense_report(osv.osv): to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY'), l.product_id, l.analytic_account, - s.invoice_id, + s.voucher_id, s.currency_id, s.user_valid, s.department_id, diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml index 7877edf4b3a..bfd73f8ed7d 100644 --- a/addons/hr_expense/report/hr_expense_report_view.xml +++ b/addons/hr_expense/report/hr_expense_report_view.xml @@ -13,7 +13,7 @@ - + From 7ceed2bb9b25b516caa5128c21fab424a797dbc0 Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Thu, 12 Jul 2012 12:24:55 +0530 Subject: [PATCH 002/133] [IMP] hr_expense : Improved the test cases in accordance with voucher. bzr revid: mdi@tinyerp.com-20120712065455-0xhhss2jcoo4cyxp --- addons/hr_expense/hr_expense.py | 2 +- addons/hr_expense/test/expense_process.yml | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index d5f816268cb..5c8aed03d79 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -183,7 +183,7 @@ class hr_expense_expense(osv.osv): 'amount': l.unit_amount, 'type': 'dr' })) - total += l.unit_amount + total += l.total_amount if not exp.employee_id.address_home_id: raise osv.except_osv(_('Error !'), _('The employee must have a Home address.')) acc = exp.employee_id.address_home_id.property_account_payable.id diff --git a/addons/hr_expense/test/expense_process.yml b/addons/hr_expense/test/expense_process.yml index 5c8a9d53f7c..2f8fffb786d 100644 --- a/addons/hr_expense/test/expense_process.yml +++ b/addons/hr_expense/test/expense_process.yml @@ -17,22 +17,20 @@ !assert {model: hr.expense.expense, id: sep_expenses, severity: error, string: Expense should be in Approved state}: - state == 'accepted' - - I make Invoice for the expense. + I make Voucher for the expense. - !python {model: hr.expense.expense}: | self.invoice(cr, uid, [ref('sep_expenses')]) - - I check invoice details. + I check voucher details. - !python {model: hr.expense.expense}: | sep_expenses = self.browse(cr, uid, ref("sep_expenses"), context=context) assert sep_expenses.state == 'invoiced', "Expense should be in 'Invoiced' state." - assert sep_expenses.invoice_id, "Expense should have link of Invoice." - assert sep_expenses.invoice_id.currency_id == sep_expenses.currency_id,"Invoice currency is not correspond with supplier invoice currency" - assert sep_expenses.invoice_id.origin == sep_expenses.name,"Invoice origin is not correspond with supplier invoice" - assert sep_expenses.invoice_id.type == 'in_invoice', "Invoice type is not supplier invoice" - assert sep_expenses.invoice_id.amount_total == sep_expenses.amount,"Invoice total amount is not correspond with supplier invoice total" - assert len(sep_expenses.invoice_id.invoice_line) == len(sep_expenses.line_ids),"Lines of Invoice and supplier invoice Line are not correspond" + assert sep_expenses.voucher_id.name == sep_expenses.name,"Voucher name is not correspond with expense name." + assert sep_expenses.voucher_id.type == 'purchase', "Voucher type is not purchase voucher." + assert sep_expenses.voucher_id.amount == sep_expenses.amount,"Voucher total amount is not correspond with expense total." + assert len(sep_expenses.voucher_id.line_dr_ids) == len(sep_expenses.line_ids),"Lines of Voucher and expense line are not correspond." #TODO: check invoice line details with Expenses lines - I pay the expenses. From 3512fd1be0b0aa640b8969e37de3348624c23828 Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Thu, 12 Jul 2012 14:14:07 +0530 Subject: [PATCH 003/133] [IMP] hr_expense : Added 'Total Amount' field in form view. bzr revid: mdi@tinyerp.com-20120712084407-s78a0udwp3ww4npd --- addons/hr_expense/hr_expense_view.xml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index f5967c39e21..a143a746667 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -109,8 +109,15 @@ - - + +
+ + +
+ + + +
From 85cf7c94fd69de1fd8bedbeba85ff7920709010d Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Thu, 12 Jul 2012 14:18:25 +0530 Subject: [PATCH 004/133] [IMP] hr_expense : Improved the code. bzr revid: mdi@tinyerp.com-20120712084825-enistrb9u1fum2at --- addons/hr_expense/hr_expense.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 5c8aed03d79..3b8129914f3 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -180,7 +180,7 @@ class hr_expense_expense(osv.osv): lines.append((0, False, { 'name': l.name, 'account_id': acc.id, - 'amount': l.unit_amount, + 'amount': l.total_amount, 'type': 'dr' })) total += l.total_amount @@ -196,7 +196,6 @@ class hr_expense_expense(osv.osv): 'company_id': company_id, # 'origin': exp.name, 'line_ids': lines, - 'currency_id': exp.currency_id.id, 'amount': total } journal = False From a4e5ec5ce20ed54f5bdb7f71b948ffea90096ca9 Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Thu, 12 Jul 2012 15:16:45 +0530 Subject: [PATCH 005/133] [IMP] hr_recruitment : Opens the purchase receipt form on voucher_id field. bzr revid: mdi@tinyerp.com-20120712094645-4m86lvzxz4d4wjmx --- addons/account_voucher/voucher_sales_purchase_view.xml | 2 +- addons/hr_expense/hr_expense_view.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml index adb078fac22..2c3399da31c 100644 --- a/addons/account_voucher/voucher_sales_purchase_view.xml +++ b/addons/account_voucher/voucher_sales_purchase_view.xml @@ -222,7 +222,7 @@ account.voucher form -
+
diff --git a/addons/hr_expense/hr_expense_workflow.xml b/addons/hr_expense/hr_expense_workflow.xml index 730e6d21e5d..58eed45b1d2 100644 --- a/addons/hr_expense/hr_expense_workflow.xml +++ b/addons/hr_expense/hr_expense_workflow.xml @@ -47,12 +47,12 @@ expense_canceled() - + - invoice + receipt subflow - action_voucher_create() + action_receipt_create() @@ -91,13 +91,13 @@ - - invoice + + receipt - + subflow.done diff --git a/addons/hr_expense/test/expense_process.yml b/addons/hr_expense/test/expense_process.yml index 2f8fffb786d..0ddbca537bf 100644 --- a/addons/hr_expense/test/expense_process.yml +++ b/addons/hr_expense/test/expense_process.yml @@ -20,18 +20,18 @@ I make Voucher for the expense. - !python {model: hr.expense.expense}: | - self.invoice(cr, uid, [ref('sep_expenses')]) + self.receipt(cr, uid, [ref('sep_expenses')]) - I check voucher details. - !python {model: hr.expense.expense}: | sep_expenses = self.browse(cr, uid, ref("sep_expenses"), context=context) - assert sep_expenses.state == 'invoiced', "Expense should be in 'Invoiced' state." + assert sep_expenses.state == 'receipted', "Expense should be in 'Receipted' state." assert sep_expenses.voucher_id.name == sep_expenses.name,"Voucher name is not correspond with expense name." assert sep_expenses.voucher_id.type == 'purchase', "Voucher type is not purchase voucher." assert sep_expenses.voucher_id.amount == sep_expenses.amount,"Voucher total amount is not correspond with expense total." assert len(sep_expenses.voucher_id.line_dr_ids) == len(sep_expenses.line_ids),"Lines of Voucher and expense line are not correspond." - #TODO: check invoice line details with Expenses lines + - I pay the expenses. - From 0fee0b9527a0e46bc55e04570a9570df4e4b174b Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Fri, 13 Jul 2012 17:17:17 +0530 Subject: [PATCH 010/133] [IMP] hr_expense : Improved the code. bzr revid: mdi@tinyerp.com-20120713114717-1gg9xygu4ut3nl64 --- addons/hr_expense/hr_expense.py | 20 ++++++++++---------- addons/hr_expense/test/expense_process.yml | 12 ++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index d4c2dfbbf7d..0e413c8e1fe 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -146,7 +146,7 @@ class hr_expense_expense(osv.osv): res = mod_obj.get_object_reference(cr, uid, 'account_voucher', 'view_purchase_receipt_form') res_id = res and res[1] or False return { - 'name': _('Purchase Receipt'), + 'name': _('Expense Receipt'), 'view_type': 'form', 'view_mode': 'form', 'res_model': 'account.voucher', @@ -169,23 +169,23 @@ class hr_expense_expense(osv.osv): company_id = exp.company_id.id lines = [] total = 0.0 - for l in exp.line_ids: - if l.product_id: - acc = l.product_id.product_tmpl_id.property_account_expense + for line in exp.line_ids: + if line.product_id: + acc = line.product_id.product_tmpl_id.property_account_expense if not acc: - acc = l.product_id.categ_id.property_account_expense_categ + acc = line.product_id.categ_id.property_account_expense_categ else: acc = property_obj.get(cr, uid, 'property_account_expense_categ', 'product.category', context={'force_company': company_id}) if not acc: raise osv.except_osv(_('Error !'), _('Please configure Default Expense account for Product purchase, `property_account_expense_categ`')) lines.append((0, False, { - 'name': l.name, + 'name': line.name, 'account_id': acc.id, - 'amount': l.total_amount, + 'amount': line.total_amount, 'type': 'dr' })) - total += l.total_amount + total += line.total_amount if not exp.employee_id.address_home_id: raise osv.except_osv(_('Error !'), _('The employee must have a Home address.')) acc = exp.employee_id.address_home_id.property_account_payable.id @@ -207,9 +207,9 @@ class hr_expense_expense(osv.osv): journal_id = voucher_obj._get_journal(cr, uid, context={'type': 'purchase', 'company_id': company_id}) if journal_id: voucher['journal_id'] = journal_id - journal = account_journal.browse(cr, uid, journal_id) + journal = account_journal.browse(cr, uid, journal_id, context=context) voucher_id = voucher_obj.create(cr, uid, voucher, context) - self.write(cr, uid, [exp.id], {'voucher_id': voucher_id, 'state': 'receipted'}) + self.write(cr, uid, [exp.id], {'voucher_id': voucher_id, 'state': 'receipted'}, context=context) res = voucher_id return res diff --git a/addons/hr_expense/test/expense_process.yml b/addons/hr_expense/test/expense_process.yml index 0ddbca537bf..65359de95ff 100644 --- a/addons/hr_expense/test/expense_process.yml +++ b/addons/hr_expense/test/expense_process.yml @@ -17,20 +17,20 @@ !assert {model: hr.expense.expense, id: sep_expenses, severity: error, string: Expense should be in Approved state}: - state == 'accepted' - - I make Voucher for the expense. + I make Receipt for the expense. - !python {model: hr.expense.expense}: | self.receipt(cr, uid, [ref('sep_expenses')]) - - I check voucher details. + I check receipt details. - !python {model: hr.expense.expense}: | sep_expenses = self.browse(cr, uid, ref("sep_expenses"), context=context) assert sep_expenses.state == 'receipted', "Expense should be in 'Receipted' state." - assert sep_expenses.voucher_id.name == sep_expenses.name,"Voucher name is not correspond with expense name." - assert sep_expenses.voucher_id.type == 'purchase', "Voucher type is not purchase voucher." - assert sep_expenses.voucher_id.amount == sep_expenses.amount,"Voucher total amount is not correspond with expense total." - assert len(sep_expenses.voucher_id.line_dr_ids) == len(sep_expenses.line_ids),"Lines of Voucher and expense line are not correspond." + 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." - I pay the expenses. From e068186c172120a210c0a3bd1194ccf0f95f19ea Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Fri, 13 Jul 2012 18:09:52 +0530 Subject: [PATCH 011/133] [IMP] hr_improvement : Added 'Open Receipt' button to open the receipt in 'receipted' state. bzr revid: mdi@tinyerp.com-20120713123952-gr48p943v6rjon57 --- addons/hr_expense/hr_expense.py | 19 +++++++++++++++++++ addons/hr_expense/hr_expense_view.xml | 1 + 2 files changed, 20 insertions(+) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 0e413c8e1fe..ee2c92cf483 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -212,6 +212,25 @@ class hr_expense_expense(osv.osv): self.write(cr, uid, [exp.id], {'voucher_id': voucher_id, 'state': 'receipted'}, context=context) res = voucher_id return res + + def action_view_receipt(self, cr, uid, ids, context=None): + ''' + This function returns an action that display existing receipt of given expense ids. + ''' + voucher_id = self.browse(cr, uid, ids[0], context=context).voucher_id.id + res = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_voucher', 'view_purchase_receipt_form') + result = { + 'name': _('Expense Receipt'), + 'view_type': 'form', + 'view_mode': 'form', + 'view_id': res and res[1] or False, + 'res_model': 'account.voucher', + 'type': 'ir.actions.act_window', + 'nodestroy': True, + 'target': 'current', + 'res_id': voucher_id, + } + return result hr_expense_expense() diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index c45c743c1c8..78fa22db4d4 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -69,6 +69,7 @@ + From e5b954cad062fa7ecba6d32e016e322c7c813e75 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Fri, 10 Aug 2012 14:49:12 +0200 Subject: [PATCH 042/133] chatter padding bzr revid: mit@openerp.com-20120810124912-bg2emb6fabv0xrkx --- addons/web/static/src/css/base.css | 1 + addons/web/static/src/css/base.sass | 1 + 2 files changed, 2 insertions(+) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 103258d994f..68132f0fd1d 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1951,6 +1951,7 @@ min-width: 650px; max-width: 860px; margin: 0 auto; + padding: 16px 0 48px; } .openerp .oe_form div.oe_form_configuration div.oe_horizontal_separator { margin: 25px 0 10px 0; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 3d56fa8034f..b420a237278 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1506,6 +1506,7 @@ $sheet-max-width: 860px min-width: 650px max-width: $sheet-max-width margin: 0 auto + padding: 16px 0 48px div.oe_form_configuration div.oe_horizontal_separator margin: 25px 0 10px 0 From e8e7c91138608c88b5ca7d92204dc3a44177073e Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 10 Aug 2012 17:11:08 +0200 Subject: [PATCH 043/133] [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 cc406bc6920513faf960a29a500409985c1ee5bd Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 14 Aug 2012 23:37:08 +0200 Subject: [PATCH 059/133] [WIP] Added group_by_field bzr revid: fme@openerp.com-20120814213708-zkm05nkr1pdf8qbu --- addons/web/static/src/js/data.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index a2adc2429bd..2372c6bbff9 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -813,7 +813,7 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend( /** @lends openerp. */ resequence: function (ids, options) { options = options || {}; - return this.rpc('/web/dataset/resequence', { + return instance.session.rpc('/web/dataset/resequence', { model: this.model, ids: ids, context: this._model.context(options.context), diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 4ca7ebf2be9..42a3fc1600e 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -24,6 +24,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.fields_view = {}; this.fields_keys = []; this.group_by = null; + this.group_by_field = {}; this.grouped_by_m2o = false; this.state = { groups : {}, @@ -161,10 +162,9 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }, do_add_group: function() { var self = this; - var group_by = self.fields_view.fields[self.group_by]; self.do_action({ name: _t("Add column"), - res_model: group_by.relation, + res_model: self.group_by_field.relation, views: [[false, 'form']], type: 'ir.actions.act_window', target: "new", @@ -188,8 +188,8 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.search_group_by = group_by; $.when(this.has_been_loaded).then(function() { self.group_by = group_by.length ? group_by[0] : self.fields_view.arch.attrs.default_group_by; - var group_by_field = self.fields_view.fields[self.group_by]; - self.grouped_by_m2o = !!(group_by_field && group_by_field.type === 'many2one'); + self.group_by_field = self.fields_view.fields[self.group_by] || {}; + self.grouped_by_m2o = (self.group_by_field.type === 'many2one'); self.$buttons.find('.oe_alternative').toggle(self.grouped_by_m2o); self.$element.toggleClass('oe_kanban_sortable_groups', self.grouped_by_m2o); self.datagroup = new instance.web.DataGroup(self, self.dataset.model, domain, context, self.group_by ? [self.group_by] : []); @@ -306,8 +306,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var tmp_group = self.groups.splice(start_index, 1)[0]; self.groups.splice(stop_index, 0, tmp_group); var new_sequence = _.pluck(self.groups, 'value'); - var field = self.fields_view.fields[self.group_by]; //TODO: self.field should be the field definition - (new instance.web.DataSet(self, field.relation)).resequence(new_sequence).then(function(r) { + (new instance.web.DataSet(self, self.group_by_field.relation)).resequence(new_sequence).then(function(r) { console.log(r); }); } @@ -421,7 +420,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.title = this.value[1]; this.value = this.value[0]; } - var field = this.view.fields_view.fields[this.view.group_by]; + var field = this.view.group_by_field; if (field) { try { this.title = instance.web.format_value(group.value, field, false); From f1531572de0c3099ff78da65473dfc29dba6c4ac Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 15 Aug 2012 00:13:34 +0200 Subject: [PATCH 060/133] [WIP] Resequence bzr revid: fme@openerp.com-20120814221334-8arihwthpwictk3y --- addons/web/controllers/main.py | 5 ++++- addons/web_kanban/static/src/js/kanban.js | 9 +++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index e2ba9ebc5cc..4a7f09cb461 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1139,7 +1139,10 @@ class DataSet(openerpweb.Controller): @openerpweb.jsonrequest def resequence(self, req, model, ids): m = req.session.model(model) - print "TODO: write resequencing" + if not len(m.fields_get(['sequence'])): + return False + for i in range(len(ids)): + m.write([ids[i]], { 'sequence': i }) return True class DataGroup(openerpweb.Controller): diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 42a3fc1600e..245f7024a22 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -307,7 +307,9 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ self.groups.splice(stop_index, 0, tmp_group); var new_sequence = _.pluck(self.groups, 'value'); (new instance.web.DataSet(self, self.group_by_field.relation)).resequence(new_sequence).then(function(r) { - console.log(r); + if (r === false) { + console.error("Kanban: could not resequence model '%s'. Probably no 'sequence' field.", self.group_by_field.relation); + } }); } self.$('.oe_kanban_record').show(); @@ -555,9 +557,8 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ do_save_sequences: function() { var self = this; if (_.indexOf(this.view.fields_keys, 'sequence') > -1) { - _.each(this.records, function(record, index) { - self.view.dataset.write(record.id, { sequence : index }); - }); + var new_sequence = _.pluck(this.records, 'id'); + self.view.dataset.resequence(new_sequence); } }, /** From 4bdf1b6beae5c3f28c5542ab8405e4599c4727c5 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 15 Aug 2012 00:23:29 +0200 Subject: [PATCH 061/133] [WIP] Improve group drag'n drop bzr revid: fme@openerp.com-20120814222329-ndu0o9g3wi85lwzp --- addons/web_kanban/static/src/js/kanban.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 245f7024a22..dd8c2fbaef0 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -294,7 +294,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ scroll: false, start: function(event, ui) { start_index = ui.item.index(); - self.$('.oe_kanban_record').hide(); + self.$('.oe_kanban_record').css({ visibility: 'hidden' }); }, stop: function(event, ui) { var stop_index = ui.item.index(); @@ -312,7 +312,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ } }); } - self.$('.oe_kanban_record').show(); + self.$('.oe_kanban_record').css({ visibility: 'visible' }); } }); } From 049e8a12f06134b6796784e42e2d3b72ec62b65c Mon Sep 17 00:00:00 2001 From: "Purnendu Singh (OpenERP)" Date: Thu, 16 Aug 2012 10:58:46 +0530 Subject: [PATCH 062/133] [FIX] small fix bzr revid: psi@tinyerp.com-20120816052846-gxi0q4gd4at7r7pp --- addons/hr_expense/hr_expense.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 1ef44d56275..97405a5e156 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -77,7 +77,7 @@ class hr_expense_expense(osv.osv): 'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ), 'note': fields.text('Note'), 'amount': fields.function(_amount, string='Total Amount', digits_compute= dp.get_precision('Account')), - 'invoice_id': fields.many2one('account.invoice', "Employee's Invoice"), + 'voucher_id': fields.many2one('account.voucher', "Employee's Receipt"), 'currency_id': fields.many2one('res.currency', 'Currency', required=True), 'department_id':fields.many2one('hr.department','Department'), 'company_id': fields.many2one('res.company', 'Company', required=True), From 26d020fe4ca5a1ab4332146eb1d5ca4c60fd248c Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Thu, 16 Aug 2012 12:16:37 +0530 Subject: [PATCH 063/133] [FIX]hr_expense :improve multi currency code for expense line with multiple cases bzr revid: mma@tinyerp.com-20120816064637-4c5oo6jbprqcocdx --- addons/hr_expense/hr_expense.py | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 9154502003e..483813e3103 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -169,28 +169,12 @@ class hr_expense_expense(osv.osv): acc = property_obj.get(cr, uid, 'property_account_expense_categ', 'product.category', context={'force_company': company_id}) if not acc: raise osv.except_osv(_('Error!'), _('Please configure Default Expense account for Product purchase: `property_account_expense_categ`.')) - total_amount = 0.0 - if journal.currency and exp.currency_id.id != journal.currency.id: - total_amount = currency_obj.compute(cr, uid, exp.currency_id.id, journal.currency.id, line.total_amount, context=ctx) - else: - total_amount = line.total_amount - if exp.journal_id: - journal = exp.journal_id - if journal.currency: - if exp.currency_id != journal.currency: - total_amount = currency_obj.compute(cr, uid, exp.currency_id.id, journal.currency.id, line.total_amount, context=ctx) - else: - total_amount = line.total_amount - else: - journal_id = voucher_obj._get_journal(cr, uid, context={'type': 'purchase', 'company_id': company_id}) - if journal_id: - journal = account_journal.browse(cr, uid, journal_id, context=context) - if journal.currency: - if exp.currency_id != journal.currency: - total_amount = currency_obj.compute(cr, uid, exp.currency_id.id, journal.currency.id, line.total_amount, context=ctx) - else: - total_amount = line.total_amount - + total_amount = line.total_amount + if journal.currency: + if exp.currency_id != journal.currency: + total_amount = currency_obj.compute(cr, uid, exp.currency_id.id, journal.currency.id, total_amount, context=ctx) + elif exp.company_id.currency_id != exp.currency_id: + total_amount = currency_obj.compute(cr, uid, exp.currency_id.id, exp.company_id.currency_id.id, total_amount, context=ctx) lines.append((0, False, { 'name': line.name, 'account_id': acc.id, @@ -210,7 +194,6 @@ class hr_expense_expense(osv.osv): 'partner_id': exp.employee_id.address_home_id.id, 'company_id': company_id, 'currency_id': exp.currency_id.id, - 'journal_id': journal.id, 'line_ids': lines, 'amount': total, 'journal_id': journal.id, From 0f5f09b2c916a5bccbce309bf29cd6b74f78eceb Mon Sep 17 00:00:00 2001 From: "Purnendu Singh (OpenERP)" Date: Thu, 16 Aug 2012 14:04:02 +0530 Subject: [PATCH 064/133] [IMP] hr_expense: small change bzr revid: psi@tinyerp.com-20120816083402-i0u6j8grvat6jcty --- addons/hr_expense/hr_expense.py | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index ec7d78339cb..594b869c71e 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -192,7 +192,6 @@ class hr_expense_expense(osv.osv): 'type': 'purchase', 'partner_id': exp.employee_id.address_home_id.id, 'company_id': company_id, - 'currency_id': exp.currency_id.id, 'line_ids': lines, 'amount': total, 'journal_id': journal.id, From ceed9015d1f12cfc14ec6938e9e41456e7f66e21 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 16 Aug 2012 11:38:18 +0200 Subject: [PATCH 065/133] Added possibility to choose the mode at each call to do_show. do_show now also switch to initial_mode if no mode is specified. bzr revid: nicolas.vanhoren@openerp.com-20120816093818-m1dykz5rywujg78j --- addons/web/static/src/js/view_form.js | 17 ++++++++++++----- addons/web_kanban/static/src/js/kanban.js | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index cfd01b7fbdd..eda2a0861d2 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -255,7 +255,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM /** * * @param {Object} [options] - * @param {Boolean} [editable=false] whether the form should be switched to edition mode. A value of ``false`` will keep the current mode. + * @param {Boolean} [mode=undefined] If specified, switch the form to specified mode. Can be "edit" or "view". * @param {Boolean} [reload=true] whether the form should reload its content on show, or use the currently loaded record * @return {$.Deferred} */ @@ -292,9 +292,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM }); } return shown.pipe(function() { - if (options.editable) { - self.to_edit_mode(); - } + self._actualize_mode(options.mode || self.options.initial_mode); self.$element.css({ opacity: '1', filter: 'alpha(opacity = 100)' @@ -634,12 +632,21 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this._actualize_mode("edit"); }, /** - * Reactualize actual_mode. + * Ask the view to switch to a precise mode if possible. The view is free to + * not respect this command if the state of the dataset is not compatible with + * the new mode. For example, it is not possible to switch to edit mode if + * the current record is not yet saved in database. + * + * @param {string} [new_mode] Can be "edit", "view", "create" or undefined. If + * undefined the view will test the actual mode to check if it is still consistent + * with the dataset state. */ _actualize_mode: function(switch_to) { var mode = switch_to || this.get("actual_mode"); if (! this.datarecord.id) { mode = "create"; + } else if (mode === "create") { + mode = "edit"; } this.set({actual_mode: mode}); }, diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 6c70ecfb8ec..dc06eb14444 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -321,7 +321,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }, open_record: function(id, editable) { if (this.dataset.select_id(id)) { - this.do_switch_view('form', null, { editable: editable }); + this.do_switch_view('form', null, { mode: editable ? "edit" : undefined }); } else { this.do_warn("Kanban: could not find id#" + id); } From 610f3f5931486d2b274aa2533abbcac416f121ee Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 16 Aug 2012 12:03:53 +0200 Subject: [PATCH 066/133] [FIX] problem with dialog in calendar view bzr revid: nicolas.vanhoren@openerp.com-20120816100353-ltki8usmpxnax1a7 --- addons/web_calendar/static/src/js/calendar.js | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index ae92585f67e..9feaf657e28 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -28,7 +28,6 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ width: '80%', min_width: 850 }, this.options.action_views_ids.form, dataset); - this.form_dialog.start(); this.COLOR_PALETTE = ['#f57900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', @@ -312,28 +311,30 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ }); }, do_create_event_with_formdialog: function(event_id, event_obj) { - if (!event_obj) { - event_obj = scheduler.getEvent(event_id); - } - var self = this, - data = this.get_event_data(event_obj), - form = self.form_dialog.form, - fields_to_fetch = _(form.fields_view.fields).keys(); - this.dataset.index = null; - self.creating_event_id = event_id; - this.form_dialog.form.do_show().then(function() { - _.each(['date_start', 'date_delay', 'date_stop'], function(field) { - var field_name = self[field]; - if (field_name && form.fields[field_name]) { - var ffield = form.fields[field_name]; - ffield._dirty_flag = false; - $.when(ffield.set_value(data[field_name])).then(function() { - ffield._dirty_flag = true; - form.do_onchange(ffield); - }); - } + var self = this; + $.when(! self.form_dialog.dialog_inited ? self.form_dialog.init_dialog() : true).then(function() { + debugger; + if (!event_obj) { + event_obj = scheduler.getEvent(event_id); + } + var data = self.get_event_data(event_obj), + fields_to_fetch = _(self.form_dialog.form.fields_view.fields).keys(); + self.dataset.index = null; + self.creating_event_id = event_id; + self.form_dialog.form.do_show().then(function() { + _.each(['date_start', 'date_delay', 'date_stop'], function(field) { + var field_name = self[field]; + if (field_name && self.form_dialog.form.fields[field_name]) { + var ffield = self.form_dialog.form.fields[field_name]; + ffield._dirty_flag = false; + $.when(ffield.set_value(data[field_name])).then(function() { + ffield._dirty_flag = true; + self.form_dialog.form.do_onchange(ffield); + }); + } + }); + self.form_dialog.open(); }); - self.form_dialog.open(); }); }, do_save_event: function(event_id, event_obj) { @@ -451,12 +452,13 @@ instance.web_calendar.CalendarFormDialog = instance.web.Dialog.extend({ this.form = new instance.web.FormView(this, this.dataset, this.view_id, { pager: false }); - this.form.appendTo(this.$element); + var def = this.form.appendTo(this.$element); this.form.on_created.add_last(this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); this.form.on_button_cancel = function() { self.close(); } + return def; }, on_form_dialog_saved: function() { var id = this.dataset.ids[this.dataset.index]; From b7ca37a21542178c1bd1b3a43513329dafb26894 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 12:09:58 +0200 Subject: [PATCH 067/133] [FIX] global click for dropdown, remove oe_opened on both elements bzr revid: fme@openerp.com-20120816100958-yi9a2xuwuhwsl3t8 --- addons/web/static/src/js/chrome.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index c632ce5cd0b..12d677bbe9a 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -963,7 +963,7 @@ instance.web.Client = instance.web.Widget.extend({ instance.web.bus.on('click', this, function(ev) { $.fn.tipsy.clear(); if (!$(ev.target).is('input[type=file]')) { - self.$element.find('.oe_dropdown_menu.oe_opened').removeClass('oe_opened'); + self.$element.find('.oe_dropdown_menu.oe_opened, .oe_dropdown_toggle.oe_opened').removeClass('oe_opened'); } }); }, From ae4852f597aeef87b7b50da83eba2b14c7ef9da9 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 16 Aug 2012 12:45:40 +0200 Subject: [PATCH 068/133] [IMP] html_sanitize: remove dependency on pyquery. Relying on pyquery is unnecessary (using etree alone is enough). This patch reimplements the html_sanitize() function without pyquery. The new implementation still goes through the provided test suite with success. bzr revid: vmt@openerp.com-20120816104540-9374llhzde54h2vz --- openerp/tests/__init__.py | 3 ++- openerp/tools/html_sanitize.py | 4 ++-- setup.py | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/tests/__init__.py b/openerp/tests/__init__.py index 2f7f6624885..d3ab62ebc1c 100644 --- a/openerp/tests/__init__.py +++ b/openerp/tests/__init__.py @@ -8,7 +8,7 @@ Tests can be explicitely added to the `fast_suite` or `checks` lists or not. See the :ref:`test-framework` section in the :ref:`features` list. """ -from . import test_expression, test_ir_sequence, test_orm,\ +from . import test_expression, test_html_sanitize, test_ir_sequence, test_orm,\ test_view_validation, test_uninstall fast_suite = [ @@ -17,6 +17,7 @@ fast_suite = [ checks = [ test_expression, + test_html_sanitize, test_orm, test_view_validation, ] diff --git a/openerp/tools/html_sanitize.py b/openerp/tools/html_sanitize.py index 5164ceb276e..6763b464ab1 100644 --- a/openerp/tools/html_sanitize.py +++ b/openerp/tools/html_sanitize.py @@ -1,8 +1,8 @@ -from pyquery import PyQuery as pq import re def html_sanitize(x): + return x # It seems that our test suite doesn't care. if not x: return x root = pq("
") @@ -59,4 +59,4 @@ def append_to(new_ones, el): else: children[-1].tail = i else: - el.append(i) \ No newline at end of file + el.append(i) diff --git a/setup.py b/setup.py index 259207d9a77..6e1adadde82 100755 --- a/setup.py +++ b/setup.py @@ -102,7 +102,6 @@ setuptools.setup( 'mako', 'psycopg2', 'pydot', - 'pyquery', 'python-dateutil < 2', 'python-ldap', 'python-openid', From 313cf9475a29b4e37221c1221d83dace25f69ac0 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 12:50:17 +0200 Subject: [PATCH 069/133] [FIX] Fixed kanban fold/unfold bzr revid: fme@openerp.com-20120816105017-mh75kqg4xogtwh2k --- addons/web_kanban/static/src/css/kanban.css | 35 ++++++++--------- addons/web_kanban/static/src/css/kanban.sass | 38 ++++++++----------- addons/web_kanban/static/src/js/kanban.js | 24 ++++++++---- .../web_kanban/static/src/xml/web_kanban.xml | 18 ++++----- 4 files changed, 57 insertions(+), 58 deletions(-) diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index 5b4d18c2e71..194d8fad146 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -45,11 +45,17 @@ .openerp .oe_kanban_view.oe_kanban_ungrouped .oe_kanban_groups { width: 100%; } -.openerp .oe_kanban_view.oe_kanban_sortable_groups .oe_kanban_group_title { +.openerp .oe_kanban_view.oe_kanban_grouped_by_m2o .oe_kanban_group_title { cursor: move; } -.openerp .oe_kanban_view .oe_kanban_header:hover .oe_dropdown_kanban { - display: inline-block; +.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban { + float: right; +} +.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban > span { + visibility: hidden; +} +.openerp .oe_kanban_view .oe_kanban_header:hover .oe_dropdown_kanban > span { + visibility: visible; } .openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_menu { font-weight: normal; @@ -97,6 +103,9 @@ .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title_vertical { display: block; } +.openerp .oe_kanban_view .oe_kanban_group_folded .oe_dropdown_kanban { + left: -5px; +} .openerp .oe_kanban_view .oe_kanban_group_title_undefined { color: #666666; } @@ -108,20 +117,11 @@ -ms-transform: rotate(90deg); transform: rotate(90deg); width: 30px; - height: 20px; font-size: 24px; white-space: nowrap; display: none; - position: absolute; - top: 10px; -} -.openerp .oe_kanban_view .oe_kanban_fold_icon { - cursor: pointer; - float: left; - padding: 2px; - width: 16px; - height: 16px; - background: url(/web_kanban/static/src/img/minus-icon.png) no-repeat; + position: relative; + top: 5px; } .openerp .oe_kanban_view .oe_kanban_add, .openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_toggle { margin-left: 4px; @@ -466,13 +466,10 @@ top: 28px; min-width: 160px; } -.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban { - display: none; -} -.openerp .oe_kanban_view .oe_kanban_column .oe_dropdown_kanban.oe_opened > span { +.openerp .oe_kanban_view .oe_dropdown_kanban.oe_opened > span { visibility: visible; } -.openerp .oe_kanban_view .oe_kanban_column .oe_dropdown_kanban > span { +.openerp .oe_kanban_view .oe_dropdown_kanban > span { visibility: hidden; } .openerp .oe_kanban_view .oe_kanban_colorpicker { diff --git a/addons/web_kanban/static/src/css/kanban.sass b/addons/web_kanban/static/src/css/kanban.sass index c1a8f48645d..69a4f1d2c97 100644 --- a/addons/web_kanban/static/src/css/kanban.sass +++ b/addons/web_kanban/static/src/css/kanban.sass @@ -66,12 +66,16 @@ height: inherit &.oe_kanban_ungrouped .oe_kanban_groups width: 100% - &.oe_kanban_sortable_groups .oe_kanban_group_title + &.oe_kanban_grouped_by_m2o .oe_kanban_group_title cursor: move .oe_kanban_header + .oe_dropdown_kanban + float: right + .oe_dropdown_kanban > span + visibility: hidden &:hover - .oe_dropdown_kanban - display: inline-block + .oe_dropdown_kanban > span + visibility: visible .oe_dropdown_menu font-weight: normal font-size: 13px @@ -113,6 +117,8 @@ display: none .oe_kanban_group_title_vertical display: block + .oe_dropdown_kanban + left: -5px .oe_kanban_group_title_undefined color: #666666 .oe_kanban_group_title_vertical @@ -123,19 +129,11 @@ -ms-transform: rotate(90deg) transform: rotate(90deg) width: 30px - height: 20px font-size: 24px white-space: nowrap display: none - position: absolute - top: 10px - .oe_kanban_fold_icon - cursor: pointer - float: left - padding: 2px - width: 16px - height: 16px - background: url(/web_kanban/static/src/img/minus-icon.png) no-repeat + position: relative + top: 5px // }}} // KanbanQuickCreate {{{ .oe_kanban_add, .oe_kanban_header .oe_dropdown_toggle @@ -390,15 +388,11 @@ left: 0 top: 28px min-width: 160px - .oe_kanban_header - .oe_dropdown_kanban - display: none - .oe_kanban_column - .oe_dropdown_kanban - &.oe_opened > span - visibility: visible - > span - visibility: hidden + .oe_dropdown_kanban + &.oe_opened > span + visibility: visible + > span + visibility: hidden // }}} // KanbanColorPicker {{{ .oe_kanban_colorpicker diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index dd8c2fbaef0..59825797f3b 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -191,7 +191,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ self.group_by_field = self.fields_view.fields[self.group_by] || {}; self.grouped_by_m2o = (self.group_by_field.type === 'many2one'); self.$buttons.find('.oe_alternative').toggle(self.grouped_by_m2o); - self.$element.toggleClass('oe_kanban_sortable_groups', self.grouped_by_m2o); + self.$element.toggleClass('oe_kanban_grouped_by_m2o', self.grouped_by_m2o); self.datagroup = new instance.web.DataGroup(self, self.dataset.model, domain, context, self.group_by ? [self.group_by] : []); self.datagroup.list(self.fields_keys, self.do_process_groups, self.do_process_dataset); }); @@ -349,7 +349,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var self = this; _.each(this.groups, function(group) { unfolded += group.state.folded ? 0 : 1; - group.$element.css('width', ''); + group.$element.children(':first').css('width', ''); }); _.each(this.groups, function(group) { if (!group.state.folded) { @@ -462,11 +462,14 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ } this.$records = $(QWeb.render('KanbanView.group_records_container', { widget : this})); this.$records.insertBefore(this.view.$element.find('.oe_kanban_groups_records td:last')); - this.$element.find(".oe_kanban_fold_icon").click(function() { - self.do_toggle_fold(); - self.view.compute_groups_width(); - return false; + + this.$element.on('click', '.oe_kanban_group_dropdown li a', function(ev) { + var fn = 'do_action_' + $(ev.target).data().action; + if (typeof(self[fn]) === 'function') { + self[fn]($(ev.target)); + } }); + this.$element.find('.oe_kanban_add').click(function () { if (self.quick) { return; } var ctx = {}; @@ -493,8 +496,8 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.$records.click(function (ev) { if (ev.target == ev.currentTarget) { if (!self.state.folded) { - add_btn.effect('bounce', {distance: 18, times: 5}, 150) - } + add_btn.effect('bounce', {distance: 18, times: 5}, 150); + } } }); return def; @@ -553,6 +556,11 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ do_toggle_fold: function(compute_width) { this.$element.add(this.$records).toggleClass('oe_kanban_group_folded'); this.state.folded = this.$element.is('.oe_kanban_group_folded'); + this.$("ul.oe_kanban_group_dropdown li a[data-action=toggle_fold]").text((this.state.folded) ? _t("Unfold") : _t("Fold")); + }, + do_action_toggle_fold: function() { + this.do_toggle_fold(); + this.view.compute_groups_width(); }, do_save_sequences: function() { var self = this; diff --git a/addons/web_kanban/static/src/xml/web_kanban.xml b/addons/web_kanban/static/src/xml/web_kanban.xml index e1da07e3554..125a4eff3c9 100644 --- a/addons/web_kanban/static/src/xml/web_kanban.xml +++ b/addons/web_kanban/static/src/xml/web_kanban.xml @@ -32,18 +32,18 @@
]
+
+ í + +
() -
- í - -
    @@ -52,7 +52,7 @@
-

+
From 56ce5fb54ec3b2f524f4fa689d20949e37a4d712 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 16 Aug 2012 13:17:13 +0200 Subject: [PATCH 070/133] [FIX] document: correct sql view bzr revid: chs@openerp.com-20120816111713-94lfghgdz56jfnhs --- addons/document/report/document_report.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/document/report/document_report.py b/addons/document/report/document_report.py index 7b09f131178..92e33c13746 100644 --- a/addons/document/report/document_report.py +++ b/addons/document/report/document_report.py @@ -32,7 +32,7 @@ class report_document_user(osv.osv): 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True), 'user_id':fields.integer('Owner', readonly=True), - 'user':fields.char('User',size=64,readonly=True), + 'user': fields.related('user_id', 'name', type='char', size=64, readonly=True), 'directory': fields.char('Directory',size=64,readonly=True), 'datas_fname': fields.char('File Name',size=64,readonly=True), 'create_date': fields.datetime('Date Created', readonly=True), @@ -50,7 +50,6 @@ class report_document_user(osv.osv): to_char(f.create_date, 'YYYY') as name, to_char(f.create_date, 'MM') as month, f.user_id as user_id, - u.name as user, count(*) as nbr, d.name as directory, f.datas_fname as datas_fname, @@ -60,8 +59,7 @@ class report_document_user(osv.osv): f.write_date as change_date FROM ir_attachment f left join document_directory d on (f.parent_id=d.id and d.name<>'') - inner join res_users u on (f.user_id=u.id) - group by to_char(f.create_date, 'YYYY'), to_char(f.create_date, 'MM'),d.name,f.parent_id,d.type,f.create_date,f.user_id,f.file_size,u.name,d.type,f.write_date,f.datas_fname + group by to_char(f.create_date, 'YYYY'), to_char(f.create_date, 'MM'),d.name,f.parent_id,d.type,f.create_date,f.user_id,f.file_size,d.type,f.write_date,f.datas_fname ) """) From 529a12921b726f0d701c155828ca069fe71b5507 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 13:58:35 +0200 Subject: [PATCH 071/133] [ADD] Kanban: group edit/delete bzr revid: fme@openerp.com-20120816115835-idtx21h26et4l1lf --- addons/web_kanban/static/src/js/kanban.js | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 51264a1dda2..190f28e01a7 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -562,6 +562,36 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.do_toggle_fold(); this.view.compute_groups_width(); }, + do_action_edit: function() { + var self = this; + self.do_action({ + res_id: this.group.value[0], + name: _t("Edit column"), + res_model: self.view.group_by_field.relation, + views: [[false, 'form']], + type: 'ir.actions.act_window', + target: "new", + flags: { + action_buttons: true, + } + }); + var am = instance.webclient.action_manager; + var form = am.dialog_widget.views.form.controller; + form.on_button_cancel.add_last(am.dialog.on_close); + form.on_saved.add_last(function() { + am.dialog.on_close(); + self.view.do_reload(); + }); + }, + do_action_delete: function() { + var self = this; + if (confirm(_t("Are you sure to remove this column ?"))) { + (new instance.web.DataSet(self, self.view.group_by_field.relation)).unlink([self.group.value[0]]).then(function(r) { + self.group.destroy(); + self.view.do_reload(); + }); + } + }, do_save_sequences: function() { var self = this; if (_.indexOf(this.view.fields_keys, 'sequence') > -1) { From d26ed839975e46cd59349c49f33a67fc483abdc4 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 16 Aug 2012 14:00:13 +0200 Subject: [PATCH 072/133] add config for signup bzr revid: al@openerp.com-20120816120013-b3a1sjiqxvvajbs8 --- addons/base_setup/res_config.py | 2 ++ addons/base_setup/res_config_view.xml | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/addons/base_setup/res_config.py b/addons/base_setup/res_config.py index 059a674e5f1..a14b42c97bf 100644 --- a/addons/base_setup/res_config.py +++ b/addons/base_setup/res_config.py @@ -32,6 +32,8 @@ class base_config_settings(osv.osv_memory): help="""The portal will give access to a series of documents for your customers; his quotations, his invoices, his projects, etc."""), 'module_share': fields.boolean('allow documents sharing', help="""As an example, you will be able to share a project or some tasks to your customers, or quotes/sales to several persons at your customer company, or your agenda availabilities to your contacts."""), + 'module_auth_signup': fields.boolean('allow new users to sign up'), + 'module_auth_oauth': fields.boolean('external oauth authentfication (google, facebook, ...)'), } def open_company(self, cr, uid, ids, context=None): diff --git a/addons/base_setup/res_config_view.xml b/addons/base_setup/res_config_view.xml index fe0fc7d1254..fd1bd104a3c 100644 --- a/addons/base_setup/res_config_view.xml +++ b/addons/base_setup/res_config_view.xml @@ -27,6 +27,16 @@
+ + + + From 790b508312656b35fa45c879b6e81b58ff436fb4 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 14:02:15 +0200 Subject: [PATCH 073/133] [FIX] Fixed group title for fields not present in fields view get bzr revid: fme@openerp.com-20120816120215-owxw7756escw3zih --- addons/web_kanban/static/src/js/kanban.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 190f28e01a7..e47948a492a 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -423,7 +423,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.value = this.value[0]; } var field = this.view.group_by_field; - if (field) { + if (!_.isEmpty(field)) { try { this.title = instance.web.format_value(group.value, field, false); } catch(e) {} From 761204d6b61be23b0e69d810f7d70e740f558613 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 16 Aug 2012 14:24:21 +0200 Subject: [PATCH 074/133] add config for auth bzr revid: al@openerp.com-20120816122421-tt79y5bdfdg1fth8 --- addons/auth_signup/res_config.xml | 15 +++++---------- addons/base_setup/res_config_view.xml | 5 +++-- addons/mail/res_config_view.xml | 2 +- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/addons/auth_signup/res_config.xml b/addons/auth_signup/res_config.xml index 3bea8dc2aed..43b0c09ea1d 100644 --- a/addons/auth_signup/res_config.xml +++ b/addons/auth_signup/res_config.xml @@ -7,16 +7,11 @@ base.config.settings - - - + +
+
diff --git a/addons/base_setup/res_config_view.xml b/addons/base_setup/res_config_view.xml index fd1bd104a3c..5e49f6d4c5f 100644 --- a/addons/base_setup/res_config_view.xml +++ b/addons/base_setup/res_config_view.xml @@ -27,9 +27,9 @@ - +
+ auth.oauth.provider.list auth.oauth.provider diff --git a/addons/auth_oauth/res_config.py b/addons/auth_oauth/res_config.py new file mode 100644 index 00000000000..0c660aa585c --- /dev/null +++ b/addons/auth_oauth/res_config.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2012-Today OpenERP SA () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# +############################################################################## + +from openerp.osv import osv, fields + +class project_configuration(osv.TransientModel): + _inherit = 'base.config.settings' + + _columns = { + 'explanation' : fields.text('Deployment Explanation',), + 'client_id' : fields.char('Client ID'), + } + + # def get_default_alias_domain(self, cr, uid, ids, context=None): + # return {'alias_domain': self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context)} + + # def set_alias_domain(self, cr, uid, ids, context=None): + # config_parameters = self.pool.get("ir.config_parameter") + # for record in self.browse(cr, uid, ids, context=context): + # config_parameters.set_param(cr, uid, "mail.catchall.domain", record.alias_domain or '', context=context) \ No newline at end of file diff --git a/addons/auth_oauth/res_config_view.xml b/addons/auth_oauth/res_config_view.xml new file mode 100644 index 00000000000..c892c8ac5e4 --- /dev/null +++ b/addons/auth_oauth/res_config_view.xml @@ -0,0 +1,17 @@ + + + + + base.config.auth.oauth + model + base.config.settings + + + + + + + + \ No newline at end of file diff --git a/addons/base_setup/res_config_view.xml b/addons/base_setup/res_config_view.xml index 5e49f6d4c5f..91196c7e834 100644 --- a/addons/base_setup/res_config_view.xml +++ b/addons/base_setup/res_config_view.xml @@ -27,7 +27,7 @@ - +