diff options
| author | Thibault Delavallée <tde@openerp.com> | 2012-09-20 16:49:00 +0200 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2012-09-20 16:49:00 +0200 |
| commit | 84fbc3b7da2a9ac2c3e6faed911eebdcb3585980 (patch) | |
| tree | 2c407a3bf81f348f0ebaadb6160c72599d7c2251 /addons | |
| parent | fda33df8a608fd5063ae45b7f9db73c9e1c65013 (diff) | |
| parent | 5959a1f7a987b1349bc005df63570e530e0833ba (diff) | |
[MERGE] Merged with addons/trunk.
bzr revid: tde@openerp.com-20120920144900-isobpji9066sftj1
Diffstat (limited to 'addons')
69 files changed, 459 insertions, 1180 deletions
diff --git a/addons/account/account.py b/addons/account/account.py index b01da6b1425..d145f0308b0 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -836,6 +836,8 @@ class account_journal(osv.osv): @return: Returns a list of tupples containing id, name """ + if not ids: + return [] if isinstance(ids, (int, long)): ids = [ids] result = self.browse(cr, user, ids, context=context) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index a145e5c06be..bd7e9e9be9f 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1103,10 +1103,10 @@ class account_invoice(osv.osv): if not ids: return [] types = { - 'out_invoice': 'CI: ', - 'in_invoice': 'SI: ', - 'out_refund': 'OR: ', - 'in_refund': 'SR: ', + 'out_invoice': 'Invoice ', + 'in_invoice': 'Sup. Invoice ', + 'out_refund': 'Refund ', + 'in_refund': 'Supplier Refund ', } return [(r['id'], (r['number']) or types[r['type']] + (r['name'] or '')) for r in self.read(cr, uid, ids, ['type', 'number', 'name'], context, load='_classic_write')] diff --git a/addons/account/account_menuitem.xml b/addons/account/account_menuitem.xml index 480d5ec76a6..a2fbf11963b 100644 --- a/addons/account/account_menuitem.xml +++ b/addons/account/account_menuitem.xml @@ -30,7 +30,7 @@ <menuitem id="menu_analytic" parent="menu_analytic_accounting" name="Accounts" groups="analytic.group_analytic_accounting"/> <menuitem id="menu_journals" sequence="15" name="Journals" parent="menu_finance_configuration" groups="group_account_manager"/> <menuitem id="menu_configuration_misc" name="Miscellaneous" parent="menu_finance_configuration" sequence="55"/> - <menuitem id="base.menu_action_currency_form" parent="menu_configuration_misc" sequence="20" groups="base.group_no_one"/> + <menuitem id="base.menu_action_currency_form" name="Currencies" parent="menu_configuration_misc" sequence="20" groups="base.group_no_one"/> <menuitem id="menu_finance_generic_reporting" name="Generic Reporting" parent="menu_finance_reports" sequence="100"/> <menuitem id="menu_finance_entries" name="Journal Entries" parent="menu_finance" sequence="5" groups="group_account_user,group_account_manager"/> <menuitem id="menu_account_reports" name="Financial Reports" parent="menu_finance_configuration" sequence="30" /> diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 18ab1a779a3..69b1bef08e6 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -215,8 +215,10 @@ class account_move_line(osv.osv): def _default_get(self, cr, uid, fields, context=None): if context is None: context = {} - if not context.get('journal_id', False) and context.get('search_default_journal_id', False): + if not context.get('journal_id', False): context['journal_id'] = context.get('search_default_journal_id') + if not context.get('period_id', False): + context['period_id'] = context.get('search_default_period_id') account_obj = self.pool.get('account.account') period_obj = self.pool.get('account.period') journal_obj = self.pool.get('account.journal') @@ -226,6 +228,9 @@ class account_move_line(osv.osv): partner_obj = self.pool.get('res.partner') currency_obj = self.pool.get('res.currency') context = self.convert_to_period(cr, uid, context) + #pass the right context when search_defaul_journal_id + if context.get('search_default_journal_id',False): + context['journal_id'] = context.get('search_default_journal_id') # Compute simple values data = super(account_move_line, self).default_get(cr, uid, fields, context=context) # Starts: Manual entry from account.move form @@ -926,6 +931,8 @@ class account_move_line(osv.osv): return res if (not context.get('journal_id', False)) or (not context.get('period_id', False)): return False + if context.get('search_default_journal_id', False): + context['journal_id'] = context.get('search_default_journal_id') cr.execute('SELECT code FROM account_journal WHERE id = %s', (context['journal_id'], )) j = cr.fetchone()[0] or '' cr.execute('SELECT code FROM account_period WHERE id = %s', (context['period_id'], )) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 20aa198c63f..874adb417d3 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -102,6 +102,7 @@ <field name="arch" type="xml"> <form string="Account Period" version="7.0"> <header> + <button string="Close Period" name="%(account.action_account_period_close)d" type="action" class="oe_highlight" states="draft"/> <button name="action_draft" states="done" string="Set to Draft" type="object" groups="account.group_account_manager"/> <field name="state" widget="statusbar" nolabel="1"/> </header> @@ -1718,8 +1719,10 @@ <field name="model">account.payment.term.line</field> <field name="arch" type="xml"> <form string="Payment Term" version="7.0"> - <field name="name"/> - <field name="sequence"/> + <group> + <field name="name"/> + <field name="sequence"/> + </group> <group> <group string="Amount Computation"> <field name="value"/> @@ -1767,12 +1770,11 @@ <field name="model">account.payment.term</field> <field name="arch" type="xml"> <form string="Payment Term" version="7.0"> - <group> + <group col="4"> <field name="name"/> <field name="active"/> </group> - <separator string="Description on Invoices"/> - <field name="note"/> + <field name="note" placeholder="Note fo the invoice..."/> <separator string="Computation"/> <field name="line_ids"/> </form> diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index d83571b314e..7ac1efd4f9f 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -12,7 +12,7 @@ <field name="active"/> <field name="company_id" widget="selection" groups="base.group_multi_company"/> </group> - <separator string="Mapping"/> + <separator string="Taxes Mapping"/> <field name="tax_ids" widget="one2many_list"> <tree string="Tax Mapping" editable="bottom"> <field name="tax_src_id" domain="[('parent_id','=',False)]"/> @@ -23,6 +23,7 @@ <field name="tax_dest_id" domain="[('parent_id','=',False)]"/> </form> </field> + <separator string="Accounts Mapping"/> <field name="account_ids" widget="one2many_list"> <tree string="Account Mapping" editable="bottom"> <field name="account_src_id"/> @@ -93,8 +94,10 @@ </group> <field name="bank_ids"> <form string="Bank account" version="7.0"> - <field name="state"/> - <field name="acc_number"/> + <group col="4"> + <field name="state"/> + <field name="acc_number"/> + </group> <group> <group name="owner" string="Bank Account Owner"> <field name="partner_id" on_change="onchange_partner_id(partner_id)"/> diff --git a/addons/account/wizard/account_move_journal.py b/addons/account/wizard/account_move_journal.py index d87e4d04a0c..da6a142972b 100644 --- a/addons/account/wizard/account_move_journal.py +++ b/addons/account/wizard/account_move_journal.py @@ -92,7 +92,7 @@ class account_move_journal(osv.osv_memory): journal = False if journal_id: - journal = journal_pool.read(cr, uid, journal_id, ['name'], context=context).name + journal = journal_pool.read(cr, uid, journal_id, ['name'], context=context).get('name',False) journal_string = _("Journal: %s") % tools.ustr(journal) else: journal_string = _("Journal: All") diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py index 40b67289fb1..3e8c579b729 100644 --- a/addons/account_analytic_analysis/__openerp__.py +++ b/addons/account_analytic_analysis/__openerp__.py @@ -36,6 +36,7 @@ Adds menu to show relevant information to each manager.You can also view the rep 'depends': ['hr_timesheet_invoice', 'sale'], #although sale is technically not required to install this module, all menuitems are located under 'Sales' application 'data': [ 'security/ir.model.access.csv', + 'security/account_analytic_analysis_security.xml', 'account_analytic_analysis_view.xml', 'account_analytic_analysis_menu.xml', 'account_analytic_analysis_cron.xml', diff --git a/addons/account_analytic_analysis/security/account_analytic_analysis_security.xml b/addons/account_analytic_analysis/security/account_analytic_analysis_security.xml new file mode 100644 index 00000000000..8bcc7f2d7f0 --- /dev/null +++ b/addons/account_analytic_analysis/security/account_analytic_analysis_security.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record model="res.users" id="base.user_root"> + <field eval="[(4,ref('sale.group_analytic_accounting'))]" name="groups_id"/> + </record> + + </data> +</openerp>
\ No newline at end of file diff --git a/addons/account_asset/account_asset_view.xml b/addons/account_asset/account_asset_view.xml index bb0222d5e4f..3fab306863c 100644 --- a/addons/account_asset/account_asset_view.xml +++ b/addons/account_asset/account_asset_view.xml @@ -129,7 +129,7 @@ </group> </page> <page string="Depreciation Board"> - <field name="depreciation_line_ids" mode="tree,graph"> + <field name="depreciation_line_ids" mode="tree"> <tree string="Depreciation Lines" colors="blue:(move_check == False);black:(move_check == True)"> <field name="depreciation_date"/> <field name="sequence" invisible="1"/> @@ -159,11 +159,6 @@ </group> </group> </form> - <graph type="bar"> - <field name="name"/> - <field name="amount"/> - <field name="depreciated_value"/> - </graph> </field> <button type="object" name="compute_depreciation_board" string="Compute" icon="terp-stock_format-scientific" colspan="2" attrs="{'invisible':[('state','=','close')]}"/> </page> diff --git a/addons/account_budget/account_budget_view.xml b/addons/account_budget/account_budget_view.xml index f6b4842b596..7868755d143 100644 --- a/addons/account_budget/account_budget_view.xml +++ b/addons/account_budget/account_budget_view.xml @@ -62,12 +62,7 @@ <field name="account_ids"/> </page> <page string="Budget Lines"> - <field name="crossovered_budget_line" widget="one2many_list" mode="graph,tree"> - <graph type="bar" string="Lines"> - <field name="analytic_account_id" groups="analytic.group_analytic_accounting"/> - <field name="planned_amount" operator="+"/> - <field group="True" name="general_budget_id"/> - </graph> + <field name="crossovered_budget_line" widget="one2many_list" mode="tree"> <tree string="Budget Lines" editable="top"> <field name="crossovered_budget_id"/> <field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]"/> diff --git a/addons/account_budget/security/account_budget_security.xml b/addons/account_budget/security/account_budget_security.xml index 1fbcd82e86c..46a3efebb5c 100644 --- a/addons/account_budget/security/account_budget_security.xml +++ b/addons/account_budget/security/account_budget_security.xml @@ -22,6 +22,10 @@ <field eval="True" name="global"/> <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> </record> + + <record model="res.users" id="base.user_root"> + <field eval="[(4,ref('analytic.group_analytic_accounting'))]" name="groups_id"/> + </record> </data> </openerp> diff --git a/addons/account_coda/account_coda_view.xml b/addons/account_coda/account_coda_view.xml index 23e63b2a4a4..21db77466a0 100644 --- a/addons/account_coda/account_coda_view.xml +++ b/addons/account_coda/account_coda_view.xml @@ -404,9 +404,9 @@ <field name="name"/> <field name="statement_id" readonly="1"/> <field name="ref" readonly="1"/> - <field name="partner_id" on_change="onchange_partner_id(partner_id)"/> - <field name="type" on_change="onchange_type(partner_id, type)"/> - <field name="account_id" domain="[('journal_id','=',parent.journal_id)]"/> + <field name="partner_id" /> + <field name="type" /> + <field name="account_id" /> <field name="amount" readonly="1" sum="Total Amount"/> <field name="globalisation_id" string="Glob. Id"/> <field name="globalisation_amount" string="Glob. Am."/> @@ -426,9 +426,9 @@ <field name="val_date"/> <field name="name"/> <field name="ref" readonly="0"/> - <field name="partner_id" on_change="onchange_partner_id(partner_id)"/> - <field name="type" on_change="onchange_type(partner_id, type)"/> - <field domain="[('journal_id', '=', parent.journal_id), ('type', '<>', 'view')]" name="account_id"/> + <field name="partner_id"/> + <field name="type" /> + <field domain="[('type', '<>', 'view')]" name="account_id"/> <field name="amount"/> <field name="globalisation_id"/> <field name="sequence" readonly="0"/> diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index daf1f7a361e..0c1f26fb20e 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -47,16 +47,18 @@ <field name="state" widget="statusbar" statusbar_visible="draft,posted" statusbar_colors='{"proforma":"blue"}'/> </header> <sheet string="Accounting Voucher"> - <group col="6" colspan="4"> + <group col="4" colspan="4"> <field name="partner_id" required="1" on_change="onchange_journal_voucher(line_ids, tax_id, amount, partner_id, journal_id, type)"/> - <field name="payment_rate_currency_id" invisible="1"/> <field name="date" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id)"/> <field name="journal_id" widget="selection" on_change="onchange_journal_voucher(line_ids, tax_id, amount, partner_id, journal_id, type)"/> <field name="type" required="1"/> <field name="name" colspan="2"/> <field name="company_id" widget="selection" groups="base.group_multi_company"/> <field name="reference"/> + <field name="number"/> + <field name="currency_id" groups="base.group_multi_currency"/> <field name="account_id" widget="selection" invisible="True"/> + <field name="payment_rate_currency_id" invisible="1"/> </group> <notebook colspan="4"> <page string="Voucher Entry"> @@ -69,20 +71,16 @@ <field name="account_analytic_id" groups="analytic.group_analytic_accounting"/> </tree> </field> - <group col="3"> - <group string="Internal Notes"> - <field name="narration" colspan="2" nolabel="1"/> - </group> - <group string="Other Information"> - <field name="number"/> - <field name="currency_id" groups="base.group_multi_currency"/> - </group> - <group col="4" attrs="{'invisible':[('type','in',['payment', 'receipt', False])]}"> - <separator string="Total" colspan="4"/> - <field name="tax_id" on_change="onchange_price(line_ids, tax_id, partner_id)" widget="selection"/> + <group> + <field name="narration" nolabel="1" placeholder="Internal Notes"/> + <group class="oe_subtotal_footer oe_right" attrs="{'invisible':[('type','in',['payment', 'receipt', False])]}"> + <field name="tax_id" on_change="onchange_price(line_ids, tax_id, partner_id)" widget="selection" nolabel="1"/> <field name="tax_amount" nolabel="1"/> - <button type="object" icon="terp-stock_format-scientific" name="compute_tax" string="Compute Tax" attrs="{'invisible': [('state','!=','draft')]}"/> - <label colspan="1" string=""/><field name="amount" string="Total"/> + <div class="oe_subtotal_footer_separator"> + <label for="amount"/> + <button type="object" icon="terp-stock_format-scientific" name="compute_tax" class="oe_link oe_edit_only" string="(Update)" attrs="{'invisible': [('state','!=','draft')]}"/> + </div> + <field name="amount" class="oe_subtotal_footer_separator" nolabel="1"/> </group> </group> </page> diff --git a/addons/anonymization/anonymization.py b/addons/anonymization/anonymization.py index 6b6db168a4f..43d198b27e2 100644 --- a/addons/anonymization/anonymization.py +++ b/addons/anonymization/anonymization.py @@ -68,8 +68,10 @@ class ir_model_fields_anonymization(osv.osv): return state def _check_write(self, cr, uid, context=None): - # check that the field is created from the menu and not from an database update - # otherwise the database update can crash: + """check that the field is created from the menu and not from an database update + otherwise the database update can crash:""" + if context is None: + context = {} if context.get('manual'): global_state = self._get_global_state(cr, uid, context=context) @@ -295,10 +297,10 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, *args, **kwargs): state = self.pool.get('ir.model.fields.anonymization')._get_global_state(cr, uid, context=context) - + if context is None: context = {} - + step = context.get('step', 'new_window') res = super(ir_model_fields_anonymize_wizard, self).fields_view_get(cr, uid, view_id, view_type, context, *args, **kwargs) diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index 4bfa145188c..6607f2dfa1b 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -132,8 +132,6 @@ <header> <button name="%(crm.action_crm_lead2opportunity_partner)d" string="Convert to Opportunity" type="action" states="draft,open,pending" help="Convert to Opportunity" class="oe_highlight"/> - <button name="case_escalate" string="Escalate" type="object" - states="draft,open,pending"/> <button name="case_reset" string="Reset" type="object" states="cancel"/> <button name="case_cancel" string="Cancel" type="object" @@ -188,7 +186,11 @@ </group> <group> <field name="user_id"/> - <field name="section_id"/> + <label for="section_id"/> + <div> + <field name="section_id"/> + <button name="case_escalate" string="Escalate" type="object" states="draft,open,pending"/> + </div> <field name="type" invisible="1"/> </group> <group> @@ -405,8 +407,6 @@ states="draft,open,pending" class="oe_highlight"/> <button name="case_mark_lost" string="Mark Lost" type="object" states="draft,open" class="oe_highlight"/> - <button name="case_escalate" string="Escalate" type="object" - states="open" /> <field name="stage_id" widget="statusbar" clickable="True"/> </header> <sheet> @@ -452,7 +452,11 @@ <group> <field name="user_id"/> - <field name="section_id" colspan="1" widget="selection"/> + <label for="section_id"/> + <div> + <field name="section_id" widget="selection"/> + <button name="case_escalate" string="Escalate" type="object" states="draft,open,pending" /> + </div> </group> <group> <field name="categ_ids" diff --git a/addons/document_page/__openerp__.py b/addons/document_page/__openerp__.py index a88e1d827d7..eec5166b0bf 100644 --- a/addons/document_page/__openerp__.py +++ b/addons/document_page/__openerp__.py @@ -44,10 +44,6 @@ Web pages 'auto_install': False, 'certificate': '0086363630317', 'images': [], - 'js': [ - 'static/src/lib/wiky/wiky.js', - 'static/src/js/document_page.js' - ], 'css' : ['static/src/css/document_page.css'], } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/document_page/document_page_demo.xml b/addons/document_page/document_page_demo.xml index a5ca56fd573..f779ea8313f 100644 --- a/addons/document_page/document_page_demo.xml +++ b/addons/document_page/document_page_demo.xml @@ -23,24 +23,28 @@ Additional ressources <field name="name">OpenERP 6.1. Functional Demo</field> <field name="parent_id" ref="demo_category1"/> <field name="content"> - -The news is out, OpenERP's latest version 6.1. is here. It's more -user-friendly, even more business oriented and efficient to manage your company - -How to discover the latest version 6.1.? - -Demo : [http://demo.openerp.com] -Online: [http://openerp.com/online] -Download: [http://openerp.com/downloads] - -We have also put together a functional demo that presents 6.1. Watch this video -to learn directly from us what OpenERP 6.1. can do for you. Share it in your -company, with your clients and implement it now for your business. - -==Watch on Youtube!== - -[[Video:http://www.youtube.com/embed/7jES2jxKMso ]] - +<![CDATA[ +<br> +<br> +The news is out, OpenERP's latest version 6.1. is here. It's more<br> +user-friendly, even more business oriented and efficient to manage your company<br> +<br> +How to discover the latest version 6.1.?<br> +<br> +Demo : <a target="http://demo.openerp.com" href="http://demo.openerp.com" style="background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC") no-repeat scroll right center transparent;padding-right: 13px;"></a><br> +Online: <a target="http://openerp.com/online" href="http://openerp.com/online" style="background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC") no-repeat scroll right center transparent;padding-right: 13px;"></a><br> +Download: <a target="http://openerp.com/downloads" href="http://openerp.com/downloads" style="background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC") no-repeat scroll right center transparent;padding-right: 13px;"></a><br> +<br> +We have also put together a functional demo that presents 6.1. Watch this video<br> +to learn directly from us what OpenERP 6.1. can do for you. Share it in your<br> +company, with your clients and implement it now for your business.<br> +<br> +<h3>Watch on Youtube!</h3><br> +<br> +<iframe width="480" height="390" src="http://www.youtube.com/embed/7jES2jxKMso " frameborder="0" allowfullscreen=""></iframe><br> +<br> +<br> +]]> </field> </record> @@ -48,36 +52,40 @@ company, with your clients and implement it now for your business. <field name="name">Personalise Dashboards</field> <field name="parent_id" ref="demo_category1"/> <field name="content"> -You like OpenERP, but feel like you want to personalise it more? Now, OpenERP -goes a step further and lets you customize your dashboard. Thanks to a new -feature that allows you to customize your dashboard by adding new boards of any -search view. - -==How is it done?== - -Step 1: access one search view - -Step 2: apply the filter you want to see at each connection to the application -(eg. on sales, manufacturing, etc) - -Step 3: add it into the dashboard in the same space where you can save the filter - -Step 4: choose the application you want it visible on and the name of the array - -Look at this simple example below from Purchase, where I want to put on the -application's dashboard "Purchases to Approve". After I access the search view -and apply the filter for "Purchases to Approve", I can add it immediately to my -Purchase dashboard. - -[[File:http://www.openerp.com/sites/default/files/fileattach/dashboard2_1(1).png ]] - -In less than a minute, the search view is visible on the dashboard - -[[File:http://www.openerp.com/sites/default/files/fileattach/dashboard2_2.png ]] - -Of course, you are free to delete what you don't need or like, but just in case -you change your mind there is a reset button to return to the default view. - +<![CDATA[ +<br> +You like OpenERP, but feel like you want to personalise it more? Now, OpenERP<br> +goes a step further and lets you customize your dashboard. Thanks to a new<br> +feature that allows you to customize your dashboard by adding new boards of any<br> +search view.<br> +<br> +<h3>How is it done?</h3><br> +<br> +Step 1: access one search view <br> +<br> +Step 2: apply the filter you want to see at each connection to the application<br> +(eg. on sales, manufacturing, etc)<br> +<br> +Step 3: add it into the dashboard in the same space where you can save the filter<br> +<br> +Step 4: choose the application you want it visible on and the name of the array<br> +<br> +Look at this simple example below from Purchase, where I want to put on the<br> +application's dashboard "Purchases to Approve". After I access the search view<br> +and apply the filter for "Purchases to Approve", I can add it immediately to my<br> +Purchase dashboard.<br> +<br> +<img src="http://www.openerp.com/sites/default/files/fileattach/dashboard2_1(1).png" alt=""><br> +<br> +In less than a minute, the search view is visible on the dashboard<br> +<br> +<img src="http://www.openerp.com/sites/default/files/fileattach/dashboard2_2.png" alt=""><br> +<br> +Of course, you are free to delete what you don't need or like, but just in case<br> +you change your mind there is a reset button to return to the default view.<br> +<br> +<br> +]]> </field> </record> @@ -85,36 +93,36 @@ you change your mind there is a reset button to return to the default view. <field name="name">Touchscreen Point of Sale</field> <field name="parent_id" ref="demo_category1"/> <field name="content"> -The brand new OpenERP touchscreen point of sale available with 6.1 allows you -to manage your shop sales very easily. It's fully web based so that you don't -have to install or deploy any software and all the sales shops can be easily -consolidated. It works in connected and disconnected modes so that you can -continue to sell if you lose your internet connection. - -[[File:http://www.openerp.com/sites/default/files/fileattach/POS(2).png ]] - -==Here's a summary of its main features and benefits:== - -100% WEB based - -* available for any touchscreen device (ipod, ipad, any tablet)mobile (with portable devices) -* no installation required -* no synchronization needed, completely integrated -* continue working even when your connection is down if you close your browser, data won't be lost -* fully web based with a clean interface smart interface - -You have different options to select your products. You can do it through the -barcode reader, just browse through the categories you have put in place (ie. -drinks, snacks, meals, etc.), or text search in case neither of the other -options work for you. If you need to use the POS for your restaurant, for -example, your employees can record at the same time multiple tickets without -having to wait to do one transaction at a time. Along, to facilitate payment, -the application allows multiple payment methods. - -The POS application is so simple and accessible to use that your shop or -restaurant will never need any other tool to manage orders. Due to its smart -and user-friendly interface you don't need any training to learn how to use it. -Think of it as an out-of-the-box solution to boost your business' productivity. +<![CDATA[ +<br> +The brand new OpenERP touchscreen point of sale available with 6.1 allows you<br> +to manage your shop sales very easily. It's fully web based so that you don't<br> +have to install or deploy any software and all the sales shops can be easily<br> +consolidated. It works in connected and disconnected modes so that you can<br> +continue to sell if you lose your internet connection.<br> +<br> +<img src="http://www.openerp.com/sites/default/files/fileattach/POS(2).png" alt=""><br> +<br> +<h3>Here's a summary of its main features and benefits:</h3><br> +<br> +100% WEB based<br> +<br> +<ul><li>available for any touchscreen device (ipod, ipad, any tablet)mobile (with portable devices)</li><li>no installation required</li><li>no synchronization needed, completely integrated</li><li>continue working even when your connection is down if you close your browser, data won't be lost</li><li>fully web based with a clean interface smart interface</li></ul><br> +<br> +You have different options to select your products. You can do it through the<br> +barcode reader, just browse through the categories you have put in place (ie.<br> +drinks, snacks, meals, etc.), or text search in case neither of the other<br> +options work for you. If you need to use the POS for your restaurant, for<br> +example, your employees can record at the same time multiple tickets without<br> +having to wait to do one transaction at a time. Along, to facilitate payment,<br> +the application allows multiple payment methods.<br> +<br> +The POS application is so simple and accessible to use that your shop or<br> +restaurant will never need any other tool to manage orders. Due to its smart<br> +and user-friendly interface you don't need any training to learn how to use it.<br> +Think of it as an out-of-the-box solution to boost your business' productivity.<br> +<br> +]]> </field> </record> diff --git a/addons/document_page/document_page_view.xml b/addons/document_page/document_page_view.xml index 23c4b8f29c8..63f208c08a7 100644 --- a/addons/document_page/document_page_view.xml +++ b/addons/document_page/document_page_view.xml @@ -55,7 +55,7 @@ </div> <field name="content" placeholder="e.g. Once upon a time..." class="oe_edit_only"/> <div class="oe_document_page"> - <field name="display_content" widget="text_wiki" class="oe_view_only"/> + <field name="display_content" widget="html" class="oe_view_only" options='{"safe": true}'/> </div> </form> </field> diff --git a/addons/document_page/static/src/js/document_page.js b/addons/document_page/static/src/js/document_page.js deleted file mode 100644 index 836803bf700..00000000000 --- a/addons/document_page/static/src/js/document_page.js +++ /dev/null @@ -1,18 +0,0 @@ -openerp.document_page = function (openerp) { - openerp.web.form.widgets.add('text_wiki', 'openerp.web.form.FieldTextWiki'); - - openerp.web.form.FieldTextWiki = openerp.web.form.FieldText.extend({ - render_value: function() { - var show_value = openerp.web.format_value(this.get('value'), this, ''); - if (!this.get("effective_readonly")) { - this.$textarea.val(show_value); - if (show_value && this.view.options.resize_textareas) { - this.do_resize(this.view.options.resize_textareas); - } - } else { - var wiki_value = wiky.process(show_value || ''); - this.$el.html(wiki_value); - } - }, - }); -}; diff --git a/addons/document_page/static/src/lib/wiky/Readme.md b/addons/document_page/static/src/lib/wiky/Readme.md deleted file mode 100755 index 5d9bfe175a6..00000000000 --- a/addons/document_page/static/src/lib/wiky/Readme.md +++ /dev/null @@ -1,41 +0,0 @@ -Wiky.js - a javascript library to convert Wiki Markup language to HTML. -======================= - -(It is buggy, please use with care) - -Wiky.js is a javascript library that converts Wiki Markup language to HTML. - - -How to use it -------------------- -Include wiki.js into your HTML file. Wiky.js has only one function, which is wiky.process(wikitext). - -Please see index.html for an example. - -*wiky.js does not depend on jQuery, which is included for testing purpose. - - - -Supported Syntax -------------------- -* == Heading == -* === Subheading === -* [http://www.url.com Name of URLs] -* [[File:http://www.url.com/image.png Alternative Text]] -* -------------------- (Horizontal line) -* : (Indentation) -* # Ordered bullet point -* * Unordered bullet point - - - -License ------------------- -Creative Commons 3.0 - - - -Contributors -------------------- -Tanin Na Nakorn -Tanun Niyomjit (Designer)
\ No newline at end of file diff --git a/addons/document_page/static/src/lib/wiky/index.html b/addons/document_page/static/src/lib/wiky/index.html deleted file mode 100755 index 97992354fd6..00000000000 --- a/addons/document_page/static/src/lib/wiky/index.html +++ /dev/null @@ -1,56 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <script type="text/javascript" src="jquery-1.4.2.min.js"></script> - <script type="text/javascript" src="wiky.js"></script> - <title>Untitled Document</title> - <link href="wiky.css" rel="stylesheet" type="text/css"> - </head> - <body> - <textarea id="textarea" onchange="$('#preview').html(wiky.process($(this).val()));" cols="60" rows="20">=== Heading === -Some content -I would like to add another line - -== Subheading == -Some more content -Some more lines1 -:A line with indent -:: A 2-indented line -:: more -:back to 1-indented line - -This is Taeyeon. -[[File:http://www.oknation.net/blog/home/blog_data/12/2012/images/ty4.jpg Taeyeon]] -Taeyeon is so cute. - -This is a link:[http://www.google.com Google]. -This is a bold link:'''[http://www.google.com Google]'''. -This is a bold-italic link:'''''[http://www.google.com Google]'''''. -This is '''bold''', '''''bold-italic''''', and ''italic'' - -[[Video:http://www.youtube.com/embed/ovVfLancwys]] -# First -# secon -## Second-First -*** First Point -*** Second Point -#### z -#### y -#### x -*** Third Point -## Second-Second [ftp://www.facebook.com FacebookFTP] -## Second-Third [http://www.google.com Google Here] -# third - -</textarea> - <br/> - <span style="display:block;width:600px;border:1px solid #999999;"> - <span style="display:block;margin:10px 10px 10px 10px;" class="wiky_preview_area" id="preview"> - </span> - </span> - </body> -</html> -<script language="javascript"> - $('#preview').html(wiky.process($('#textarea').val())); -</script> diff --git a/addons/document_page/static/src/lib/wiky/input_complete b/addons/document_page/static/src/lib/wiky/input_complete deleted file mode 100755 index c7e860cccf9..00000000000 --- a/addons/document_page/static/src/lib/wiky/input_complete +++ /dev/null @@ -1,35 +0,0 @@ -=== Heading === -Some content -I would like to add another line - -== Subheading == -Some more content -Some more lines1 -:A line with indent -:: A 2-indented line -:: more -:back to 1-indented line - -This is Taeyeon. -[[File:http://www.oknation.net/blog/home/blog_data/12/2012/images/ty4.jpg Taeyeon]] -Taeyeon is so cute. - -This is a link:[http://www.google.com Google]. -This is a bold link:'''[http://www.google.com Google]'''. -This is a bold-italic link:'''''[http://www.google.com Google]'''''. -This is '''bold''', '''''bold-italic''''', and ''italic'' - - -# First -# second -## Second-First -*** First Point -*** Second Point -#### z -#### y -#### x -*** Third Point -## Second-Second [ftp://www.facebook.com FacebookFTP] -## Second-Third [http://www.google.com Google Here] -# third - diff --git a/addons/document_page/static/src/lib/wiky/wiky.css b/addons/document_page/static/src/lib/wiky/wiky.css deleted file mode 100755 index 0adc7896df0..00000000000 --- a/addons/document_page/static/src/lib/wiky/wiky.css +++ /dev/null @@ -1,79 +0,0 @@ -@charset "UTF-8"; -.wiky_preview_area { - font-family: "Helvetica Neue", Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif; - font-size: 13px; - line-height: 1.5em; - color: #666; - font-weight:350; - width:600px; - display:block; -} -.wiky_preview_area h2{ - font-size:24px; - color:#333; - font-weight:400; - - text-shadow:0 1px 0 rgba(000, 000, 000, .4); -} -.wiky_preview_area h3{ - font-size:18px; - color:#555; - font-weight:400; - - text-shadow:0 1px 0 rgba(000, 000, 000, .4); -} -.wiky_preview_area img{ - background-repeat: repeat; - width: 400px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -webkit-box-shadow:0 1px 3px rgba(0, 0, 0, .8); - -moz-box-shadow:0 1px 3px rgba(0, 0, 0, .8); - box-shadow:0 1px 3px rgba(0, 0, 0, .8); -} -.wiky_preview_area a{ - padding:5px; - font-weight:400; - - background: #999; /* for non-css3 browsers */ - - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#000000'); /* for IE */ - background: -webkit-gradient(linear, left top, left bottom, from(#ccc), to(#000)); /* for webkit browsers */ - background: -moz-linear-gradient(top, #ccc, #000); /* for firefox 3.6+ */ - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none; - - text-shadow:0 1px 0 rgba(255, 255, 255, 1); -} - -.wiky_preview_area a:hover{ - color:#333; - padding:5px; - font-weight:400; - text-decoration:none; - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - - -webkit-box-shadow:0 1px 3px rgba(0, 0, 0, .3); - -moz-box-shadow:0 1px 3px rgba(0, 0, 0, .3); - box-shadow:0 1px 3px rgba(0, 0, 0, .3); - - text-shadow:0 1px 0 rgba(255, 255, 255, 1); -} - - -.wiky_preview_area > ol, -.wiky_preview_area > ul, -.wiky_preview_area > ul > li, -.wiky_preview_area > ol > li { - list-style: disc inside none; -}
\ No newline at end of file diff --git a/addons/document_page/static/src/lib/wiky/wiky.js b/addons/document_page/static/src/lib/wiky/wiky.js deleted file mode 100755 index 5bc9c6f167d..00000000000 --- a/addons/document_page/static/src/lib/wiky/wiky.js +++ /dev/null @@ -1,303 +0,0 @@ -/** - * Wiky.js - Javascript library to converts Wiki MarkUp language to HTML. - * You can do whatever with it. Please give me some credits (Apache License) - * - Tanin Na Nakorn - */ - -var wiky = {}; - - -wiky.process = function(wikitext) { - var lines = wikitext.split(/\r?\n/); - var start; - var html = ""; - - for (var i=0;i<lines.length;i++) - { - var line = lines[i]; - if (line.match(/^===/)!=null && line.match(/===$/)!=null) - { - html += "<h2>"+line.substring(3,line.length-3)+"</h2>"; - } - else if (line.match(/^==/)!=null && line.match(/==$/)!=null) - { - html += "<h3>"+line.substring(2,line.length-2)+"</h3>"; - } - else if (line.match(/^:+/)!=null) - { - // find start line and ending line - start = i; - while (i < lines.length && lines[i].match(/^:+/)!=null) i++; - i--; - - html += wiky.process_indent(lines,start,i); - } - else if (line.match(/^----+(\s*)$/)!=null) - { - html += "<hr/>"; - } - else if (line.match(/^(\*+) /)!=null) - { - // find start line and ending line - start = i; - while (i < lines.length && lines[i].match(/^(\*+|##+):? /)!=null) i++; - i--; - - html += wiky.process_bullet_point(lines,start,i); - } - else if (line.match(/^(#+) /)!=null) - { - // find start line and ending line - start = i; - while (i < lines.length && lines[i].match(/^(#+|\*\*+):? /)!=null) i++; - i--; - - html += wiky.process_bullet_point(lines,start,i); - } - else - { - html += wiky.process_normal(line); - } - - html += "<br/>\n"; - } - - return html; -}; - -wiky.process_indent = function(lines,start,end) { - var html = "<dl>"; - - for(var i=start;i<=end;i++) { - - html += "<dd>"; - - var this_count = lines[i].match(/^(:+)/)[1].length; - - html += wiky.process_normal(lines[i].substring(this_count)); - - var nested_end = i; - for (var j=i+1;j<=end;j++) { - var nested_count = lines[j].match(/^(:+)/)[1].length; - if (nested_count <= this_count) break; - else nested_end = j; - } - - if (nested_end > i) { - html += wiky.process_indent(lines,i+1,nested_end); - i = nested_end; - } - - html += "</dd>"; - } - - html += "</dl>"; - return html; -}; - -wiky.process_bullet_point = function(lines,start,end) { - var html = (lines[start].charAt(0)=='*')?"<ul>":"<ol>"; - - for(var i=start;i<=end;i++) { - - html += "<li>"; - - var this_count = lines[i].match(/^(\*+|#+) /)[1].length; - - html += wiky.process_normal(lines[i].substring(this_count+1)); - - // continue previous with #: - { - var nested_end = i; - for (var j = i + 1; j <= end; j++) { - var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length; - - if (nested_count < this_count) - break; - else { - if (lines[j].charAt(nested_count) == ':') { - html += "<br/>" + wiky.process_normal(lines[j].substring(nested_count + 2)); - nested_end = j; - } else { - break; - } - } - - } - - i = nested_end; - } - - // nested bullet point - { - var nested_end = i; - for (var j = i + 1; j <= end; j++) { - var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length; - if (nested_count <= this_count) - break; - else - nested_end = j; - } - - if (nested_end > i) { - html += wiky.process_bullet_point(lines, i + 1, nested_end); - i = nested_end; - } - } - - // continue previous with #: - { - var nested_end = i; - for (var j = i + 1; j <= end; j++) { - var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length; - - if (nested_count < this_count) - break; - else { - if (lines[j].charAt(nested_count) == ':') { - html += wiky.process_normal(lines[j].substring(nested_count + 2)); - nested_end = j; - } else { - break; - } - } - - } - - i = nested_end; - } - - html += "</li>"; - } - - html += (lines[start].charAt(0)=='*')?"</ul>":"</ol>"; - return html; -}; - -wiky.process_url = function(txt) { - - var index = txt.indexOf(" "); - - if (index == -1) - { - return "<a target='"+txt+"' href='"+txt+"' style='background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC\") no-repeat scroll right center transparent;padding-right: 13px;'></a>"; - } - else - { - var url = txt.substring(0,index); - var label = txt.substring(index+1); - return "<a target='"+url+"' href='"+url+"' style='background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC\") no-repeat scroll right center transparent;padding-right: 13px;'>"+label+"</a>"; - } -}; - -wiky.process_image = function(txt) { - var index = txt.indexOf(" "); - var url = txt; - var label = ""; - - if (index > -1) - { - url = txt.substring(0,index); - label = txt.substring(index+1); - } - - - return "<img src='"+url+"' alt=\""+label+"\" />"; -}; - -wiky.process_video = function(url) { - - if (url.match(/^(https?:\/\/)?(www.)?youtube.com\//) == null) - { - return "<b>"+url+" is an invalid YouTube URL</b>"; - } - var result; - if ((result = url.match(/^(https?:\/\/)?(www.)?youtube.com\/watch\?(.*)v=([^&]+)/)) != null) - { - url = "http://www.youtube.com/embed/"+result[4]; - } - - - return '<iframe width="480" height="390" src="'+url+'" frameborder="0" allowfullscreen></iframe>'; -}; - -wiky.process_normal = function(wikitext) { - - // Image - { - var index = wikitext.indexOf("[[File:"); - var end_index = wikitext.indexOf("]]", index + 7); - while (index > -1 && end_index > -1) { - - wikitext = wikitext.substring(0,index) - + wiky.process_image(wikitext.substring(index+7,end_index)) - + wikitext.substring(end_index+2); - - index = wikitext.indexOf("[[File:"); - end_index = wikitext.indexOf("]]", index + 7); - } - } - - // Video - { - var index = wikitext.indexOf("[[Video:"); - var end_index = wikitext.indexOf("]]", index + 8); - while (index > -1 && end_index > -1) { - - wikitext = wikitext.substring(0,index) - + wiky.process_video(wikitext.substring(index+8,end_index)) - + wikitext.substring(end_index+2); - - index = wikitext.indexOf("[[Video:"); - end_index = wikitext.indexOf("]]", index + 8); - } - } - - - // URL - var protocols = ["http","ftp","news"]; - - for (var i=0;i<protocols.length;i++) - { - var index = wikitext.indexOf("["+protocols[i]+"://"); - var end_index = wikitext.indexOf("]", index + 1); - while (index > -1 && end_index > -1) { - - wikitext = wikitext.substring(0,index) - + wiky.process_url(wikitext.substring(index+1,end_index)) - + wikitext.substring(end_index+1); - - index = wikitext.indexOf("["+protocols[i]+"://",end_index+1); - end_index = wikitext.indexOf("]", index + 1); - - } - } - - var count_b = 0; - var index = wikitext.indexOf("'''"); - while(index > -1) { - - if ((count_b%2)==0) wikitext = wikitext.replace(/'''/,"<b>"); - else wikitext = wikitext.replace(/'''/,"</b>"); - - count_b++; - - index = wikitext.indexOf("'''",index); - } - - var count_i = 0; - var index = wikitext.indexOf("''"); - while(index > -1) { - - if ((count_i%2)==0) wikitext = wikitext.replace(/''/,"<i>"); - else wikitext = wikitext.replace(/''/,"</i>"); - - count_i++; - - index = wikitext.indexOf("''",index); - } - - wikitext = wikitext.replace(/<\/b><\/i>/g,"</i></b>"); - - return wikitext; -}; diff --git a/addons/hr/hr.py b/addons/hr/hr.py index 90f967fb4b4..aac1f41574f 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -261,7 +261,6 @@ class hr_employee(osv.osv): _defaults = { 'active': 1, 'image': _get_default_image, - 'marital': 'single', 'color': 0, } diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index 00ed2afbef2..5d4c2ae9d45 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -180,7 +180,7 @@ <field name="name">Employees</field> <field name="res_model">hr.employee</field> <field name="view_type">form</field> - <field name="view_mode">tree,form</field> + <field name="view_mode">form,tree</field> <field name="view_id" eval="False"/> <field name="search_view_id" ref="view_employee_filter"/> </record> diff --git a/addons/hr/res_config_view.xml b/addons/hr/res_config_view.xml index c42857e5f6b..7507665c96d 100644 --- a/addons/hr/res_config_view.xml +++ b/addons/hr/res_config_view.xml @@ -17,7 +17,7 @@ <field name="name">Payroll</field> <field name="res_model">ir.module.module</field> <field name="view_mode">kanban,tree,form</field> - <field name="context" eval="{'search_default_category_id': ref('base.module_category_localization'), 'search_default_name': 'payroll'}"/> + <field name="context" eval="{'search_default_category_id': ref('base.module_category_localization')}"/> <field name="search_view_id" ref="base.view_module_filter"/> </record> diff --git a/addons/hr_contract/hr_contract_view.xml b/addons/hr_contract/hr_contract_view.xml index 92ae2524921..6566f303d36 100644 --- a/addons/hr_contract/hr_contract_view.xml +++ b/addons/hr_contract/hr_contract_view.xml @@ -21,7 +21,7 @@ <field name="arch" type="xml"> <data> <xpath expr="//div[@name='button_box']" position="inside"> - <button name="%(act_hr_employee_2_hr_contract)d" string="Contracts" type="action"/> + <button name="%(act_hr_employee_2_hr_contract)d" string="Contracts" type="action" groups="base.group_hr_manager"/> </xpath> <xpath expr="//field[@name='coach_id']" position="after"> <field name="manager"/> diff --git a/addons/hr_evaluation/hr_evaluation_data.xml b/addons/hr_evaluation/hr_evaluation_data.xml index 607cd017a85..01915de76a0 100644 --- a/addons/hr_evaluation/hr_evaluation_data.xml +++ b/addons/hr_evaluation/hr_evaluation_data.xml @@ -392,12 +392,6 @@ Once the form had been filled, the employee send it to his supervisor. <field name="type">char</field> <field eval="5" name="sequence"/> </record> - <record id="survey_answer_98" model="survey.answer"> - <field name="answer">Title</field> - <field name="question_id" ref="survey_question_2"/> - <field name="type">char</field> - <field eval="6" name="sequence"/> - </record> <record id="survey_question_column_heading_4" model="survey.question.column.heading"> <field name="in_visible_rating_weight">1</field> <field name="in_visible_menu_choice">1</field> diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml index 8744567c597..29d68d7a12c 100644 --- a/addons/hr_evaluation/hr_evaluation_view.xml +++ b/addons/hr_evaluation/hr_evaluation_view.xml @@ -239,7 +239,7 @@ <field name="name">Appraisal</field> <field name="res_model">hr_evaluation.evaluation</field> <field name="view_type">form</field> - <field name="view_mode">tree,form,graph</field> + <field name="view_mode">tree,form</field> <field name="search_view_id" ref="hr_evaluation.evaluation_search"/> <field name="context">{"search_default_next_month":1}</field> <field name="help" type="html"> diff --git a/addons/hr_evaluation/security/ir.model.access.csv b/addons/hr_evaluation/security/ir.model.access.csv index f9b8897eb01..a304ee84c10 100644 --- a/addons/hr_evaluation/security/ir.model.access.csv +++ b/addons/hr_evaluation/security/ir.model.access.csv @@ -39,4 +39,4 @@ access_survey_response_hr_employee,survey.response.employee,survey.model_survey_ access_survey_question_column_heading_hr_employee,survey.question.column.heading.employee,survey.model_survey_question_column_heading,base.group_user,1,0,0,0
access_survey_response_line_hr_employee,survey.response.line.employee,survey.model_survey_response_line,base.group_user,1,1,1,0
access_survey_response_answer_hr_employee,survey.response.answer.hr.employee,survey.model_survey_response_answer,base.group_user,1,1,1,0
-
+access_survey_tbl_column_heading_hr_employee,survey.tbl.column.heading,survey.model_survey_tbl_column_heading,base.group_user,1,1,1,0
diff --git a/addons/hr_evaluation/test/test_hr_evaluation.yml b/addons/hr_evaluation/test/test_hr_evaluation.yml index 2bdc3513962..a66731531fa 100644 --- a/addons/hr_evaluation/test/test_hr_evaluation.yml +++ b/addons/hr_evaluation/test/test_hr_evaluation.yml @@ -54,7 +54,6 @@ str(ref("survey_question_2")) +"_" +str(ref("survey_answer_20")) + "_multi" :'3', str(ref("survey_question_2")) +"_" +str(ref("survey_answer_25")) + "_multi" :'2011-12-02 16:42:00', str(ref("survey_question_2")) +"_" +str(ref("survey_answer_43")) + "_multi" :'HR', - str(ref("survey_question_2")) +"_" +str(ref("survey_answer_98")) + "_multi" :'tpa review' }, context = ctx) - I close this Evaluation survey by giving answer of questions. diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index e577d196695..e8440cb37c5 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -130,7 +130,7 @@ </page> <page string="Other Info"> <group> - <group string="Accounting Data"> + <group string="Accounting Data" groups="account.group_account_user"> <field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]"/> <field name="voucher_id" context="{'form_view_ref': 'account_voucher.view_purchase_receipt_form'}"/> </group> diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 8ac67fa1723..7392719a597 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -92,7 +92,7 @@ <header> <button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> - <button string="Refuse" name="refuse" states="confirm,validate1,validate" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> + <button string="Refuse" name="refuse" states="confirm,validate1,validate" type="workflow" groups="base.group_hr_user"/> <button string="Reset to New" name="set_to_draft" states="refuse" type="object" groups="base.group_hr_user" /> <field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/> </header> @@ -140,7 +140,7 @@ <header> <button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> - <button string="Refuse" name="refuse" states="confirm,validate,validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> + <button string="Refuse" name="refuse" states="confirm,validate,validate1" type="workflow" groups="base.group_hr_user"/> <button string="Reset to New" name="set_to_draft" states="cancel,refuse" type="object" groups="base.group_hr_user" /> <field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/> </header> @@ -489,6 +489,7 @@ <record id="hr_holidays_leaves_assign_tree_view" model="ir.ui.view"> <field name="name">hr.employee.leave.tree</field> <field name="model">hr.employee</field> + <field name="priority" eval="20"/> <field name="arch" type="xml"> <tree string="Assign Leaves" editable="bottom"> <field name="name" string="Employee"/> @@ -528,7 +529,7 @@ </group> </xpath> <xpath expr="//div[@name='button_box']" position="inside"> - <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action"/> + <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action" groups="base.group_hr_user"/> </xpath> </field> </record> diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py index c82c6db446b..6a2e40b9571 100644 --- a/addons/hr_payroll/hr_payroll.py +++ b/addons/hr_payroll/hr_payroll.py @@ -669,26 +669,26 @@ class hr_payslip(osv.osv): if not context.get('contract', False): #fill with the first contract of the employee contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context) - res['value'].update({ - 'struct_id': contract_ids and contract_obj.read(cr, uid, contract_ids[0], ['struct_id'], context=context)['struct_id'][0] or False, - 'contract_id': contract_ids and contract_ids[0] or False, - }) else: if contract_id: #set the list of contract for which the input have to be filled contract_ids = [contract_id] - #fill the structure with the one on the selected contract - contract_record = contract_obj.browse(cr, uid, contract_id, context=context) - res['value'].update({ - 'struct_id': contract_record.struct_id.id, - 'contract_id': contract_id - }) else: #if we don't give the contract, then the input to fill should be for all current contracts of the employee contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context) - if not contract_ids: - return res + if not contract_ids: + return res + contract_record = contract_obj.browse(cr, uid, contract_ids[0], context=context) + res['value'].update({ + 'contract_id': contract_record and contract_record.id or False + }) + struct_record = contract_record and contract_record.struct_id or False + if not struct_record: + return res + res['value'].update({ + 'struct_id': struct_record.id, + }) #computation of the salary input worked_days_line_ids = self.get_worked_day_lines(cr, uid, contract_ids, date_from, date_to, context=context) input_line_ids = self.get_inputs(cr, uid, contract_ids, date_from, date_to, context=context) diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml index d5b8b50306d..ef3c0ea2e9f 100644 --- a/addons/hr_payroll/hr_payroll_view.xml +++ b/addons/hr_payroll/hr_payroll_view.xml @@ -234,7 +234,7 @@ </h2> </div> <group col="4"> - <field name="contract_id" domain="[('employee_id','=',employee_id)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)"/> + <field name="contract_id" domain="[('employee_id','=',employee_id)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/> <field name="number"/> <field name="struct_id" attrs="{'required':[('contract_id','<>',False)]}"/> <field name="name"/> @@ -369,7 +369,7 @@ <field name="view_id" ref="view_hr_payslip_tree"/> <field name="search_view_id" ref="view_hr_payslip_filter"/> </record> - <menuitem action="action_view_hr_payslip_form" id="menu_department_tree" parent="menu_hr_root_payroll"/> + <menuitem action="action_view_hr_payslip_form" id="menu_department_tree" parent="menu_hr_root_payroll" groups="base.group_hr_user"/> <act_window name="Payslips" context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}" res_model="hr.payslip" @@ -386,7 +386,7 @@ <field name="arch" type="xml"> <data> <xpath expr="//div[@name='button_box']" position="inside"> - <button name="%(act_hr_employee_payslip_list)d" string="Payslips" type="action"/> + <button name="%(act_hr_employee_payslip_list)d" string="Payslips" type="action" groups="base.group_hr_user"/> </xpath> </data> </field> diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 52d2cfa9d14..6c92e28564e 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -187,7 +187,7 @@ </record> <menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking" - sequence="2" groups="base.group_hr_user,base.group_hr_manager"/> + sequence="2" groups="base.group_hr_user"/> <!-- Company inheritancy @@ -350,7 +350,7 @@ <field name="inherit_id" ref="hr_timesheet.hr_timesheet_employee_extd_form"/> <field name="arch" type="xml"> <xpath expr="//div[@name='button_box']" position="inside"> - <button name="%(act_hr_employee_2_hr_timesheet)d" string="Timesheets" type="action"/> + <button name="%(act_hr_employee_2_hr_timesheet)d" string="Timesheets" type="action" groups="base.group_hr_manager"/> </xpath> </field> </record> diff --git a/addons/l10n_be/__init__.py b/addons/l10n_be/__init__.py index 1b2677d295e..7bdc1f61b1f 100644 --- a/addons/l10n_be/__init__.py +++ b/addons/l10n_be/__init__.py @@ -19,7 +19,6 @@ # ############################################################################## -import company import wizard # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file diff --git a/addons/l10n_be/company.py b/addons/l10n_be/company.py deleted file mode 100644 index 118696ec9f6..00000000000 --- a/addons/l10n_be/company.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). -# -# 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 <http://www.gnu.org/licenses/>. -# -############################################################################## -from osv import osv - -class res_company(osv.osv): - _inherit = "res.company" - _description = 'Company' - - def _get_default_ad(self, addresses): - name = email = phone = city = post_code = address = country_code = "" - for ads in addresses: - if ads.type == 'default': - city = ads.city or "" - post_code = ads.zip or "" - if ads.street: - address = ads.street or "" - if ads.street2: - address += " " + ads.street2 - if ads.country_id: - country_code = ads.country_id and ads.country_id.code or "" - name = ads.name or "" - email = ads.email or "" - phone = ads.phone or "" - return name, email, phone, city, post_code, address, country_code -res_company() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py index 5e357facd86..092d907e4ab 100644 --- a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py +++ b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py @@ -45,8 +45,8 @@ class l10n_be_vat_declaration(osv.osv_memory): 'tax_code_id': fields.many2one('account.tax.code', 'Tax Code', domain=[('parent_id', '=', False)], required=True), 'msg': fields.text('File created', size=64, readonly=True), 'file_save': fields.binary('Save File'), - 'ask_restitution': fields.boolean('Ask Restitution',help='It indicates whether a restitution is to made or not?'), - 'ask_payment': fields.boolean('Ask Payment',help='It indicates whether a payment is to made or not?'), + 'ask_restitution': fields.boolean('Ask Restitution',help='It indicates whether a restitution is to make or not?'), + 'ask_payment': fields.boolean('Ask Payment',help='It indicates whether a payment is to make or not?'), 'client_nihil': fields.boolean('Last Declaration, no clients in client listing', help='Tick this case only if it concerns only the last statement on the civil or cessation of activity: ' \ 'no clients to be included in the client listing.'), 'comments': fields.text('Comments'), @@ -70,6 +70,7 @@ class l10n_be_vat_declaration(osv.osv_memory): obj_tax_code = self.pool.get('account.tax.code') obj_acc_period = self.pool.get('account.period') obj_user = self.pool.get('res.users') + obj_partner = self.pool.get('res.partner') mod_obj = self.pool.get('ir.model.data') if context is None: @@ -83,7 +84,7 @@ class l10n_be_vat_declaration(osv.osv_memory): obj_company = obj_user.browse(cr, uid, uid, context=context).company_id vat_no = obj_company.partner_id.vat if not vat_no: - raise osv.except_osv(_('Insufficient Data!'), _('No VAT Number Associated with Main Company.')) + raise osv.except_osv(_('insufficient data!'), _('No VAT number associated with your company.')) vat_no = vat_no.replace(' ','').upper() vat = vat_no[2:] @@ -93,8 +94,9 @@ class l10n_be_vat_declaration(osv.osv_memory): ctx['period_id'] = data['period_id'][0] tax_info = obj_tax_code.read(cr, uid, tax_code_ids, ['code','sum_period'], context=ctx) - name = email = phone = address = post_code = city = country_code = '' - name, email, phone, city, post_code, address, country_code = self.pool.get('res.company')._get_default_ad(obj_company.partner_id) + default_address = obj_partner.address_get(cr, uid, [obj_company.partner_id.id]) + default_address_id = default_address.get("default", obj_company.partner_id.id) + address_id= obj_partner.browse(cr, uid, default_address_id, context) account_period = obj_acc_period.browse(cr, uid, data['period_id'][0], context=context) issued_by = vat_no[:2] @@ -106,21 +108,21 @@ class l10n_be_vat_declaration(osv.osv_memory): ending_month = account_period.date_stop[5:7] quarter = str(((int(starting_month) - 1) / 3) + 1) - if not email: + if not address_id.email: raise osv.except_osv(_('Insufficient Data!'),_('No email address associated with the company.')) - if not phone: + if not address_id.phone: raise osv.except_osv(_('Insufficient Data!'),_('No phone associated with the company.')) file_data = { 'issued_by': issued_by, 'vat_no': vat_no, 'only_vat': vat_no[2:], 'cmpny_name': obj_company.name, - 'address': address, - 'post_code': post_code, - 'city': city, - 'country_code': country_code, - 'email': email, - 'phone': phone.replace('.','').replace('/','').replace('(','').replace(')','').replace(' ',''), + 'address': "%s %s"%(address_id.street or "",address_id.street2 or ""), + 'post_code': address_id.zip or "", + 'city': address_id.city or "", + 'country_code': address_id.country_id and address_id.country_id.code or "", + 'email': address_id.email or "", + 'phone': address_id.phone.replace('.','').replace('/','').replace('(','').replace(')','').replace(' ',''), 'send_ref': send_ref, 'quarter': quarter, 'month': starting_month, diff --git a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py index 8cad2d01a3e..fad6ca53f92 100644 --- a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py +++ b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py @@ -61,7 +61,7 @@ class partner_vat(osv.osv_memory): company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id period_ids = obj_period.search(cr, uid, [('date_start' ,'>=', date_start), ('date_stop','<=',date_stop), ('company_id','=',company_id)]) if not period_ids: - raise osv.except_osv(_('Insufficient Data!'), _('No data for the selected year.')) + raise osv.except_osv(_('insufficient data!'), _('No data for the selected year.')) partners = [] partner_ids = obj_partner.search(cr, uid, [('vat_subjected', '!=', False), ('vat','ilike','BE%')], context=context) @@ -87,6 +87,9 @@ class partner_vat(osv.osv_memory): if record['turnover'] >= data['limit_amount']: id_client = obj_vat_lclient.create(cr, uid, record, context=context) partners.append(id_client) + + if not partners: + raise osv.except_osv(_('insufficient data!'), _('No data found for the selected year.')) context.update({'partner_ids': partners, 'year': data['year'], 'limit_amount': data['limit_amount']}) model_data_ids = obj_model_data.search(cr, uid, [('model','=','ir.ui.view'), ('name','=','view_vat_listing')]) resource_id = obj_model_data.read(cr, uid, model_data_ids, fields=['res_id'])[0]['res_id'] @@ -190,7 +193,7 @@ class partner_vat_list(osv.osv_memory): phone = ads.phone.replace(' ','') or '' email = ads.email or '' name = ads.name or '' - city = obj_partner.get_city(cr, uid, ads.id) + city = ads.city or '' zip = obj_partner.browse(cr, uid, ads.id, context=context).zip or '' if not city: city = '' diff --git a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.xml b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.xml index 563396c8a03..4ac165344e8 100644 --- a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.xml +++ b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.xml @@ -6,18 +6,18 @@ <field name="model">partner.vat</field> <field name="arch" type="xml"> <form string="Partner VAT Listing" version="7.0"> - <header> + <p class="oe_grey"> + This wizard will create an XML file for VAT details and total invoiced amounts per partner. + </p> + <group> + <field name="year"/> + <field name="limit_amount"/> + </group> + <footer> <button name="get_partner" string="View Customers" type="object" class="oe_highlight" /> or <button string="Cancel" class="oe_link" special="cancel" /> - </header> - <group> - <label string="This wizard will create an XML file for VAT details and total invoiced amounts per partner." colspan="4"/> - </group> - <newline/> - <field name="year"/> - <newline/> - <field name="limit_amount"/> + </footer> </form> </field> </record> diff --git a/addons/l10n_be/wizard/l10n_be_vat_intra.py b/addons/l10n_be/wizard/l10n_be_vat_intra.py index 47a29a8457f..aa4dac11072 100644 --- a/addons/l10n_be/wizard/l10n_be_vat_intra.py +++ b/addons/l10n_be/wizard/l10n_be_vat_intra.py @@ -108,7 +108,7 @@ class partner_vat_intra(osv.osv_memory): # Get Company vat company_vat = data_company.partner_id.vat if not company_vat: - raise osv.except_osv(_('Insufficient Data!'),_('No VAT number associated with the company.')) + raise osv.except_osv(_('insufficient data!'),_('No VAT number associated with your company.')) company_vat = company_vat.replace(' ','').upper() issued_by = company_vat[:2] diff --git a/addons/l10n_fr_rib/bank_view.xml b/addons/l10n_fr_rib/bank_view.xml index a25867ffa6a..5b750326601 100644 --- a/addons/l10n_fr_rib/bank_view.xml +++ b/addons/l10n_fr_rib/bank_view.xml @@ -8,7 +8,7 @@ <field name="inherit_id" ref="account.view_partner_property_form" /> <field name="arch" type="xml"> <data> - <xpath expr="//field[@name='bank_ids']/form/field[@name='acc_number']" position="before"> + <xpath expr="//field[@name='bank_ids']//field[@name='acc_number']" position="before"> <newline /> <field name="bank_code" /> <field name="office" /> diff --git a/addons/multi_company/multi_company_demo.xml b/addons/multi_company/multi_company_demo.xml index d120550e3b9..00c68186108 100644 --- a/addons/multi_company/multi_company_demo.xml +++ b/addons/multi_company/multi_company_demo.xml @@ -181,7 +181,7 @@ </record> <record id="sale.sale_order_5" model="sale.order"> - <field name="company_id" ref="res_company_oerp_in"/> + <field name="company_id" ref="base.main_company"/> </record> diff --git a/addons/note/note_view.xml b/addons/note/note_view.xml index 4ed2fade43f..99a2690cfe7 100644 --- a/addons/note/note_view.xml +++ b/addons/note/note_view.xml @@ -62,7 +62,7 @@ <div class="oe_dropdown_kanban"> <span> <a name="onclick_note_is_done" type="object" t-if="record.open.raw_value" class="oe_e">W</a> - <a name="onclick_note_not_done" type="object" t-if="!record.open.raw_value" class="oe_e">è</a> + <a name="onclick_note_not_done" type="object" t-if="!record.open.raw_value" class="oe_e">W</a> </span> <!-- dropdown menu --> diff --git a/addons/note/static/src/css/Makefile b/addons/note/static/src/css/Makefile deleted file mode 100644 index 91b3abc9333..00000000000 --- a/addons/note/static/src/css/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -memo.css: memo.sass - sass -t expanded memo.sass memo.css - diff --git a/addons/note/static/src/css/note.css b/addons/note/static/src/css/note.css index 6ada8d6cd14..d4b5f3d8d64 100644 --- a/addons/note/static/src/css/note.css +++ b/addons/note/static/src/css/note.css @@ -1,93 +1,53 @@ @charset "utf-8"; -@font-face { - font-family: "mnmliconsRegular"; - src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot"); - src: url("/web/static/src/font/mnmliconsv21-webfont.woff") format("woff"); - src: url("/web/static/src/font/mnmliconsv21-webfont.ttf") format("truetype"); - src: url("/web/static/src/font/mnmliconsv21-webfont.svg") format("svg") active; - font-weight: normal; - font-style: normal; +.oe_kanban_column .note_text_line_through { + text-decoration: line-through; } -@font-face { - font-family: "EntypoRegular"; - src: url("/web/static/src/font/entypo-webfont.eot") format("eot"); - src: url("/web/static/src/font/entypo-webfont.eot?#iefix") format("embedded-opentype"); - src: url("/web/static/src/font/entypo-webfont.woff") format("woff"); - src: url("/web/static/src/font/entypo-webfont.ttf") format("truetype"); - src: url("/web/static/src/font/entypo-webfont.svg") format("svg") active; - font-weight: normal; - font-style: normal; +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_0 { + box-shadow: 0px 4px 9px rgba(48, 48, 48, 0.15); } - -@-moz-keyframes bounce { - 0% { - -moz-transform: scale(0); - opacity: 0; - } - - 50% { - -moz-transform: scale(1.3); - opacity: 0.4; - } - - 75% { - -moz-transform: scale(0.9); - opacity: 0.7; - } - - 100% { - -moz-transform: scale(1); - opacity: 1; - } +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_1 { + box-shadow: 0px 4px 9px rgba(0, 0, 0, 0.15); } - -@-webkit-keyframes bounce { - 0% { - -webkit-transform: scale(0); - opacity: 0; - } - - 50% { - -webkit-transform: scale(1.3); - opacity: 0.4; - } - - 75% { - -webkit-transform: scale(0.9); - opacity: 0.7; - } - - 100% { - -webkit-transform: scale(1); - opacity: 1; - } +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_2 { + box-shadow: 0px 4px 9px rgba(48, 0, 0, 0.15); } - -.oe_kanban_color_2 { - background-color: red; +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_3 { + box-shadow: 0px 4px 9px rgba(97, 93, 0, 0.16); } - -.oe_kanban_column .note_text_line_through { - text-decoration: line-through; +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_4 { + box-shadow: 0px 4px 9px rgba(77, 128, 0, 0.17); } - -.openerp .oe_fold_column .oe_kanban_card_fancy { - text-decoration: none; - color: black; - display: block; - padding: 1em; - margin-right: 1em; - margin-bottom: 1em; - -moz-box-shadow: 5px 5px 7px #212121; - -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); - box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_5 { + box-shadow: 0px 4px 9px rgba(0, 88, 11, 0.15); +} +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_6 { + box-shadow: 0px 4px 9px rgba(0, 80, 95, 0.15); +} +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_7 { + box-shadow: 0px 4px 9px rgba(3, 13, 133, 0.18); +} +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_8 { + box-shadow: 0px 4px 9px rgba(56, 0, 128, 0.15); +} +.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_9 { + box-shadow: 0px 4px 9px rgba(102, 0, 116, 0.15); } - .openerp .oe_kanban_record .oe_kanban_card_fancy { + text-shadow: none; + border-radius: 2px; + padding: 12px; + margin-left: 3px; + margin-right: 3px; + padding-bottom: 16px; + margin-bottom: 16px; -webkit-transform: rotate(-2deg); -o-transform: rotate(-2deg); -moz-transform: rotate(-2deg); + -webkit-transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1); + -moz-transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1); + -ms-transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1); + transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1); } .openerp .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy { -webkit-transform: rotate(1deg); @@ -132,12 +92,14 @@ .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:hover, .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:focus { - box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7); - -moz-box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7); - -webkit-box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7); position: relative; z-index: 5; - -webkit-transform: rotate(0); - -o-transform: rotate(0); - -moz-transform: rotate(0); + border-color: rgba(0, 0, 0, 0.4); + -webkit-transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1); + -moz-transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1); + -ms-transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1); + transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1); + -webkit-transform: rotate(0) !important; + -o-transform: rotate(0) !important; + -moz-transform: rotate(0) !important; } diff --git a/addons/note/static/src/css/note.sass b/addons/note/static/src/css/note.sass index 56aa91abc44..cc4e44f6765 100644 --- a/addons/note/static/src/css/note.sass +++ b/addons/note/static/src/css/note.sass @@ -1,168 +1,54 @@ @charset "utf-8" -// Variables {{{ -$section-title-color: #8786b7 -$tag-bg-light: #f0f0fa -$tag-bg-dark: #8786b7 -$tag-border: #afafb6 -$tag-border-selected: #a6a6fe -$hover-background: #f0f0fa -$link-color: #8a89ba -$sheet-max-width: 860px -// }}} -// Mixins {{{ -@font-face - font-family: 'mnmliconsRegular' - src: url('/web/static/src/font/mnmliconsv21-webfont.eot') format('eot') - src: url('/web/static/src/font/mnmliconsv21-webfont.woff') format('woff') - src: url('/web/static/src/font/mnmliconsv21-webfont.ttf') format('truetype') - src: url('/web/static/src/font/mnmliconsv21-webfont.svg') format('svg') active - font-weight: normal - font-style: normal - -@font-face - font-family: 'EntypoRegular' - src: url('/web/static/src/font/entypo-webfont.eot') format('eot') - src: url('/web/static/src/font/entypo-webfont.eot?#iefix') format('embedded-opentype') - src: url('/web/static/src/font/entypo-webfont.woff') format('woff') - src: url('/web/static/src/font/entypo-webfont.ttf') format('truetype') - src: url('/web/static/src/font/entypo-webfont.svg') format('svg') active - font-weight: normal - font-style: normal - -@mixin reset() - border: none - padding: 0 - margin: 0 - background: none - @include radius(none) - @include box-shadow(none) - -@mixin vertical-gradient($startColor: #555, $endColor: #333) - background-color: $startColor - background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, $startColor, $endColor) /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */ - background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */ - background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */ - background-image: linear-gradient(to bottom, $startColor, $endColor) - -@mixin radial-gradient($gradient) - background-position: center center - background-image: -webkit-radial-gradient(circle, $gradient) - background-image: -moz-radial-gradient($gradient) - background-image: -ms-radial-gradient($gradient) - background-image: radial-gradient($gradient) - -@mixin radius($radius: 5px) - -moz-border-radius: $radius - -webkit-border-radius: $radius - border-radius: $radius - -@mixin box-shadow($bsval: 0px 1px 4px #777) - -moz-box-shadow: $bsval - -webkit-box-shadow: $bsval - box-shadow: $bsval - -@mixin transition($transval: (border linear 0.2s, box-shadow linear 0.2s)) - -webkit-transition: $transval - -moz-transition: $transval - -ms-transition: $transval - -o-transition: $transval - transition: $transval - -@mixin opacity($opacity: .5) - filter: alpha(opacity=$opacity * 100) - opacity: $opacity - -@mixin background-clip($clip: padding-box) - -webkit-background-clip: $clip - -moz-background-clip: $clip - background-clip: $clip - -@mixin box-sizing($type: content) - // type = border || content || padding - -webkit-box-sizing: #{$type}-box - -moz-box-sizing: #{$type}-box - -ms-box-sizing: #{$type}-box - box-sizing: #{$type}-box - -// Transforms the (readable) text of an inline element into an mmlicons icon, -// allows for actual readable text in-code (and in readers?) with iconic looks -@mixin text-to-icon($icon-name, $color: #404040) - font-size: 1px - letter-spacing: -1px - color: transparent - &: before - font: 21px "mnmliconsRegular" - content: $icon-name - color: $color - -// }}} -// CSS animation bounces {{{ -@-moz-keyframes bounce - 0% - -moz-transform: scale(0) - opacity: 0 - 50% - -moz-transform: scale(1.3) - opacity: 0.4 - 75% - -moz-transform: scale(0.9) - opacity: 0.7 - 100% - -moz-transform: scale(1) - opacity: 1 - -@-webkit-keyframes bounce - 0% - -webkit-transform: scale(0) - opacity: 0 - 50% - -webkit-transform: scale(1.3) - opacity: 0.4 - 75% - -webkit-transform: scale(0.9) - opacity: 0.7 - 100% - -webkit-transform: scale(1) - opacity: 1 -// }}} - - -.oe_kanban_color_2 - background-color: red - -// au BufWritePost,FileWritePost *.sass : !sass --style expanded --line-numbers <afile> > "%: p: r.css" - .oe_kanban_column .note_text_line_through text-decoration: line-through - -.openerp - .oe_fold_column - .oe_kanban_card_fancy - text-decoration: none - color: #000 - display: block - padding: 1em - margin-right: 1em - margin-bottom: 1em - -moz-box-shadow: 5px 5px 7px rgba(33,33,33,1) - -webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7) - box-shadow: 5px 5px 7px rgba(33,33,33,.7) - - @mixin rotate($a) - -webkit-transform: rotate($a) - -o-transform: rotate($a) + -webkit-transform: rotate($a) + -o-transform: rotate($a) -moz-transform: rotate($a) +@mixin transition($what:all,$duration:100ms) + -webkit-transition: $what $duration cubic-bezier(0.5,0,0.5,1) + -moz-transition: $what $duration cubic-bezier(0.5,0,0.5,1) + -ms-transition: $what $duration cubic-bezier(0.5,0,0.5,1) + transition: $what $duration cubic-bezier(0.5,0,0.5,1) + + .openerp + .oe_kanban_view.oe_notes + .oe_kanban_card_fancy.oe_kanban_color_0 + box-shadow: 0px 4px 9px rgba(48,48,48,0.15) + .oe_kanban_card_fancy.oe_kanban_color_1 + box-shadow: 0px 4px 9px rgba(0,0,0,0.15) + .oe_kanban_card_fancy.oe_kanban_color_2 + box-shadow: 0px 4px 9px rgba(48,0,0,0.15) + .oe_kanban_card_fancy.oe_kanban_color_3 + box-shadow: 0px 4px 9px rgba(97,93,0,0.16) + .oe_kanban_card_fancy.oe_kanban_color_4 + box-shadow: 0px 4px 9px rgba(77,128,0,0.17) + .oe_kanban_card_fancy.oe_kanban_color_5 + box-shadow: 0px 4px 9px rgba(0,88,11,0.15) + .oe_kanban_card_fancy.oe_kanban_color_6 + box-shadow: 0px 4px 9px rgba(0,80,95,0.15) + .oe_kanban_card_fancy.oe_kanban_color_7 + box-shadow: 0px 4px 9px rgba(3,13,133,0.18) + .oe_kanban_card_fancy.oe_kanban_color_8 + box-shadow: 0px 4px 9px rgba(56,0,128,0.15) + .oe_kanban_card_fancy.oe_kanban_color_9 + box-shadow: 0px 4px 9px rgba(102,0,116,0.15) .oe_kanban_record .oe_kanban_card_fancy + text-shadow: none + border-radius: 2px + padding: 12px + margin-left: 3px + margin-right: 3px + padding-bottom: 16px + margin-bottom: 16px @include rotate(-2deg) + @include transition($what:all, $duration:300ms) .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy @include rotate(1deg) @@ -193,17 +79,16 @@ $sheet-max-width: 860px @include rotate(-1deg) -@mixin oe_kanban_card_fancy - box-shadow: 10px 10px 7px rgba(0,0,0,.7) - -moz-box-shadow: 10px 10px 7px rgba(0,0,0,.7) - -webkit-box-shadow: 10px 10px 7px rgba(0,0,0,.7) - position: relative - z-index: 5 - @include rotate(0) - .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:hover, .oe_kanban_card_fancy:focus - @include oe_kanban_card_fancy + position: relative + z-index: 5 + border-color: rgba(0,0,0,0.4) + @include transition($what:all, $duration:150ms) + -webkit-transform: rotate(0) !important + -o-transform: rotate(0) !important + -moz-transform: rotate(0) !important + diff --git a/addons/portal/portal_demo.xml b/addons/portal/portal_demo.xml index f4ba8fe2192..a8727b99556 100644 --- a/addons/portal/portal_demo.xml +++ b/addons/portal/portal_demo.xml @@ -19,7 +19,7 @@ <!-- Company news and comments --> <record id="message_company_news0" model="mail.message"> - <field name="subject">Our first company's blogpost !</field> + <field name="subject">Our company's first blog-post !</field> <field name="model">mail.group</field> <field name="res_id" ref="company_news_feed"/> <field name="body"><![CDATA[Hello, and welcome to our company's portal ! diff --git a/addons/project/i18n/project.pot b/addons/project/i18n/project.pot index 46cf1a9279a..4f364cc1e66 100644 --- a/addons/project/i18n/project.pot +++ b/addons/project/i18n/project.pot @@ -1293,7 +1293,7 @@ msgstr "" #. module: project #: view:project.task:0 -msgid "Delegations History" +msgid "Delegation" msgstr "" #. module: project diff --git a/addons/project/project.py b/addons/project/project.py index 58bc3714526..782c2e6635f 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -49,8 +49,9 @@ class project_task_type(osv.osv): } _defaults = { 'sequence': 1, - 'state': 'draft', + 'state': 'open', 'fold': False, + 'case_default': True, } _order = 'sequence' diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 4d7bceb4599..6d4d7018f4a 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -130,7 +130,7 @@ </div> </group> <group> - <group string="Administration"> + <group string="Administration" groups="project.group_time_work_estimation_tasks"> <field name="planned_hours" widget="float_time"/> <field name="effective_hours" widget="float_time"/> <field name="resource_calendar_id"/> @@ -143,7 +143,6 @@ <field name="currency_id" groups="base.group_multi_currency" required="1"/> <field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/> - </group> </group> </page> @@ -297,16 +296,14 @@ <field name="help" type="html"> <p class="oe_view_nocontent_create"> Click to start a new project. - </p> - <p> + </p><p> Projects are used to organize your activities; plan tasks, track issues, invoice timesheets. You can define internal projects (R&D, Improve Sales Process), private projects (My Todos) or customer ones. - </p> - <p> - You will be able collaborate with internal users on - projects or invite customers to share your activities. + </p><p> + You will be able collaborate with internal users on + projects or invite customers to share your activities. </p> </field> </record> @@ -405,8 +402,6 @@ states="cancelled,done" context="{'button_reactivate':True}"/> <button name="action_close" string="Done" type="object" states="draft,open,pending"/> - <button name="%(action_project_task_delegate)d" string="Delegate" type="action" - states="pending,open,draft" groups="project.group_delegate_task"/> <button name="do_cancel" string="Cancel" type="object" states="draft,open,pending"/> </span> @@ -453,7 +448,9 @@ </group> <div class="oe_clear"/> </page> - <page string="Delegations History" groups="project.group_delegate_task"> + <page string="Delegation" groups="project.group_delegate_task"> + <button name="%(action_project_task_delegate)d" string="Delegate" type="action" + states="pending,open,draft" groups="project.group_delegate_task"/> <separator string="Parent Tasks"/> <field name="parent_ids"/> <separator string="Delegated tasks"/> @@ -523,7 +520,7 @@ <t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit...</a></li></t> <t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t> <li> - <ul class="oe_kanban_project_times"> + <ul class="oe_kanban_project_times" groups="project.group_time_work_estimation_tasks"> <li><a name="set_remaining_time_1" type="object" class="oe_kanban_button">1</a></li> <li><a name="set_remaining_time_2" type="object" class="oe_kanban_button">2</a></li> <li><a name="set_remaining_time_5" type="object" class="oe_kanban_button">5</a></li> @@ -540,7 +537,8 @@ <div> <field name="project_id"/> <t t-esc="kanban_text_ellipsis(record.description.value, 160)"/><br/> - <i><field name="date_deadline"/></i> + <t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t> + <span t-attf-class="#{red || ''}"><i><field name="date_deadline"/></i></span> </div> <div class="oe_kanban_bottom_right"> <a t-if="record.kanban_state.raw_value === 'normal'" type="object" string="Ready to Pull" name="set_kanban_state_done" class="oe_kanban_status"> </a> @@ -801,7 +799,7 @@ <menuitem id="menu_tasks_config" name="GTD" parent="base.menu_definitions" sequence="1"/> - <menuitem id="base.menu_project_config_project" name="Stages" parent="base.menu_definitions" sequence="1"/> + <menuitem id="base.menu_project_config_project" name="Stages" parent="base.menu_definitions" sequence="1" groups="base.group_no_one"/> <menuitem action="open_task_type_form" name="Task Stages" id="menu_task_types_view" parent="base.menu_project_config_project" sequence="2"/> <menuitem action="open_view_project_all" id="menu_projects" name="Projects" parent="menu_project_management" sequence="1"/> diff --git a/addons/project/res_config.py b/addons/project/res_config.py index 6642dbf485d..85b4bd7001b 100644 --- a/addons/project/res_config.py +++ b/addons/project/res_config.py @@ -30,7 +30,7 @@ class project_configuration(osv.osv_memory): 'module_project_mrp': fields.boolean('Generate tasks from sale orders', help ="""This feature automatically creates project tasks from service products in sale orders. More precisely, tasks are created for procurement lines with product of type 'Service', - procurement method 'Make to Order', and supply method 'Produce'. + procurement method 'Make to Order', and supply method 'Manufacture'. This installs the module project_mrp."""), 'module_pad': fields.boolean("Use integrated collaborative note pads on task", help="""Lets the company customize which Pad installation should be used to link to new pads @@ -52,7 +52,7 @@ class project_configuration(osv.osv_memory): 'module_project_issue_sheet': fields.boolean("Invoice working time on issues", help="""Provides timesheet support for the issues/bugs management in project. This installs the module project_issue_sheet."""), - 'group_tasks_work_on_tasks': fields.boolean("Compute work activities on tasks", + 'group_tasks_work_on_tasks': fields.boolean("Log work activities on tasks", implied_group='project.group_tasks_work_on_tasks', help="Allows you to compute work on tasks."), 'group_time_work_estimation_tasks': fields.boolean("Manage time estimation on tasks", @@ -72,4 +72,9 @@ class project_configuration(osv.osv_memory): user = self.pool.get('res.users').browse(cr, uid, uid, context) user.company_id.write({'project_time_mode_id': config.time_unit.id}) + def onchange_time_estimation_project_timesheet(self, cr, uid, ids, group_time_work_estimation_tasks, module_project_timesheet): + if group_time_work_estimation_tasks or module_project_timesheet: + return {'value': {'group_tasks_work_on_tasks': True}} + return {} + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/res_config_view.xml b/addons/project/res_config_view.xml index 56803484adf..207f35da72e 100644 --- a/addons/project/res_config_view.xml +++ b/addons/project/res_config_view.xml @@ -29,7 +29,7 @@ <label for="id" string="Task"/> <div> <div> - <field name="module_project_timesheet" class="oe_inline"/> + <field name="module_project_timesheet" on_change="onchange_time_estimation_project_timesheet(group_time_work_estimation_tasks, module_project_timesheet)" class="oe_inline"/> <label for="module_project_timesheet"/> </div> <div> @@ -50,7 +50,7 @@ <label for="id" string="Planning"/> <div> <div> - <field name="group_time_work_estimation_tasks" class="oe_inline"/> + <field name="group_time_work_estimation_tasks" on_change="onchange_time_estimation_project_timesheet(group_time_work_estimation_tasks, module_project_timesheet)" class="oe_inline"/> <label for="group_time_work_estimation_tasks"/> </div> <div> diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 6d1d0272ab0..66b3b97b5e8 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -100,8 +100,6 @@ states="open"/> <button name="case_close" string="Done" type="object" states="draft,pending"/> - <button name="case_escalate" string="Escalate" type="object" - states="draft,open,pending"/> <button name="case_cancel" string="Cancel" type="object" states="draft,open,pending"/> </span> @@ -118,7 +116,11 @@ </group> <group> <field name="priority"/> - <field name="project_id" required="True" on_change="on_change_project(project_id)" context="{'default_use_issues':1}"/> + <label for="project_id"/> + <div> + <field name="project_id" required="True" on_change="on_change_project(project_id)" class="oe_inline" context="{'default_use_issues':1}"/> + <button name="case_escalate" string="Escalate" type="object" states="draft,open,pending" class="oe_inline"/> + </div> <label for="task_id"/> <div> <field name="task_id" on_change="onchange_task_id(task_id)" class="oe_inline" context="{'default_project_id':project_id}"/> diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py index 299a74f52aa..f9f6fb6a279 100644 --- a/addons/project_mrp/project_procurement.py +++ b/addons/project_mrp/project_procurement.py @@ -73,6 +73,7 @@ class procurement_order(osv.osv): 'date_deadline': procurement.date_planned, 'planned_hours': planned_hours, 'remaining_hours': planned_hours, + 'partner_id': procurement.sale_line_id and procurement.sale_line_id.order_id.partner_id.id or False, 'user_id': procurement.product_id.product_manager.id, 'notes': procurement.note, 'procurement_id': procurement.id, diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 9fe05da33fc..72ae354faa6 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -318,21 +318,26 @@ class purchase_order(osv.osv): for po in self.browse(cr, uid, ids, context=context): pick_ids += [picking.id for picking in po.picking_ids] - res = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_in_form') - res_id = res and res[1] or False - - return { - 'name': _('Receptions'), - 'view_type': 'form', - 'view_mode': 'form', - 'view_id': [res_id], - 'res_model': 'stock.picking', - 'context': "{'contact_display': 'partner'}", - 'type': 'ir.actions.act_window', - 'nodestroy': True, - 'target': 'current', - 'res_id': pick_ids and pick_ids[0] or False, - } + action_model, action_id = tuple(mod_obj.get_object_reference(cr, uid, 'stock', 'action_picking_tree4')) + action = self.pool.get(action_model).read(cr, uid, action_id, context=context) + ctx = eval(action['context']) + ctx.update({ + 'search_default_purchase_id': ids[0] + }) + if pick_ids and len(pick_ids) == 1: + form_view_ids = [view_id for view_id, view in action['views'] if view == 'form'] + view_id = form_view_ids and form_view_ids[0] or False + action.update({ + 'views': [], + 'view_mode': 'form', + 'view_id': view_id, + 'res_id': pick_ids[0] + }) + + action.update({ + 'context': ctx, + }) + return action def wkf_approve_order(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'approved', 'date_approve': fields.date.context_today(self,cr,uid,context=context)}) @@ -863,6 +868,12 @@ class purchase_order_line(osv.osv): supplier_delay = int(supplier_info.delay) if supplier_info else 0 return datetime.strptime(date_order_str, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=supplier_delay) + def _check_product_uom_group(self, cr, uid, context=None): + group_uom = self.pool.get('ir.model.data').get_object(cr, uid, 'product', 'group_uom') + res = [user for user in group_uom.users if user.id == uid] + return len(res) and True or False + + def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id, partner_id, date_order=False, fiscal_position_id=False, date_planned=False, name=False, price_unit=False, context=None): @@ -908,7 +919,8 @@ class purchase_order_line(osv.osv): uom_id = product_uom_po_id if product.uom_id.category_id.id != product_uom.browse(cr, uid, uom_id, context=context).category_id.id: - res['warning'] = {'title': _('Warning!'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure.')} + if self._check_product_uom_group(cr, uid, context=context): + res['warning'] = {'title': _('Warning!'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure.')} uom_id = product_uom_po_id res['value'].update({'product_uom': uom_id}) @@ -1083,15 +1095,15 @@ class procurement_order(osv.osv): procurement_order() -class mail_message(osv.osv): - _name = 'mail.message' - _inherit = 'mail.message' +class mail_mail(osv.osv): + _name = 'mail.mail' + _inherit = 'mail.mail' - def _postprocess_sent_message(self, cr, uid, message, context=None): - if message.model == 'purchase.order': + def _postprocess_sent_message(self, cr, uid, mail, context=None): + if mail.model == 'purchase.order': wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'purchase.order', message.res_id, 'send_rfq', cr) - return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context) + wf_service.trg_validate(uid, 'purchase.order', mail.res_id, 'send_rfq', cr) + return super(mail_mail, self)._postprocess_sent_message(cr, uid, mail=mail, context=context) -mail_message() +mail_mail() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml index 9a2bd02f9a2..d8e6942f7fc 100644 --- a/addons/purchase/purchase_view.xml +++ b/addons/purchase/purchase_view.xml @@ -14,19 +14,40 @@ <menuitem id="menu_purchase_config_purchase" name="Configuration" groups="group_purchase_manager" parent="base.menu_purchase_root" sequence="100"/> + <menuitem + action="product.product_pricelist_action_for_purchase" id="menu_product_pricelist_action2_purchase" + parent="menu_purchase_config_purchase" sequence="10" groups="product.group_purchase_pricelist" /> + <record id="purchase_pricelist_version_action" model="ir.actions.act_window"> + <field name="name">Pricelist Versions</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">product.pricelist.version</field> + <field name="view_type">form</field> + <field name="view_id" ref="product.product_pricelist_version_tree_view"/> + <field name="domain">[('pricelist_id.type','=','purchase')]</field> + <field name="help" type="html"> + <p class="oe_view_nocontent_create"> + Click to add a pricelist version. + </p><p> + There can be more than one version of a pricelist, each of + these must be valid during a certain period of time. Some + examples of versions: Main Prices, 2010, 2011, Summer Sales, + etc. + </p> + </field> + </record> <menuitem id="menu_purchase_config_pricelist" name="Pricelists" parent="menu_purchase_config_purchase" sequence="50" groups="product.group_purchase_pricelist"/> <menuitem - action="product.product_pricelist_action" id="menu_product_pricelist_action_purhase" - parent="menu_purchase_config_pricelist" sequence="20" groups="base.group_no_one"/> + action="purchase_pricelist_version_action" id="menu_purchase_pricelist_version_action" + parent="menu_purchase_config_pricelist" sequence="2" groups="product.group_purchase_pricelist"/> + <menuitem - action="product.product_pricelist_action_for_purchase" id="menu_product_pricelist_action2_purchase" - parent="menu_purchase_config_pricelist" sequence="10" /> - + action="product.product_price_type_action" id="menu_product_pricelist_action2_purchase_type" + parent="menu_purchase_config_pricelist" sequence="60" /> <menuitem id="menu_product_in_config_purchase" name="Products" parent="menu_purchase_config_purchase" sequence="30" groups="base.group_no_one"/> @@ -188,7 +209,7 @@ <button name="view_picking" string="Receive Products" type="object" attrs="{'invisible': ['|', ('shipped','=',True), ('state','!=', 'approved')]}" class="oe_highlight"/> <button name="action_cancel_draft" states="cancel,sent,confirmed" string="Set to Draft" type="object" /> <button name="purchase_cancel" states="draft,confirmed,sent" string="Cancel"/> - <field name="state" widget="statusbar" statusbar_visible="draft,approved,done" statusbar_colors='{"except_picking":"red","except_invoice":"red","confirmed":"blue"}' readonly="1"/> + <field name="state" widget="statusbar" statusbar_visible="draft,sent,approved,done" statusbar_colors='{"except_picking":"red","except_invoice":"red","confirmed":"blue"}' readonly="1"/> </header> <sheet> <div class="oe_title"> @@ -349,7 +370,7 @@ <field name="name">Quotations</field> <field name="type">ir.actions.act_window</field> <field name="res_model">purchase.order</field> - <field name="context">{'search_default_draft': 1}</field> + <field name="context">{}</field> <field name="domain">[('state','in',('draft','sent','confirmed'))]</field> <field name="view_mode">tree,form,graph,calendar</field> <field name="search_view_id" ref="view_purchase_order_filter"/> diff --git a/addons/purchase/purchase_workflow.xml b/addons/purchase/purchase_workflow.xml index 00fb5517568..212ce304e07 100644 --- a/addons/purchase/purchase_workflow.xml +++ b/addons/purchase/purchase_workflow.xml @@ -145,7 +145,7 @@ <record id="trans_router_invoice_no_order" model="workflow.transition"> <field name="act_from" ref="act_router"/> <field name="act_to" ref="act_invoice_end"/> - <field name="condition">invoice_method<>'order'</field> + <field name="condition">invoice_method<>'order' and invoiced</field> </record> <record id="trans_except_picking_picking_done" model="workflow.transition"> <field name="act_from" ref="act_except_picking"/> diff --git a/addons/purchase/res_config.py b/addons/purchase/res_config.py index bf7512a8666..19b059d4d5b 100644 --- a/addons/purchase/res_config.py +++ b/addons/purchase/res_config.py @@ -46,10 +46,6 @@ class purchase_config_settings(osv.osv_memory): 'group_purchase_delivery_address': fields.boolean("Allow a different address for incoming products and invoicings", implied_group='purchase.group_delivery_invoice_address', help="Allows you to specify different delivery and invoice addresses on a purchase order."), - 'module_purchase_analytic_plans': fields.boolean('Allow using multiple analytic accounts on the same order', - help ="""Allows the user to maintain several analysis plans. These let you split - lines on a purchase order between several accounts and analytic plans. - This installs the module purchase_analytic_plans."""), 'module_warning': fields.boolean("Alerts by products or supplier", help="""Allow to configure warnings on products and trigger them when a user wants to purchase a given product or a given supplier. Example: Product: this product is deprecated, do not purchase more than 5. @@ -62,6 +58,12 @@ class purchase_config_settings(osv.osv_memory): help="""Purchase Requisitions are used when you want to request quotations from several suppliers for a given set of products. You can configure per product if you directly do a Request for Quotation to one supplier or if you want a purchase requisition to negotiate with several suppliers."""), + 'module_purchase_analytic_plans': fields.boolean('Use multiple analytic accounts on purchase orders', + help ="""Allows the user to maintain several analysis plans. These let you split lines on a purchase order between several accounts and analytic plans. + This installs the module purchase_analytic_plans."""), + 'group_analytic_account_for_purchases': fields.boolean('Analytic accounting for purchases', + implied_group='purchase.group_analytic_accounting', + help="Allows you to specify an analytic account on purchase orders."), } _defaults = { @@ -75,7 +77,8 @@ class account_config_settings(osv.osv_memory): _inherit = 'account.config.settings' _columns = { 'module_purchase_analytic_plans': fields.boolean('Use multiple analytic accounts on orders', - help="""This allows install module purchase_analytic_plans."""), + help ="""Allows the user to maintain several analysis plans. These let you split lines on a purchase order between several accounts and analytic plans. + This installs the module purchase_analytic_plans."""), 'group_analytic_account_for_purchases': fields.boolean('Analytic accounting for purchases', implied_group='purchase.group_analytic_accounting', help="Allows you to specify an analytic account on purchase orders."), diff --git a/addons/purchase/res_config_view.xml b/addons/purchase/res_config_view.xml index 6453752a638..f659d7b437f 100644 --- a/addons/purchase/res_config_view.xml +++ b/addons/purchase/res_config_view.xml @@ -74,6 +74,10 @@ <field name="module_purchase_analytic_plans" class="oe_inline"/> <label for="module_purchase_analytic_plans"/> </div> + <div> + <field name="group_analytic_account_for_purchases" class="oe_inline"/> + <label for="group_analytic_account_for_purchases"/> + </div> </div> </group> </form> diff --git a/addons/purchase/stock_view.xml b/addons/purchase/stock_view.xml index 21c52b4d2ec..d248ef66160 100644 --- a/addons/purchase/stock_view.xml +++ b/addons/purchase/stock_view.xml @@ -11,16 +11,6 @@ </xpath> </field> </record> - <record id="stock_picking_inherit_purchase" model="ir.ui.view"> - <field name="name">Picking list</field> - <field name="model">stock.picking</field> - <field name="inherit_id" ref="stock.view_picking_form"/> - <field name="arch" type="xml"> - <field name="auto_picking" position="after"> - <field name="purchase_id" invisible="1"/> - </field> - </field> - </record> <record id="stock_picking_in_inherit_purchase" model="ir.ui.view"> <field name="name">Incoming Picking Inherited</field> @@ -36,63 +26,18 @@ </field> </record> - <!-- Picking to Invoice --> - <record id="view_picking_in_search_picking_to_invoice" model="ir.ui.view"> - <field name="name">stock.picking.in.search</field> + <record id="view_picking_in_search_picking_inherit" model="ir.ui.view"> + <field name="name">stock.picking.in.search.inherit</field> <field name="model">stock.picking.in</field> + <field name="inherit_id" ref="stock.view_picking_in_search"/> <field name="arch" type="xml"> - <search string="Picking to Invoice"> - <field name="name" string="Picking to Invoice" filter_domain="['|',('name','ilike',self),('origin','ilike',self)]"/> - <filter icon="terp-check" name="available" string="Available" domain="[('state','=','assigned')]" help="Incoming Shipments Available"/> - <filter icon="terp-dialog-close" name="done" string="Received" domain="[('state','=','done')]" help="Incoming Shipments already Received"/> - <separator/> - <filter icon="terp-accessories-archiver-minus" string="Back Orders" domain="[('backorder_id', '!=', False)]" help="Is a Back Order"/> - <separator/> - <filter string="To Invoice" name="to_invoice" icon="terp-dolar" domain="[('invoice_state', '=', '2binvoiced')]"/> - <field name="stock_journal_id"/> - <field name="company_id" groups="base.group_multi_company"/> - <field name="purchase_id" /> - <group expand="0" string="Group By..." colspan="4" col="8"> - <filter icon="terp-stock_effects-object-colorize" name="Status" string="Status" domain="[]" context="{'group_by':'state'}"/> - <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date'}"/> - <filter string="Scheduled Date" icon="terp-go-month" domain="[]" context="{'group_by':'min_date'}"/> - <filter string="Journal" icon="terp-folder-orange" domain="[]" context="{'group_by':'stock_journal_id'}"/> - </group> - </search> + <xpath expr="//field[@name='product_id']" position="before"> + <field name="purchase_id"/> + </xpath> </field> </record> - <record id="act_purchase_order_2_stock_picking" model="ir.actions.act_window"> - <field name="name">Incoming Shipments</field> - <field name="res_model">stock.picking.in</field> - <field name="type">ir.actions.act_window</field> - <field name="view_type">form</field> - <field name="view_mode">tree,form,calendar</field> - <field name="domain">[('type','=','in')]</field> - <field name="context">{'search_default_purchase_id': active_id,'default_type': 'in'}</field> - <field name="search_view_id" ref="view_picking_in_search_picking_to_invoice"/> - </record> - - <record id="act_purchase_order_2_stock_picking_tree" model="ir.actions.act_window.view"> - <field eval="1" name="sequence"/> - <field name="view_mode">tree</field> - <field name="view_id" ref="stock.view_picking_in_tree"/> - <field name="act_window_id" ref="act_purchase_order_2_stock_picking"/> - </record> - - <record id="act_purchase_order_2_stock_picking_form" model="ir.actions.act_window.view"> - <field eval="2" name="sequence"/> - <field name="view_mode">form</field> - <field name="view_id" ref="stock.view_picking_in_form"/> - <field name="act_window_id" ref="act_purchase_order_2_stock_picking"/> - </record> - - <record id="act_purchase_order_2_stock_picking_calendar" model="ir.actions.act_window.view"> - <field eval="3" name="sequence"/> - <field name="view_mode">calendar</field> - <field name="view_id" ref="stock.stock_picking_in_calendar"/> - <field name="act_window_id" ref="act_purchase_order_2_stock_picking"/> - </record> + <!-- is it need ? we have another method "Receive Products"--> <record id="purchase_order_2_stock_picking" model="ir.ui.view"> <field name="name">Purchase Picking Inherited</field> <field name="model">purchase.order</field> @@ -100,8 +45,8 @@ <field name="arch" type="xml"> <xpath expr="//div[contains(@class, 'oe_title')]" position="before"> <div class="oe_right oe_button_box" name="buttons"> - <button type="action" - name="%(act_purchase_order_2_stock_picking)d" + <button type="object" + name="view_picking" string="Incoming Shipments" states="approved"/> </div> </xpath> @@ -110,13 +55,13 @@ <record id="action_picking_tree4_picking_to_invoice" model="ir.actions.act_window"> <field name="name">On Incoming Shipments</field> - <field name="res_model">stock.picking</field> + <field name="res_model">stock.picking.in</field> <field name="type">ir.actions.act_window</field> <field name="view_type">form</field> <field name="view_mode">tree,form,calendar</field> <field name="domain">[('type','=','in')]</field> <field name="context">{"default_type": "in", "contact_display": "partner_address", "search_default_done": 1, "search_default_to_invoice": 1}</field> - <field name="search_view_id" ref="view_picking_in_search_picking_to_invoice"/> + <field name="search_view_id" ref="stock.view_picking_in_search"/> <field name="help" type="html"> <p> Here you can track all the product receptions of purchase diff --git a/addons/sale/sale.py b/addons/sale/sale.py index ba85a62ca1d..feaf411cb54 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -771,7 +771,8 @@ class sale_order(osv.osv): 'default_res_id': ids[0], 'default_use_template': True, 'default_template_id': template_id, - }) + 'mark_so_as_sent': True + }) return { 'view_type': 'form', 'view_mode': 'form', @@ -1476,15 +1477,14 @@ class sale_order_line(osv.osv): sale_order_line() -class mail_message(osv.osv): - _inherit = 'mail.message' - - def _postprocess_sent_message(self, cr, uid, message, context=None): - if message.model == 'sale.order': +class mail_compose_message(osv.osv): + _inherit = 'mail.compose.message' + def send_mail(self, cr, uid, ids, context=None): + context = context or {} + if context.get('mark_so_as_sent', False) and context.get('default_res_id', False): wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'sale.order', message.res_id, 'quotation_sent', cr) - return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context) - -mail_message() + wf_service.trg_validate(uid, 'sale.order', context.get('default_res_id', False), 'quotation_sent', cr) + return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context) +mail_compose_message() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml index be871b87796..e54ba158b9b 100644 --- a/addons/sale_crm/sale_crm_view.xml +++ b/addons/sale_crm/sale_crm_view.xml @@ -9,8 +9,8 @@ <field name="arch" type="xml"> <data> <xpath expr="/form/header/button[@name='case_mark_lost']" position="after"> - <button states="done" string="Convert to Quote" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/> - <button states="draft,open,pending" string="Convert to Quote" name="%(action_crm_make_sale)d" type="action"/> + <button states="done" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/> + <button states="draft,open,pending" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action"/> </xpath> </data> </field> diff --git a/addons/stock/stock.py b/addons/stock/stock.py index f96c3582a6d..5b7acea2d86 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -673,6 +673,13 @@ class stock_picking(osv.osv): ] def action_process(self, cr, uid, ids, context=None): + if context is None: + context = {} + context.update({ + 'active_model': self._name, + 'active_ids': ids, + 'active_id': len(ids) and ids[0] or False + }) return { 'view_type': 'form', 'view_mode': 'form', diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py index 68e053b9e22..2cf0a743faa 100644 --- a/addons/stock/wizard/stock_partial_picking.py +++ b/addons/stock/wizard/stock_partial_picking.py @@ -107,21 +107,10 @@ class stock_partial_picking(osv.osv_memory): picking_ids = context.get('active_ids', []) active_model = context.get('active_model') - if active_model == 'purchase.order': - for purchase_order in self.pool.get('purchase.order').browse(cr, uid, picking_ids, context=context): - picking_ids = [picking_id.id for picking_id in purchase_order.picking_ids] - elif active_model == 'sale.order': - for sale_order in self.pool.get('sale.order').browse(cr, uid, picking_ids, context=context): - picking_ids = [picking.id for picking in sale_order.picking_ids] - if not picking_ids or len(picking_ids) != 1: # Partial Picking Processing may only be done for one picking at a time return res - # The check about active_model is there in case the client mismatched the context during propagation of it - # (already seen in previous bug where context passed was containing ir.ui.menu as active_model and the menu - # ID as active_id). Though this should be fixed in clients now, this place is sensitive enough to ensure the - # consistancy of the context. - assert active_model in ('stock.picking', 'stock.picking.in', 'stock.picking.out', 'purchase.order', 'sale.order'), 'Bad context propagation' + assert active_model in ('stock.picking', 'stock.picking.in', 'stock.picking.out'), 'Bad context propagation' picking_id, = picking_ids if 'picking_id' in fields: res.update(picking_id=picking_id) diff --git a/addons/web_linkedin/static/src/xml/linkedin.xml b/addons/web_linkedin/static/src/xml/linkedin.xml index 1a8009ab066..4956fd7df5a 100644 --- a/addons/web_linkedin/static/src/xml/linkedin.xml +++ b/addons/web_linkedin/static/src/xml/linkedin.xml @@ -30,7 +30,7 @@ <t t-name="LinkedIn.DisabledWarning"> <div> LinkedIn access was not enabled on this server. - Please ask your administrator to configure it in Settings > Configuration > Linkedin. + Please ask your administrator to configure it in Settings > Configuration > Sales > Social Network Integration. </div> </t> </templates>
\ No newline at end of file |
