diff --git a/addons/account_accountant/i18n/es_AR.po b/addons/account_accountant/i18n/es_AR.po new file mode 100644 index 00000000000..0e2684b0431 --- /dev/null +++ b/addons/account_accountant/i18n/es_AR.po @@ -0,0 +1,23 @@ +# Spanish (Argentina) translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:04+0000\n" +"PO-Revision-Date: 2013-10-07 21:16+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Spanish (Argentina) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-08 05:42+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: account_accountant +#: model:ir.actions.client,name:account_accountant.action_client_account_menu +msgid "Open Accounting Menu" +msgstr "" diff --git a/addons/account_cancel/i18n/et.po b/addons/account_cancel/i18n/et.po new file mode 100644 index 00000000000..440850791a7 --- /dev/null +++ b/addons/account_cancel/i18n/et.po @@ -0,0 +1,23 @@ +# Estonian translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-10-09 14:39+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: account_cancel +#: view:account.invoice:0 +msgid "Cancel" +msgstr "" diff --git a/addons/auth_crypt/i18n/et.po b/addons/auth_crypt/i18n/et.po index a634e17faa5..cbe529a053d 100644 --- a/addons/auth_crypt/i18n/et.po +++ b/addons/auth_crypt/i18n/et.po @@ -1,30 +1,28 @@ # Estonian translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. +# FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-12-03 16:03+0000\n" -"PO-Revision-Date: 2011-10-10 19:33+0000\n" -"Last-Translator: Aare Vesi \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-10-09 14:40+0000\n" +"Last-Translator: FULL NAME \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-04 05:53+0000\n" -"X-Generator: Launchpad (build 16335)\n" +"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n" +"X-Generator: Launchpad (build 16799)\n" -#. module: base_crypt -#: model:ir.model,name:base_crypt.model_res_users +#. module: auth_crypt +#: field:res.users,password_crypt:0 +msgid "Encrypted Password" +msgstr "Krüpteeritud Parool" + +#. module: auth_crypt +#: model:ir.model,name:auth_crypt.model_res_users msgid "Users" -msgstr "" - -#, python-format -#~ msgid "Error" -#~ msgstr "Viga" - -#~ msgid "res.users" -#~ msgstr "res.users" +msgstr "Kasutajad" diff --git a/addons/auth_oauth_signup/i18n/et.po b/addons/auth_oauth_signup/i18n/et.po new file mode 100644 index 00000000000..2d159250cff --- /dev/null +++ b/addons/auth_oauth_signup/i18n/et.po @@ -0,0 +1,23 @@ +# Estonian translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-10-09 14:34+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: auth_oauth_signup +#: model:ir.model,name:auth_oauth_signup.model_res_users +msgid "Users" +msgstr "Kasutajad" diff --git a/addons/base_report_designer/i18n/hi.po b/addons/base_report_designer/i18n/hi.po new file mode 100644 index 00000000000..660f5e3d429 --- /dev/null +++ b/addons/base_report_designer/i18n/hi.po @@ -0,0 +1,185 @@ +# Hindi translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-10-09 05:55+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Hindi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: base_report_designer +#: model:ir.model,name:base_report_designer.model_base_report_sxw +msgid "base.report.sxw" +msgstr "base.report.sxw" + +#. module: base_report_designer +#: view:base_report_designer.installer:0 +msgid "OpenERP Report Designer Configuration" +msgstr "" + +#. module: base_report_designer +#: view:base_report_designer.installer:0 +msgid "" +"This plug-in allows you to create/modify OpenERP Reports into OpenOffice " +"Writer." +msgstr "" + +#. module: base_report_designer +#: view:base.report.sxw:0 +msgid "Upload the modified report" +msgstr "" + +#. module: base_report_designer +#: view:base.report.file.sxw:0 +msgid "The .SXW report" +msgstr "" + +#. module: base_report_designer +#: model:ir.model,name:base_report_designer.model_base_report_designer_installer +msgid "base_report_designer.installer" +msgstr "" + +#. module: base_report_designer +#: model:ir.model,name:base_report_designer.model_base_report_rml_save +msgid "base.report.rml.save" +msgstr "" + +#. module: base_report_designer +#: view:base_report_designer.installer:0 +msgid "Configure" +msgstr "" + +#. module: base_report_designer +#: view:base_report_designer.installer:0 +msgid "title" +msgstr "" + +#. module: base_report_designer +#: field:base.report.file.sxw,report_id:0 +#: field:base.report.sxw,report_id:0 +msgid "Report" +msgstr "" + +#. module: base_report_designer +#: view:base.report.rml.save:0 +msgid "The RML Report" +msgstr "" + +#. module: base_report_designer +#: model:ir.ui.menu,name:base_report_designer.menu_action_report_designer_wizard +msgid "Report Designer" +msgstr "" + +#. module: base_report_designer +#: field:base_report_designer.installer,name:0 +msgid "File name" +msgstr "" + +#. module: base_report_designer +#: view:base.report.file.sxw:0 +#: view:base.report.sxw:0 +msgid "Get a report" +msgstr "" + +#. module: base_report_designer +#: view:base_report_designer.installer:0 +#: model:ir.actions.act_window,name:base_report_designer.action_report_designer_wizard +msgid "OpenERP Report Designer" +msgstr "" + +#. module: base_report_designer +#: view:base.report.sxw:0 +msgid "Continue" +msgstr "" + +#. module: base_report_designer +#: field:base.report.rml.save,file_rml:0 +msgid "Save As" +msgstr "" + +#. module: base_report_designer +#: help:base_report_designer.installer,plugin_file:0 +msgid "" +"OpenObject Report Designer plug-in file. Save as this file and install this " +"plug-in in OpenOffice." +msgstr "" + +#. module: base_report_designer +#: view:base.report.rml.save:0 +msgid "Save RML FIle" +msgstr "" + +#. module: base_report_designer +#: field:base.report.file.sxw,file_sxw:0 +#: field:base.report.file.sxw,file_sxw_upload:0 +msgid "Your .SXW file" +msgstr "" + +#. module: base_report_designer +#: view:base_report_designer.installer:0 +msgid "Installation and Configuration Steps" +msgstr "" + +#. module: base_report_designer +#: field:base_report_designer.installer,description:0 +msgid "Description" +msgstr "" + +#. module: base_report_designer +#: view:base.report.file.sxw:0 +msgid "" +"This is the template of your requested report.\n" +"Save it as a .SXW file and open it with OpenOffice.\n" +"Don't forget to install the OpenERP SA OpenOffice package to modify it.\n" +"Once it is modified, re-upload it in OpenERP using this wizard." +msgstr "" + +#. module: base_report_designer +#: model:ir.actions.act_window,name:base_report_designer.action_view_base_report_sxw +msgid "Base Report sxw" +msgstr "" + +#. module: base_report_designer +#: model:ir.model,name:base_report_designer.model_base_report_file_sxw +msgid "base.report.file.sxw" +msgstr "" + +#. module: base_report_designer +#: field:base_report_designer.installer,plugin_file:0 +msgid "OpenObject Report Designer Plug-in" +msgstr "" + +#. module: base_report_designer +#: model:ir.actions.act_window,name:base_report_designer.action_report_designer_installer +msgid "OpenERP Report Designer Installation" +msgstr "" + +#. module: base_report_designer +#: view:base.report.sxw:0 +msgid "Cancel" +msgstr "" + +#. module: base_report_designer +#: view:base.report.sxw:0 +msgid "or" +msgstr "" + +#. module: base_report_designer +#: model:ir.model,name:base_report_designer.model_ir_actions_report_xml +msgid "ir.actions.report.xml" +msgstr "" + +#. module: base_report_designer +#: view:base.report.sxw:0 +msgid "Select your report" +msgstr "" diff --git a/addons/claim_from_delivery/i18n/et.po b/addons/claim_from_delivery/i18n/et.po new file mode 100644 index 00000000000..312e096ffde --- /dev/null +++ b/addons/claim_from_delivery/i18n/et.po @@ -0,0 +1,33 @@ +# Estonian translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-10-09 14:42+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: claim_from_delivery +#: view:stock.picking.out:0 +msgid "Claims" +msgstr "Nõuded" + +#. module: claim_from_delivery +#: model:res.request.link,name:claim_from_delivery.request_link_claim_from_delivery +msgid "Delivery Order" +msgstr "Tarnetellimus" + +#. module: claim_from_delivery +#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery +msgid "Claim From Delivery" +msgstr "" diff --git a/addons/crm_todo/i18n/et.po b/addons/crm_todo/i18n/et.po new file mode 100644 index 00000000000..4e08132360c --- /dev/null +++ b/addons/crm_todo/i18n/et.po @@ -0,0 +1,85 @@ +# Estonian translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-10-09 15:39+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: crm_todo +#: model:ir.model,name:crm_todo.model_project_task +msgid "Task" +msgstr "Ülesanne" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Timebox" +msgstr "Ajalahter" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Lead" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "For cancelling the task" +msgstr "Ülesande katkestamiseks" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Next" +msgstr "Järgmine" + +#. module: crm_todo +#: model:ir.actions.act_window,name:crm_todo.crm_todo_action +#: model:ir.ui.menu,name:crm_todo.menu_crm_todo +msgid "My Tasks" +msgstr "Minu ülesanded" + +#. module: crm_todo +#: view:crm.lead:0 +#: field:crm.lead,task_ids:0 +msgid "Tasks" +msgstr "Ülesanded" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Done" +msgstr "Valmis" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Cancel" +msgstr "Katkesta" + +#. module: crm_todo +#: model:ir.model,name:crm_todo.model_crm_lead +msgid "Lead/Opportunity" +msgstr "" + +#. module: crm_todo +#: field:project.task,lead_id:0 +msgid "Lead / Opportunity" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "For changing to done state" +msgstr "" + +#. module: crm_todo +#: view:crm.lead:0 +msgid "Previous" +msgstr "Eelmine" diff --git a/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py b/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py index 87425b9cb3f..3b73920cf7d 100644 --- a/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py +++ b/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py @@ -133,7 +133,7 @@ class hr_si_project(osv.osv_memory): def check_state(self, cr, uid, ids, context=None): obj_model = self.pool.get('ir.model.data') - emp_id = self.default_get(cr, uid, context)['emp_id'] + emp_id = self.default_get(cr, uid, ['emp_id'], context)['emp_id'] # get the latest action (sign_in or out) for this employee cr.execute('select action from hr_attendance where employee_id=%s and action in (\'sign_in\',\'sign_out\') order by name desc limit 1', (emp_id,)) res = (cr.fetchone() or ('sign_out',))[0] diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js index bcd8aa7f7f2..d279093b36e 100644 --- a/addons/point_of_sale/static/src/js/widgets.js +++ b/addons/point_of_sale/static/src/js/widgets.js @@ -143,7 +143,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa var self = this; this._super(); this.$el.click(function(){ - self.order.selectLine(this.model); + self.order.selectLine(self.model); self.trigger('order_line_selected'); }); if(this.model.is_selected()){ diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 4d025d15cb4..d86f635d749 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -93,8 +93,7 @@
-
diff --git a/addons/sale/i18n/hi.po b/addons/sale/i18n/hi.po new file mode 100644 index 00000000000..075835fe5ac --- /dev/null +++ b/addons/sale/i18n/hi.po @@ -0,0 +1,2132 @@ +# Hindi translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:04+0000\n" +"PO-Revision-Date: 2013-10-10 09:57+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Hindi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-10-11 04:49+0000\n" +"X-Generator: Launchpad (build 16799)\n" + +#. module: sale +#: model:res.groups,name:sale.group_analytic_accounting +msgid "Analytic Accounting for Sales" +msgstr "" + +#. module: sale +#: model:process.transition,name:sale.process_transition_confirmquotation0 +msgid "Confirm Quotation" +msgstr "" + +#. module: sale +#: view:board.board:0 +msgid "Sales Dashboard" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:92 +#, python-format +msgid "There is no income account defined as global property." +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_order_line_tree2 +#: model:ir.ui.menu,name:sale.menu_invoicing_sales_order_lines +msgid "Order Lines to Invoice" +msgstr "" + +#. module: sale +#: field:sale.order,date_confirm:0 +msgid "Confirmation Date" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: view:sale.order.line:0 +#: view:sale.report:0 +msgid "Group By..." +msgstr "" + +#. module: sale +#: field:sale.order.line,address_allotment_id:0 +msgid "Allotment Partner" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_view_sale_advance_payment_inv +msgid "Invoice Order" +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "Product Features" +msgstr "" + +#. module: sale +#: help:sale.config.settings,module_account_analytic_analysis:0 +msgid "" +"Allows to define your customer contracts conditions: invoicing\n" +" method (fixed price, on timesheet, advance invoice), the exact " +"pricing\n" +" (650€/day for a developer), the duration (one year support " +"contract).\n" +" You will be able to follow the progress of the contract and " +"invoice automatically.\n" +" It installs the account_analytic_analysis module." +msgstr "" + +#. module: sale +#: model:email.template,report_name:sale.email_template_edi_sale +msgid "" +"${(object.name or '').replace('/','_')}_${object.state == 'draft' and " +"'draft' or ''}" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +#: field:sale.report,product_uom:0 +msgid "Unit of Measure" +msgstr "" + +#. module: sale +#: field:sale.order.line,type:0 +msgid "Procurement Method" +msgstr "" + +#. module: sale +#: help:sale.order,date_confirm:0 +msgid "Date on which sales order is confirmed." +msgstr "" + +#. module: sale +#: field:account.config.settings,module_sale_analytic_plans:0 +msgid "Use multiple analytic accounts on sales" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "March" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:565 +#, python-format +msgid "First cancel all invoices attached to this sales order." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Quotation Number" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: field:sale.order,message_unread:0 +msgid "Unread Messages" +msgstr "" + +#. module: sale +#: field:sale.order,company_id:0 +#: field:sale.order.line,company_id:0 +#: view:sale.report:0 +#: field:sale.report,company_id:0 +#: field:sale.shop,company_id:0 +msgid "Company" +msgstr "" + +#. module: sale +#: field:sale.make.invoice,invoice_date:0 +msgid "Invoice Date" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_order_line_tree3 +msgid "Uninvoiced and Delivered Lines" +msgstr "" + +#. module: sale +#: model:mail.message.subtype,description:sale.mt_order_confirmed +msgid "Quotation confirmed" +msgstr "" + +#. module: sale +#: selection:sale.order,state:0 +#: selection:sale.report,state:0 +msgid "Invoice Exception" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Quotation " +msgstr "" + +#. module: sale +#: selection:sale.order,state:0 +msgid "Draft Quotation" +msgstr "" + +#. module: sale +#: field:sale.order,partner_shipping_id:0 +msgid "Delivery Address" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,analytic_account_id:0 +#: field:sale.shop,project_id:0 +msgid "Analytic Account" +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_sale_journal:0 +msgid "Allow batch invoicing of delivery orders through journals" +msgstr "" + +#. module: sale +#: field:sale.order.line,price_subtotal:0 +msgid "Subtotal" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,day:0 +msgid "Day" +msgstr "" + +#. module: sale +#: model:process.transition.action,name:sale.process_transition_action_cancelorder0 +#: view:sale.order:0 +msgid "Cancel Order" +msgstr "" + +#. module: sale +#: field:sale.order.line,th_weight:0 +msgid "Weight" +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "Warehouse Features" +msgstr "" + +#. module: sale +#: field:sale.config.settings,time_unit:0 +msgid "The default working time unit for services is" +msgstr "" + +#. module: sale +#: field:sale.order.line,product_uom:0 +msgid "Unit of Measure " +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:101 +#, python-format +msgid "Incorrect Data" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:102 +#, python-format +msgid "The value of Advance Amount must be positive." +msgstr "" + +#. module: sale +#: help:sale.config.settings,group_discount_per_so_line:0 +msgid "Allows you to apply some discount per sales order line." +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Sales Order Lines that are in 'done' state" +msgstr "" + +#. module: sale +#: selection:sale.order.line,type:0 +msgid "on order" +msgstr "" + +#. module: sale +#: field:sale.order,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: sale +#: field:sale.report,state:0 +msgid "Order Status" +msgstr "" + +#. module: sale +#: field:sale.order,amount_tax:0 +#: field:sale.order.line,tax_id:0 +msgid "Taxes" +msgstr "" + +#. module: sale +#: field:sale.order,amount_untaxed:0 +msgid "Untaxed Amount" +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_project:0 +msgid "Project" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:185 +#: code:addons/sale/sale.py:363 +#: code:addons/sale/sale.py:504 +#: code:addons/sale/sale.py:598 +#: code:addons/sale/sale.py:763 +#: code:addons/sale/sale.py:780 +#, python-format +msgid "Error!" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Net Total :" +msgstr "" + +#. module: sale +#: help:sale.order.line,type:0 +msgid "" +"From stock: When needed, the product is taken from the stock or we wait for " +"replenishment.\n" +"On order: When needed, the product is purchased or produced." +msgstr "" + +#. module: sale +#: help:sale.config.settings,module_analytic_user_function:0 +msgid "" +"Allows you to define what is the default function of a specific user on a " +"given account.\n" +" This is mostly used when a user encodes his timesheet. The " +"values are retrieved and the fields are auto-filled.\n" +" But the possibility to change these values is still " +"available.\n" +" This installs the module analytic_user_function." +msgstr "" + +#. module: sale +#: selection:sale.order,state:0 +#: selection:sale.order.line,state:0 +#: selection:sale.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Sales Order Lines related to a Sales Order of mine" +msgstr "" + +#. module: sale +#: selection:sale.order,state:0 +msgid "Quotation Sent" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + +#. module: sale +#: help:sale.order,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "sale" + +#. module: sale +#: selection:sale.order,state:0 +#: selection:sale.report,state:0 +msgid "Shipping Exception" +msgstr "" + +#. module: sale +#: field:sale.order.line,product_uos_qty:0 +msgid "Quantity (UoS)" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_shop_form +#: field:sale.order,shop_id:0 +#: view:sale.report:0 +#: field:sale.report,shop_id:0 +msgid "Shop" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_orders_exception +msgid "Sales in Exception" +msgstr "" + +#. module: sale +#: field:sale.order,partner_invoice_id:0 +msgid "Invoice Address" +msgstr "" + +#. module: sale +#: help:sale.order,create_date:0 +msgid "Date on which sales order is created." +msgstr "" + +#. module: sale +#: view:res.partner:0 +msgid "False" +msgstr "" + +#. module: sale +#: help:sale.advance.payment.inv,advance_payment_method:0 +msgid "" +"Use All to create the final invoice.\n" +" Use Percentage to invoice a percentage of the total amount.\n" +" Use Fixed Price to invoice a specific amound in advance.\n" +" Use Some Order Lines to invoice a selection of the sales " +"order lines." +msgstr "" + +#. module: sale +#: view:sale.make.invoice:0 +#: view:sale.order.line.make.invoice:0 +msgid "Create Invoices" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Tax" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:277 +#: code:addons/sale/sale.py:820 +#: code:addons/sale/sale.py:983 +#, python-format +msgid "Invalid Action!" +msgstr "" + +#. module: sale +#: help:sale.order,state:0 +msgid "" +"Gives the status of the quotation or sales order. \n" +"The exception status is automatically set when a cancel operation occurs " +" in the invoice validation (Invoice Exception) or in the picking " +"list process (Shipping Exception).\n" +"The 'Waiting Schedule' status is set when the invoice is confirmed " +" but waiting for the scheduler to run on the order date." +msgstr "" + +#. module: sale +#: field:sale.report,date_confirm:0 +msgid "Date Confirm" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,nbr:0 +msgid "# of Lines" +msgstr "" + +#. module: sale +#: help:sale.order,message_summary:0 +msgid "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." +msgstr "" + +#. module: sale +#: help:sale.order.line,sequence:0 +msgid "Gives the sequence order when displaying a list of sales order lines." +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,product_uom_qty:0 +msgid "# of Qty" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Fax :" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:277 +#, python-format +msgid "" +"In order to delete a confirmed sales order, you must cancel it before !" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "(update)" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_res_partner +#: view:sale.report:0 +#: field:sale.report,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "Contract Features" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:287 +#: code:addons/sale/sale.py:584 +#: model:ir.model,name:sale.model_sale_order +#: model:process.node,name:sale.process_node_order0 +#: model:process.node,name:sale.process_node_saleorder0 +#: field:res.partner,sale_order_ids:0 +#: model:res.request.link,name:sale.req_link_sale_order +#: view:sale.order:0 +#: selection:sale.order,state:0 +#, python-format +msgid "Sales Order" +msgstr "" + +#. module: sale +#: model:res.groups,name:sale.group_invoice_so_lines +msgid "Enable Invoicing Sales order lines" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale +#: field:sale.advance.payment.inv,amount:0 +msgid "Advance Amount" +msgstr "" + +#. module: sale +#: help:sale.order,invoice_exists:0 +msgid "It indicates that sales order has at least one invoice." +msgstr "" + +#. module: sale +#: help:sale.config.settings,group_sale_pricelist:0 +msgid "" +"Allows to manage different prices based on rules per category of customers.\n" +"Example: 10% for retailers, promotion of 5 EUR on this product, etc." +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_analytic_user_function:0 +msgid "One employee can have different roles per contract" +msgstr "" + +#. module: sale +#: selection:sale.advance.payment.inv,advance_payment_method:0 +msgid "Invoice the whole sales order" +msgstr "" + +#. module: sale +#: field:sale.shop,payment_default_id:0 +msgid "Default Payment Term" +msgstr "" + +#. module: sale +#: model:process.transition.action,name:sale.process_transition_action_confirm0 +msgid "Confirm" +msgstr "" + +#. module: sale +#: field:sale.config.settings,timesheet:0 +msgid "Prepare invoices based on timesheets" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:820 +#, python-format +msgid "You cannot cancel a sales order line that has already been invoiced." +msgstr "" + +#. module: sale +#: view:account.invoice.report:0 +#: view:board.board:0 +#: model:ir.actions.act_window,name:sale.action_turnover_by_month +msgid "Monthly Turnover" +msgstr "" + +#. module: sale +#: selection:sale.order,invoice_quantity:0 +msgid "Shipped Quantities" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,year:0 +msgid "Year" +msgstr "" + +#. module: sale +#: field:sale.config.settings,group_uom:0 +msgid "Allow using different units of measures" +msgstr "" + +#. module: sale +#: model:mail.message.subtype,name:sale.mt_order_confirmed +msgid "Sales Order Confirmed" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Sales Order that haven't yet been confirmed" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Print" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Order N°" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: field:sale.order,order_line:0 +msgid "Order Lines" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Disc.(%)" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:764 +#, python-format +msgid "Please define income account for this product: \"%s\" (id:%d)." +msgstr "" + +#. module: sale +#: field:sale.order.line,invoice_lines:0 +msgid "Invoice Lines" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,price_total:0 +msgid "Total Price" +msgstr "" + +#. module: sale +#: help:account.config.settings,group_analytic_account_for_sales:0 +msgid "Allows you to specify an analytic account on sales orders." +msgstr "" + +#. module: sale +#: help:sale.config.settings,module_sale_journal:0 +msgid "" +"Allows you to categorize your sales and deliveries (picking lists) between " +"different journals,\n" +" and perform batch operations on journals.\n" +" This installs the module sale_journal." +msgstr "" + +#. module: sale +#: help:sale.make.invoice,grouped:0 +msgid "Check the box to group the invoices for the same customers" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_sale_order_make_invoice +#: model:ir.actions.act_window,name:sale.action_view_sale_order_line_make_invoice +msgid "Make Invoices" +msgstr "" + +#. module: sale +#: code:addons/sale/res_config.py:97 +#, python-format +msgid "Hour" +msgstr "" + +#. module: sale +#: field:res.partner,sale_order_count:0 +msgid "# of Sales Order" +msgstr "" + +#. module: sale +#: help:sale.config.settings,timesheet:0 +msgid "" +"For modifying account analytic view to show important data to project " +"manager of services companies.\n" +" You can also view the report of account analytic summary " +"user-wise as well as month wise.\n" +" This installs the module account_analytic_analysis." +msgstr "" + +#. module: sale +#: field:sale.order,create_date:0 +msgid "Creation Date" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "To Invoice" +msgstr "" + +#. module: sale +#: help:sale.order,partner_invoice_id:0 +msgid "Invoice address for current sales order." +msgstr "" + +#. module: sale +#: selection:sale.order,invoice_quantity:0 +msgid "Ordered Quantities" +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "Ordered Year of the sales order" +msgstr "" + +#. module: sale +#: model:res.groups,name:sale.group_delivery_invoice_address +msgid "Addresses in Sales Orders" +msgstr "" + +#. module: sale +#: field:sale.advance.payment.inv,qtty:0 +#: report:sale.order:0 +#: field:sale.order.line,product_uom_qty:0 +msgid "Quantity" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Total :" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Sales Order Lines ready to be invoiced" +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "My Sales" +msgstr "" + +#. module: sale +#: field:sale.order,name:0 +#: field:sale.order.line,order_id:0 +msgid "Order Reference" +msgstr "" + +#. module: sale +#: field:sale.order,fiscal_position:0 +msgid "Fiscal Position" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "July" +msgstr "" + +#. module: sale +#: help:sale.order.line,state:0 +msgid "" +"* The 'Draft' status is set when the related sales order in draft status. " +" \n" +"* The 'Confirmed' status is set when the related sales order is confirmed. " +" \n" +"* The 'Exception' status is set when the related sales order is set as " +"exception. \n" +"* The 'Done' status is set when the sales order line has been picked. " +" \n" +"* The 'Cancelled' status is set when a user cancel the sales order related." +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "Default Options" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:960 +#: code:addons/sale/wizard/sale_make_invoice_advance.py:91 +#: code:addons/sale/wizard/sale_make_invoice_advance.py:95 +#, python-format +msgid "Configuration Error!" +msgstr "" + +#. module: sale +#: field:account.config.settings,group_analytic_account_for_sales:0 +msgid "Analytic accounting for sales" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: field:sale.order,state:0 +#: view:sale.order.line:0 +#: field:sale.order.line,state:0 +#: view:sale.report:0 +msgid "Status" +msgstr "" + +#. module: sale +#: view:sale.advance.payment.inv:0 +msgid "" +"After clicking 'Show Lines to Invoice', select lines to invoice and create " +"the invoice from the 'More' dropdown menu." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Send by Email" +msgstr "" + +#. module: sale +#: code:addons/sale/edi/sale_order.py:140 +#, python-format +msgid "EDI Pricelist (%s)" +msgstr "" + +#. module: sale +#: selection:sale.order,order_policy:0 +msgid "On Delivery Order" +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "Invoicing Process" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Order Date" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Sales Order done" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:364 +#, python-format +msgid "Please define sales journal for this company: \"%s\" (id:%d)." +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.act_res_partner_2_sale_order +#: view:res.partner:0 +msgid "Quotations and Sales" +msgstr "" + +#. module: sale +#: field:sale.order,invoiced:0 +msgid "Paid" +msgstr "" + +#. module: sale +#: help:sale.config.settings,group_uom:0 +msgid "" +"Allows you to select and maintain different units of measure for products." +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "Reference Unit of Measure" +msgstr "" + +#. module: sale +#: view:sale.advance.payment.inv:0 +msgid "Create and View Invoice" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Sales order lines done" +msgstr "" + +#. module: sale +#: field:sale.make.invoice,grouped:0 +msgid "Group the invoices" +msgstr "" + +#. module: sale +#: help:sale.advance.payment.inv,amount:0 +msgid "The amount to be invoiced in advance." +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_make_invoice +msgid "Sales Make Invoice" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:307 +#, python-format +msgid "Pricelist Warning!" +msgstr "" + +#. module: sale +#: field:sale.order.line,discount:0 +msgid "Discount (%)" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_line_invoice.py:107 +#, python-format +msgid "" +"Invoice cannot be created for this Sales Order Line due to one of the " +"following reasons:\n" +"1.The state of this sales order line is either \"draft\" or \"cancel\"!\n" +"2.The Sales Order Line is Invoiced!" +msgstr "" + +#. module: sale +#: view:sale.order.line.make.invoice:0 +msgid "Create & View Invoice" +msgstr "" + +#. module: sale +#: view:board.board:0 +#: model:ir.actions.act_window,name:sale.action_quotation_for_sale +msgid "My Quotations" +msgstr "" + +#. module: sale +#: field:sale.order,invoice_ids:0 +msgid "Invoices" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "December" +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "Contracts Management" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Shipped" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,month:0 +msgid "Month" +msgstr "" + +#. module: sale +#: field:sale.order,currency_id:0 +msgid "Currency" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Uninvoiced" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,categ_id:0 +msgid "Category of Product" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:564 +#, python-format +msgid "Cannot cancel this sales order!" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Recreate Invoice" +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_warning:0 +msgid "Allow configuring alerts by customer or products" +msgstr "" + +#. module: sale +#: field:sale.shop,name:0 +msgid "Shop Name" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "My Sales Orders" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Taxes :" +msgstr "" + +#. module: sale +#: field:sale.order,invoice_exists:0 +#: field:sale.order.line,invoiced:0 +msgid "Invoiced" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:202 +#, python-format +msgid "Advance Invoice" +msgstr "" + +#. module: sale +#: help:sale.config.settings,group_invoice_so_lines:0 +msgid "" +"To allow your salesman to make invoices for sales order lines using the menu " +"'Lines to Invoice'." +msgstr "" + +#. module: sale +#: model:ir.actions.client,name:sale.action_client_sale_menu +msgid "Open Sale Menu" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:598 +#, python-format +msgid "You cannot confirm a sales order which has no line." +msgstr "" + +#. module: sale +#: selection:sale.report,state:0 +msgid "In Progress" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:865 +#, python-format +msgid "No Customer Defined !" +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_sale_stock:0 +msgid "Trigger delivery orders automatically from sales orders" +msgstr "" + +#. module: sale +#: view:sale.make.invoice:0 +#: view:sale.order.line.make.invoice:0 +msgid "Create invoices" +msgstr "" + +#. module: sale +#: selection:sale.order.line,state:0 +msgid "Confirmed" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:106 +#, python-format +msgid "Advance of %s %%" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_order_line_make_invoice +msgid "Sale OrderLine Make_invoice" +msgstr "" + +#. module: sale +#: selection:sale.order.line,state:0 +msgid "Draft" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_email_templates +msgid "Email Templates" +msgstr "" + +#. module: sale +#: help:sale.order.line,address_allotment_id:0 +msgid "A partner to whom the particular product needs to be allotted." +msgstr "" + +#. module: sale +#: field:sale.order,project_id:0 +msgid "Contract / Analytic" +msgstr "" + +#. module: sale +#: selection:sale.order,state:0 +#: selection:sale.report,state:0 +msgid "Waiting Schedule" +msgstr "" + +#. module: sale +#: field:sale.order,note:0 +msgid "Terms and conditions" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_orders +#: model:ir.ui.menu,name:sale.menu_sale_order +#: view:sale.order:0 +msgid "Sales Orders" +msgstr "" + +#. module: sale +#: help:sale.order,amount_tax:0 +msgid "The tax amount." +msgstr "" + +#. module: sale +#: field:sale.order,invoiced_rate:0 +msgid "Invoiced Ratio" +msgstr "" + +#. module: sale +#: selection:sale.order,order_policy:0 +msgid "On Demand" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "August" +msgstr "" + +#. module: sale +#: model:process.node,note:sale.process_node_saleorder0 +msgid "Drives procurement and invoicing" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "To Do" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "June" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,help:sale.action_shop_form +msgid "" +"

\n" +" Click to define a new sale shop.\n" +"

\n" +" Each quotation or sales order must be linked to a shop. The\n" +" shop also defines the warehouse from which the products will " +"be\n" +" delivered for each particular sales.\n" +"

\n" +" " +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Order" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_order_report_all +#: model:ir.ui.menu,name:sale.menu_report_product_all +#: view:sale.report:0 +msgid "Sales Analysis" +msgstr "" + +#. module: sale +#: field:sale.order,message_is_follower:0 +msgid "Is a Follower" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "" +"Sales Order Lines that are confirmed, done or in exception state and haven't " +"yet been invoiced" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_report +msgid "Sales Orders Statistics" +msgstr "" + +#. module: sale +#: field:sale.order,date_order:0 +msgid "Date" +msgstr "" + +#. module: sale +#: report:sale.order:0 +#: view:sale.order:0 +#: field:sale.order,user_id:0 +#: view:sale.order.line:0 +#: field:sale.order.line,salesman_id:0 +#: view:sale.report:0 +#: field:sale.report,user_id:0 +msgid "Salesperson" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "November" +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: sale +#: model:process.node,name:sale.process_node_quotation0 +#: view:sale.order:0 +#: selection:sale.report,state:0 +msgid "Quotation" +msgstr "" + +#. module: sale +#: field:sale.advance.payment.inv,product_id:0 +msgid "Advance Product" +msgstr "" + +#. module: sale +#: selection:sale.order.line,state:0 +msgid "Exception" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "October" +msgstr "" + +#. module: sale +#: model:process.transition,note:sale.process_transition_invoice0 +msgid "" +"The Salesman creates an invoice manually, if the sales order shipping policy " +"is 'Shipping and Manual in Progress'. The invoice is created automatically " +"if the shipping policy is 'Payment before Delivery'." +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_shop +#: view:sale.shop:0 +msgid "Sales Shop" +msgstr "" + +#. module: sale +#: help:sale.config.settings,module_sale_stock:0 +msgid "" +"Allows you to Make Quotation, Sale Order using different Order policy and " +"Manage Related Stock.\n" +" This installs the module sale_stock." +msgstr "" + +#. module: sale +#: help:sale.advance.payment.inv,product_id:0 +msgid "" +"Select a product of type service which is called 'Advance Product'.\n" +" You may have to create it and set it as a default value on " +"this field." +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "January" +msgstr "" + +#. module: sale +#: field:sale.config.settings,group_discount_per_so_line:0 +msgid "Allow setting a discount on the sales order lines" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_orders_in_progress +msgid "Sales Order in Progress" +msgstr "" + +#. module: sale +#: view:sale.order.line.make.invoice:0 +msgid "" +"All items in these order lines will be invoiced. You can also invoice a " +"percentage of the sales order\n" +" or a fixed price (for advances) directly from the sales " +"order form if you prefer." +msgstr "" + +#. module: sale +#: help:sale.config.settings,module_warning:0 +msgid "" +"Allow to configure notification on products and trigger them when a user " +"wants to sale a given product or a given customer.\n" +"Example: Product: this product is deprecated, do not purchase more than 5.\n" +" Supplier: don't forget to ask for an express delivery." +msgstr "" + +#. module: sale +#: field:sale.order,paypal_url:0 +msgid "Paypal Url" +msgstr "" + +#. module: sale +#: help:sale.order,project_id:0 +msgid "The analytic account related to a sales order." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "View Invoice" +msgstr "" + +#. module: sale +#: field:sale.advance.payment.inv,advance_payment_method:0 +msgid "What do you want to invoice?" +msgstr "" + +#. module: sale +#: field:sale.config.settings,group_sale_pricelist:0 +msgid "Use pricelists to adapt your price per customers" +msgstr "" + +#. module: sale +#: model:process.transition,note:sale.process_transition_confirmquotation0 +msgid "" +"The salesman confirms the quotation. The state of the sales order becomes " +"'In progress' or 'Manual in progress'." +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:942 +#, python-format +msgid "" +"You have to select a pricelist or a customer in the sales form !\n" +"Please set one before choosing a product." +msgstr "" + +#. module: sale +#: help:sale.order,origin:0 +msgid "Reference of the document that generated this sales order request." +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:955 +#, python-format +msgid "No valid pricelist line found ! :" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:113 +#: code:addons/sale/wizard/sale_make_invoice_advance.py:115 +#, python-format +msgid "Advance of %s %s" +msgstr "" + +#. module: sale +#: view:sale.report:0 +#: field:sale.report,delay:0 +msgid "Commitment Delay" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_quotations +#: model:ir.ui.menu,name:sale.menu_sale_quotations +#: view:sale.order:0 +#: view:sale.report:0 +msgid "Quotations" +msgstr "" + +#. module: sale +#: help:account.config.settings,module_sale_analytic_plans:0 +msgid "This allows install module sale_analytic_plans." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Ignore Exception" +msgstr "" + +#. module: sale +#: help:sale.order,partner_shipping_id:0 +msgid "Delivery address for current sales order." +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_sale_margin:0 +msgid "Display margins on sales orders" +msgstr "" + +#. module: sale +#: help:sale.order,invoice_ids:0 +msgid "" +"This is the list of invoices that have been generated for this sales order. " +"The same sales order may have been invoiced in several times (by line for " +"example)." +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Your Reference" +msgstr "" + +#. module: sale +#: view:sale.advance.payment.inv:0 +msgid "Show Lines to Invoice" +msgstr "" + +#. module: sale +#: field:sale.report,date:0 +msgid "Date Order" +msgstr "" + +#. module: sale +#: field:sale.order,pricelist_id:0 +#: field:sale.report,pricelist_id:0 +#: field:sale.shop,pricelist_id:0 +msgid "Pricelist" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "TVA :" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:444 +#, python-format +msgid "Customer Invoices" +msgstr "" + +#. module: sale +#: model:process.node,note:sale.process_node_order0 +msgid "Confirmed sales order to invoice." +msgstr "" + +#. module: sale +#: field:sale.order.line,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.open_board_sales +#: model:ir.ui.menu,name:sale.menu_dashboard_sales +#: model:process.process,name:sale.process_process_salesprocess0 +#: view:res.partner:0 +#: view:sale.order:0 +#: view:sale.report:0 +msgid "Sales" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:308 +#, python-format +msgid "" +"If you change the pricelist of this order (and eventually the currency), " +"prices of existing order lines will not be updated." +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Qty" +msgstr "" + +#. module: sale +#: selection:sale.order.line,type:0 +msgid "from stock" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Quotation Date" +msgstr "" + +#. module: sale +#: field:sale.order,amount_total:0 +#: view:sale.order.line:0 +msgid "Total" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: selection:sale.order,state:0 +#: view:sale.order.line:0 +#: selection:sale.order.line,state:0 +#: selection:sale.report,state:0 +msgid "Done" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Invoice address :" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_line_invoice.py:121 +#: model:ir.model,name:sale.model_account_invoice +#: model:process.node,name:sale.process_node_invoice0 +#: view:sale.order:0 +#, python-format +msgid "Invoice" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "My Sales Order Lines" +msgstr "" + +#. module: sale +#: model:process.transition.action,name:sale.process_transition_action_cancel0 +#: view:sale.advance.payment.inv:0 +#: view:sale.make.invoice:0 +#: view:sale.order.line.make.invoice:0 +msgid "Cancel" +msgstr "" + +#. module: sale +#: field:sale.order,message_follower_ids:0 +msgid "Followers" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:944 +#, python-format +msgid "No Pricelist ! : " +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Sales Order " +msgstr "" + +#. module: sale +#: model:mail.message.subtype,description:sale.mt_order_sent +#: model:mail.message.subtype,name:sale.mt_order_sent +msgid "Quotation send" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Search Uninvoiced Lines" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_account_config_settings +msgid "account.config.settings" +msgstr "" + +#. module: sale +#: sql_constraint:sale.order:0 +msgid "Order Reference must be unique per Company!" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,help:sale.action_order_line_tree2 +msgid "" +"

\n" +" Here is a list of each sales order line to be invoiced. You " +"can\n" +" invoice sales orders partially, by lines of sales order. You " +"do\n" +" not need this list if you invoice from the delivery orders " +"or\n" +" if you invoice sales totally.\n" +"

\n" +" " +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Shipping address :" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:505 +#, python-format +msgid "" +"You cannot group sales having different currencies for the same partner." +msgstr "" + +#. module: sale +#: view:sale.advance.payment.inv:0 +msgid "Invoice Sales Order" +msgstr "" + +#. module: sale +#: help:sale.order,invoice_quantity:0 +msgid "" +"The sales order will automatically create the invoice proposition (draft " +"invoice). You have to choose " +"if you want your invoice based on ordered " +msgstr "" + +#. module: sale +#: field:sale.config.settings,module_account_analytic_analysis:0 +msgid "Use contracts management" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:952 +#, python-format +msgid "" +"Cannot find a pricelist line matching this product and quantity.\n" +"You have to change either the product, the quantity or the pricelist." +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "" + +#. module: sale +#: model:process.transition,name:sale.process_transition_invoice0 +#: model:process.transition.action,name:sale.process_transition_action_createinvoice0 +#: view:sale.advance.payment.inv:0 +#: view:sale.order:0 +#: field:sale.order,order_policy:0 +#: view:sale.order.line:0 +msgid "Create Invoice" +msgstr "" + +#. module: sale +#: help:sale.order,amount_untaxed:0 +msgid "The amount without tax." +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Order reference" +msgstr "" + +#. module: sale +#: help:sale.order,invoiced:0 +msgid "It indicates that an invoice has been paid." +msgstr "" + +#. module: sale +#: report:sale.order:0 +#: field:sale.order.line,price_unit:0 +msgid "Unit Price" +msgstr "" + +#. module: sale +#: selection:sale.advance.payment.inv,advance_payment_method:0 +msgid "Percentage" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Other Information" +msgstr "" + +#. module: sale +#: model:email.template,body_html:sale.email_template_edi_sale +msgid "" +"\n" +"
\n" +"\n" +"

Hello ${object.partner_id.name},

\n" +" \n" +"

Here is your ${object.state in ('draft', 'sent') and 'quotation' or " +"'order confirmation'} from ${object.company_id.name}:

\n" +"\n" +"

\n" +"   REFERENCES
\n" +"   Order number: ${object.name}
\n" +"   Order total: ${object.amount_total} " +"${object.pricelist_id.currency_id.name}
\n" +"   Order date: ${object.date_order}
\n" +" % if object.origin:\n" +"   Order reference: ${object.origin}
\n" +" % endif\n" +" % if object.client_order_ref:\n" +"   Your reference: ${object.client_order_ref}
\n" +" % endif\n" +" % if object.user_id:\n" +"   Your contact: ${object.user_id.name}\n" +" % endif\n" +"

\n" +"\n" +" % if object.paypal_url:\n" +"
\n" +"

It is also possible to directly pay with Paypal:

\n" +" \n" +" \n" +" \n" +" % endif\n" +"\n" +"
\n" +"

If you have any question, do not hesitate to contact us.

\n" +"

Thank you for choosing ${object.company_id.name or 'us'}!

\n" +"
\n" +"
\n" +"
\n" +"

\n" +" ${object.company_id.name}

\n" +"
\n" +"
\n" +" \n" +" % if object.company_id.street:\n" +" ${object.company_id.street}
\n" +" % endif\n" +" % if object.company_id.street2:\n" +" ${object.company_id.street2}
\n" +" % endif\n" +" % if object.company_id.city or object.company_id.zip:\n" +" ${object.company_id.zip} ${object.company_id.city}
\n" +" % endif\n" +" % if object.company_id.country_id:\n" +" ${object.company_id.state_id and ('%s, ' % " +"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name " +"or ''}
\n" +" % endif\n" +"
\n" +" % if object.company_id.phone:\n" +"
\n" +" Phone:  ${object.company_id.phone}\n" +"
\n" +" % endif\n" +" % if object.company_id.website:\n" +"
\n" +" Web : ${object.company_id.website}\n" +"
\n" +" %endif\n" +"

\n" +"
\n" +"
\n" +" " +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +#: field:sale.order.line,product_id:0 +#: view:sale.report:0 +#: field:sale.report,product_id:0 +msgid "Product" +msgstr "" + +#. module: sale +#: help:sale.order,amount_total:0 +msgid "The total amount." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Confirm Sale" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_make_invoice_advance.py:96 +#, python-format +msgid "There is no income account defined for this product: \"%s\" (id:%d)." +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "May" +msgstr "" + +#. module: sale +#: model:email.template,subject:sale.email_template_edi_sale +msgid "" +"${object.company_id.name} ${object.state in ('draft', 'sent') and " +"'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Price" +msgstr "" + +#. module: sale +#: help:sale.order,order_policy:0 +msgid "" +"On demand: A draft invoice can be created from the sales order when needed. " +"\n" +"On delivery order: A draft invoice can be created from the delivery order " +"when the products have been delivered. \n" +"Before delivery: A draft invoice is created from the sales order and must be " +"paid before the products can be delivered." +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,help:sale.action_order_report_all +msgid "" +"This report performs analysis on your quotations and sales orders. Analysis " +"check your sales revenues and sort it by different group criteria (salesman, " +"partner, product, etc.) Use this report to perform analysis on sales not " +"having invoiced yet. If you want to analyse your turnover, you should use " +"the Invoice Analysis report in the Accounting application." +msgstr "" + +#. module: sale +#: model:ir.actions.report.xml,name:sale.report_sale_order +msgid "Quotation / Order" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Tel. :" +msgstr "" + +#. module: sale +#: view:sale.make.invoice:0 +msgid "Do you really want to create the invoice(s)?" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,help:sale.action_quotations +msgid "" +"

\n" +" Click to create a quotation, the first step of a new sale.\n" +"

\n" +" OpenERP will help you handle efficiently the complete sale " +"flow:\n" +" from the quotation to the sales order, the\n" +" delivery, the invoicing and the payment collection.\n" +"

\n" +" The social feature helps you organize discussions on each " +"sales\n" +" order, and allow your customers to keep track of the " +"evolution\n" +" of the sales order.\n" +"

\n" +" " +msgstr "" + +#. module: sale +#: view:res.partner:0 +msgid "sale.group_delivery_invoice_address" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:781 +#, python-format +msgid "" +"There is no Fiscal Position defined or Income category account defined for " +"default properties of Product categories." +msgstr "" + +#. module: sale +#: model:process.node,note:sale.process_node_invoice0 +msgid "To be reviewed by the accountant." +msgstr "" + +#. module: sale +#: model:res.groups,name:sale.group_mrp_properties +msgid "Properties on lines" +msgstr "" + +#. module: sale +#: selection:sale.order,state:0 +msgid "Sale to Invoice" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Order Number" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: field:sale.order,partner_id:0 +#: field:sale.order.line,order_partner_id:0 +msgid "Customer" +msgstr "" + +#. module: sale +#: model:product.template,name:sale.advance_product_0_product_template +msgid "Advance" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "February" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,help:sale.action_orders +msgid "" +"

\n" +" Click to create a quotation that can be converted into a " +"sales\n" +" order.\n" +"

\n" +" OpenERP will help you efficiently handle the complete sales " +"flow:\n" +" quotation, sales order, delivery, invoicing and payment.\n" +"

\n" +" " +msgstr "" + +#. module: sale +#: field:sale.order,invoice_quantity:0 +msgid "Invoice on" +msgstr "" + +#. module: sale +#: selection:sale.advance.payment.inv,advance_payment_method:0 +msgid "Fixed price (deposit)" +msgstr "" + +#. module: sale +#: model:ir.model,name:sale.model_sale_config_settings +msgid "sale.config.settings" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "September" +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Date Ordered" +msgstr "" + +#. module: sale +#: selection:sale.order,order_policy:0 +msgid "Before Delivery" +msgstr "" + +#. module: sale +#: field:sale.order.line,product_uos:0 +msgid "Product UoS" +msgstr "" + +#. module: sale +#: model:process.node,note:sale.process_node_quotation0 +msgid "Draft state of sales order" +msgstr "" + +#. module: sale +#: field:sale.order,origin:0 +msgid "Source Document" +msgstr "" + +#. module: sale +#: selection:sale.report,month:0 +msgid "April" +msgstr "" + +#. module: sale +#: selection:sale.report,state:0 +msgid "Manual In Progress" +msgstr "" + +#. module: sale +#: code:addons/sale/wizard/sale_line_invoice.py:107 +#: code:addons/sale/wizard/sale_make_invoice.py:42 +#: code:addons/sale/wizard/sale_make_invoice.py:55 +#, python-format +msgid "Warning!" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_order_tree +msgid "Old Quotations" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,help:sale.act_res_partner_2_sale_order +msgid "" +"

\n" +" Click to create a quotation or sales order for this " +"customer.\n" +"

\n" +" OpenERP will help you efficiently handle the complete sale " +"flow:\n" +" quotation, sales order, delivery, invoicing and\n" +" payment.\n" +"

\n" +" The social feature helps you organize discussions on each " +"sales\n" +" order, and allow your customer to keep track of the " +"evolution\n" +" of the sales order.\n" +"

\n" +" " +msgstr "" + +#. module: sale +#: field:sale.order,message_summary:0 +msgid "Summary" +msgstr "" + +#. module: sale +#: help:sale.order,message_ids:0 +msgid "Messages and communication history" +msgstr "" + +#. module: sale +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "Search Sales Order" +msgstr "" + +#. module: sale +#: report:sale.order:0 +#: field:sale.order.line,name:0 +msgid "Description" +msgstr "" + +#. module: sale +#: view:sale.config.settings:0 +msgid "" +"Use contract to be able to manage your services with\n" +" multiple invoicing as part of the same contract " +"with\n" +" your customer." +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "Ordered month of the sales order" +msgstr "" + +#. module: sale +#: model:process.transition,name:sale.process_transition_saleinvoice0 +msgid "From a sales order" +msgstr "" + +#. module: sale +#: view:sale.order.line:0 +msgid "Confirmed sales order lines, not yet delivered" +msgstr "" + +#. module: sale +#: model:process.transition,note:sale.process_transition_saleinvoice0 +msgid "" +"Depending on the Invoicing control of the sales order, the invoice can be " +"based on delivered or on ordered quantities. Thus, a sales order can " +"generates an invoice or a delivery order as soon as it is confirmed by the " +"salesman." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "UoS" +msgstr "" + +#. module: sale +#: selection:sale.advance.payment.inv,advance_payment_method:0 +msgid "Some order lines" +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:983 +#, python-format +msgid "Cannot delete a sales order line which is in state '%s'." +msgstr "" + +#. module: sale +#: report:sale.order:0 +#: field:sale.order,payment_term:0 +msgid "Payment Term" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Sales Order ready to be invoiced" +msgstr "" + +#. module: sale +#: field:sale.config.settings,group_invoice_so_lines:0 +msgid "Generate invoices based on the sales order lines" +msgstr "" + +#. module: sale +#: view:sale.advance.payment.inv:0 +#: view:sale.make.invoice:0 +#: view:sale.order.line.make.invoice:0 +msgid "or" +msgstr "" + +#. module: sale +#: model:ir.actions.act_window,name:sale.action_order_line_product_tree +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "Sales Order Lines" +msgstr "" + +#. module: sale +#: help:sale.order,pricelist_id:0 +msgid "Pricelist for current sales order." +msgstr "" + +#. module: sale +#: report:sale.order:0 +msgid "Quotation N°" +msgstr "" + +#. module: sale +#: model:res.groups,name:sale.group_discount_per_so_line +msgid "Discount on lines" +msgstr "" + +#. module: sale +#: field:sale.order,client_order_ref:0 +msgid "Customer Reference" +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "Picked" +msgstr "" + +#. module: sale +#: help:sale.config.settings,module_sale_margin:0 +msgid "" +"This adds the 'Margin' on sales order.\n" +" This gives the profitability by calculating the difference " +"between the Unit Price and Cost Price.\n" +" This installs the module sale_margin." +msgstr "" + +#. module: sale +#: code:addons/sale/sale.py:865 +#, python-format +msgid "" +"Before choosing a product,\n" +" select a customer in the sales form." +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "Total Tax Included" +msgstr "" + +#. module: sale +#: view:sale.order:0 +msgid "New Copy of Quotation" +msgstr "" + +#. module: sale +#: view:sale.advance.payment.inv:0 +msgid "" +"Select how you want to invoice this order. This\n" +" will create a draft invoice that can be modified\n" +" before validation." +msgstr "" + +#. module: sale +#: view:sale.report:0 +msgid "Ordered date of the sales order" +msgstr "" diff --git a/addons/website/__openerp__.py b/addons/website/__openerp__.py index 50ccff88c73..d421357e996 100644 --- a/addons/website/__openerp__.py +++ b/addons/website/__openerp__.py @@ -12,14 +12,14 @@ OpenERP Website CMS 'depends': ['web', 'share'], 'installable': True, 'data': [ - 'views/views.xml', + 'data/website_data.xml', + 'security/ir.model.access.csv', + 'views/website_templates.xml', + 'views/website_views.xml', 'views/snippets.xml', 'views/themes.xml', - 'website_data.xml', - 'website_view.xml', - 'security/ir.model.access.csv', ], 'demo': [ - 'website_demo.xml', + 'data/website_demo.xml', ] } diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 869d51d85c7..c1bd749514e 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -7,18 +7,27 @@ import json import logging import os import datetime +import re from sys import maxint import psycopg2 -import slugify import werkzeug import werkzeug.exceptions import werkzeug.utils import werkzeug.wrappers from PIL import Image +try: + from slugify import slugify +except ImportError: + def slugify(s, max_length=None): + spaceless = re.sub(r'\s+', '-', s) + specialless = re.sub(r'[^-_a-z0-9]', '', spaceless) + return specialless[:max_length] + import openerp +from openerp.osv import fields from openerp.addons.website.models import website from openerp.addons.web import http from openerp.addons.web.http import request @@ -53,7 +62,7 @@ class Website(openerp.addons.web.controllers.main.Home): def pagenew(self, path, noredirect=NOPE): module = 'website' # completely arbitrary max_length - idname = slugify.slugify(path, max_length=50) + idname = slugify(path, max_length=50) request.cr.execute('SAVEPOINT pagenew') imd = request.registry['ir.model.data'] @@ -251,11 +260,16 @@ class Website(openerp.addons.web.controllers.main.Home): def publish(self, id, object): _id = int(id) _object = request.registry[object] - obj = _object.browse(request.cr, request.uid, _id) + + values = {} + if 'website_published' in _object._all_columns: + values['website_published'] = not obj.website_published + if 'website_published_datetime' in _object._all_columns and values.get('website_published'): + values['website_published_datetime'] = fields.datetime.now() _object.write(request.cr, request.uid, [_id], - {'website_published': not obj.website_published}, - context=request.context) + values, context=request.context) + obj = _object.browse(request.cr, request.uid, _id) return obj.website_published and True or False diff --git a/addons/website/website_data.xml b/addons/website/data/website_data.xml similarity index 97% rename from addons/website/website_data.xml rename to addons/website/data/website_data.xml index 2b16b1e7f07..58891dfa323 100644 --- a/addons/website/website_data.xml +++ b/addons/website/data/website_data.xml @@ -36,17 +36,22 @@ Website + / + self + + + Website With Tutorial /?tutorial=true self + Website - - + open diff --git a/addons/website/website_demo.xml b/addons/website/data/website_demo.xml similarity index 100% rename from addons/website/website_demo.xml rename to addons/website/data/website_demo.xml diff --git a/addons/website/models/__init__.py b/addons/website/models/__init__.py index 818f943a8f6..464cb066789 100644 --- a/addons/website/models/__init__.py +++ b/addons/website/models/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- import ir_fields -import view +import ir_ui_view import website import ir_rule diff --git a/addons/website/models/view.py b/addons/website/models/ir_ui_view.py similarity index 100% rename from addons/website/models/view.py rename to addons/website/models/ir_ui_view.py diff --git a/addons/website/models/website.py b/addons/website/models/website.py index beb5f8bafee..833424f439a 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -144,7 +144,7 @@ class website(osv.osv): qweb_context.update(values) qweb_context.update( - _request=request, # begin with underscore to mark this attribute as unsafe + request=request, # TODO maybe rename to _request to mark this attribute as unsafe json=simplejson, website=request.website, url_for=url_for, diff --git a/addons/website/static/lib/nearest/README.md b/addons/website/static/lib/nearest/README.md new file mode 100644 index 00000000000..cc40c5fed38 --- /dev/null +++ b/addons/website/static/lib/nearest/README.md @@ -0,0 +1,22 @@ +jQuery Nearest Element plugin +====== + +**Full documentation is at ** + +**Demo:** + +Method signatures: + + * `$.nearest({x, y}, selector)` - find `$(selector)` closest to x/y point on screen + * `$(elem).nearest(selector)` - find `$(selector)` closest to elem + * `$(elemSet).nearest({x, y})` - filter `$(elemSet)` and return closest to x/y point on screen + +Reverse logic: + + * `$.furthest()` + * `$(elem).furthest()` + +Intersecting/touching: + + * `$.touching()` + * `$(elem).touching()` diff --git a/addons/website/static/lib/nearest/bower.json b/addons/website/static/lib/nearest/bower.json new file mode 100644 index 00000000000..27bad9c8785 --- /dev/null +++ b/addons/website/static/lib/nearest/bower.json @@ -0,0 +1,12 @@ +{ + "name": "jquery-nearest", + "version": "1.2.1", + "main": "jquery.nearest.js", + "ignore": [ + "**/.*", + "test" + ], + "dependencies": { + "jquery": ">=1.4" + } +} \ No newline at end of file diff --git a/addons/website/static/lib/nearest/jquery.nearest.js b/addons/website/static/lib/nearest/jquery.nearest.js new file mode 100644 index 00000000000..7daab9ae209 --- /dev/null +++ b/addons/website/static/lib/nearest/jquery.nearest.js @@ -0,0 +1,223 @@ +/*! + * jQuery Nearest plugin v1.2.1 + * + * Finds elements closest to a single point based on screen location and pixel dimensions + * http://gilmoreorless.github.com/jquery-nearest/ + * Open source under the MIT licence: http://gilmoreorless.mit-license.org/2011/ + * + * Requires jQuery 1.4 or above + * Also supports Ben Alman's "each2" plugin for faster looping (if available) + */ + +/** + * Method signatures: + * + * $.nearest({x, y}, selector) - find $(selector) closest to point + * $(elem).nearest(selector) - find $(selector) closest to elem + * $(elemSet).nearest({x, y}) - filter $(elemSet) and return closest to point + * + * Also: + * $.furthest() + * $(elem).furthest() + * + * $.touching() + * $(elem).touching() + */ +;(function ($, undefined) { + + /** + * Internal method that does the grunt work + * + * @param mixed selector Any valid jQuery selector providing elements to filter + * @param hash options Key/value list of options for matching elements + * @param mixed thisObj (optional) Any valid jQuery selector that represents self + * for the "includeSelf" option + * @return array List of matching elements, can be zero length + */ + var rPerc = /^([\d.]+)%$/; + function nearest(selector, options, thisObj) { + // Normalise selector and dimensions + selector || (selector = 'div'); // I STRONGLY recommend passing in a selector + var $container = $(options.container), + containerOffset = $container.offset() || {left: 0, top: 0}, + containerDims = [ + containerOffset.left + $container.width(), + containerOffset.top + $container.height() + ], + percProps = {x: 0, y: 1, w: 0, h: 1}, + prop, match; + for (prop in percProps) if (percProps.hasOwnProperty(prop)) { + match = rPerc.exec(options[prop]); + if (match) { + options[prop] = containerDims[percProps[prop]] * match[1] / 100; + } + } + + // Get elements and work out x/y points + var $all = $(selector), + cache = [], + furthest = !!options.furthest, + checkX = !!options.checkHoriz, + checkY = !!options.checkVert, + compDist = furthest ? 0 : Infinity, + point1x = parseFloat(options.x) || 0, + point1y = parseFloat(options.y) || 0, + point2x = parseFloat(point1x + options.w) || point1x, + point2y = parseFloat(point1y + options.h) || point1y, + tolerance = options.tolerance || 0, + hasEach2 = !!$.fn.each2, + // Shortcuts to help with compression + min = Math.min, + max = Math.max; + + // Normalise the remaining options + if (!options.includeSelf && thisObj) { + $all = $all.not(thisObj); + } + if (tolerance < 0) { + tolerance = 0; + } + // Loop through all elements and check their positions + $all[hasEach2 ? 'each2' : 'each'](function (i, elem) { + var $this = hasEach2 ? elem : $(this), + off = $this.offset(), + x = off.left, + y = off.top, + w = $this.outerWidth(), + h = $this.outerHeight(), + x2 = x + w, + y2 = y + h, + maxX1 = max(x, point1x), + minX2 = min(x2, point2x), + maxY1 = max(y, point1y), + minY2 = min(y2, point2y), + intersectX = minX2 >= maxX1, + intersectY = minY2 >= maxY1, + distX, distY, distT, isValid; + if ( + // .nearest() / .furthest() + (checkX && checkY) || + // .touching() + (!checkX && !checkY && intersectX && intersectY) || + // .nearest({checkVert: false}) + (checkX && intersectY) || + // .nearest({checkHoriz: false}) + (checkY && intersectX) + ) { + distX = intersectX ? 0 : maxX1 - minX2; + distY = intersectY ? 0 : maxY1 - minY2; + distT = intersectX || intersectY ? + max(distX, distY) : + Math.sqrt(distX * distX + distY * distY); + isValid = furthest ? + distT >= compDist - tolerance : + distT <= compDist + tolerance; + if (isValid) { + compDist = furthest ? + max(compDist, distT) : + min(compDist, distT); + cache.push({ + node: this, + dist: distT + }); + } + } + }); + // Make sure all cached items are within tolerance range + var len = cache.length, + filtered = [], + compMin, compMax, + i, item; + if (len) { + if (furthest) { + compMin = compDist - tolerance; + compMax = compDist; + } else { + compMin = compDist; + compMax = compDist + tolerance; + } + for (i = 0; i < len; i++) { + item = cache[i]; + if (item.dist >= compMin && item.dist <= compMax) { + filtered.push(item.node); + } + } + } + return filtered; + } + + $.each(['nearest', 'furthest', 'touching'], function (i, name) { + + // Internal default options + // Not exposed publicly because they're method-dependent and easily overwritten anyway + var defaults = { + x: 0, // X position of top left corner of point/region + y: 0, // Y position of top left corner of point/region + w: 0, // Width of region + h: 0, // Height of region + tolerance: 1, // Distance tolerance in pixels, mainly to handle fractional pixel rounding bugs + container: document, // Container of objects for calculating %-based dimensions + furthest: name == 'furthest', // Find max distance (true) or min distance (false) + includeSelf: false, // Include 'this' in search results (t/f) - only applies to $(elem).func(selector) syntax + checkHoriz: name != 'touching', // Check variations in X axis (t/f) + checkVert: name != 'touching' // Check variations in Y axis (t/f) + }; + + /** + * $.nearest() / $.furthest() / $.touching() + * + * Utility functions for finding elements near a specific point or region on screen + * + * @param hash point Co-ordinates for the point or region to measure from + * "x" and "y" keys are required, "w" and "h" keys are optional + * @param mixed selector Any valid jQuery selector that provides elements to filter + * @param hash options (optional) Extra filtering options + * Not technically needed as the options could go on the point object, + * but it's good to have a consistent API + * @return jQuery object containing matching elements in selector + */ + $[name] = function (point, selector, options) { + if (!point || point.x === undefined || point.y === undefined) { + return $([]); + } + var opts = $.extend({}, defaults, point, options || {}); + return $(nearest(selector, opts)); + }; + + /** + * SIGNATURE 1: + * $(elem).nearest(selector) / $(elem).furthest(selector) / $(elem).touching(selector) + * + * Finds all elements in selector that are nearest to/furthest from elem + * + * @param mixed selector Any valid jQuery selector that provides elements to filter + * @param hash options (optional) Extra filtering options + * @return jQuery object containing matching elements in selector + * + * SIGNATURE 2: + * $(elemSet).nearest(point) / $(elemSet).furthest(point) / $(elemSet).touching(point) + * + * Filters elemSet to return only the elements nearest to/furthest from point + * Effectively a wrapper for $.nearest(point, elemSet) but with the benefits of method chaining + * + * @param hash point Co-ordinates for the point or region to measure from + * @return jQuery object containing matching elements in elemSet + */ + $.fn[name] = function (selector, options) { + var opts; + if (selector && $.isPlainObject(selector)) { + opts = $.extend({}, defaults, selector, options || {}); + return this.pushStack(nearest(this, opts)); + } + var offset = this.offset(), + dimensions = { + x: offset.left, + y: offset.top, + w: this.outerWidth(), + h: this.outerHeight() + }; + opts = $.extend({}, defaults, dimensions, options || {}); + return this.pushStack(nearest(selector, opts, this)); + }; + }); +})(jQuery); diff --git a/addons/website/static/lib/nearest/jquery.nearest.min.js b/addons/website/static/lib/nearest/jquery.nearest.min.js new file mode 100644 index 00000000000..9bd37ca8733 --- /dev/null +++ b/addons/website/static/lib/nearest/jquery.nearest.min.js @@ -0,0 +1,11 @@ +/*! + * jQuery Nearest plugin v1.2.1 + * + * Finds elements closest to a single point based on screen location and pixel dimensions + * http://gilmoreorless.github.com/jquery-nearest/ + * Open source under the MIT licence: http://gilmoreorless.mit-license.org/2011/ + * + * Requires jQuery 1.4 or above + * Also supports Ben Alman's "each2" plugin for faster looping (if available) + */ +;(function(e,t){function r(t,r,i){t||(t="div");var s=e(r.container),o=s.offset()||{left:0,top:0},u=[o.left+s.width(),o.top+s.height()],a={x:0,y:1,w:0,h:1},f,l;for(f in a)a.hasOwnProperty(f)&&(l=n.exec(r[f]),l&&(r[f]=u[a[f]]*l[1]/100));var c=e(t),h=[],p=!!r.furthest,d=!!r.checkHoriz,v=!!r.checkVert,m=p?0:Infinity,g=parseFloat(r.x)||0,y=parseFloat(r.y)||0,b=parseFloat(g+r.w)||g,w=parseFloat(y+r.h)||y,E=r.tolerance||0,S=!!e.fn.each2,x=Math.min,T=Math.max;!r.includeSelf&&i&&(c=c.not(i)),E<0&&(E=0),c[S?"each2":"each"](function(t,n){var r=S?n:e(this),i=r.offset(),s=i.left,o=i.top,u=r.outerWidth(),a=r.outerHeight(),f=s+u,l=o+a,c=T(s,g),N=x(f,b),C=T(o,y),k=x(l,w),L=N>=c,A=k>=C,O,M,_,D;if(d&&v||!d&&!v&&L&&A||d&&A||v&&L)O=L?0:c-N,M=A?0:C-k,_=L||A?T(O,M):Math.sqrt(O*O+M*M),D=p?_>=m-E:_<=m+E,D&&(m=p?T(m,_):x(m,_),h.push({node:this,dist:_}))});var N=h.length,C=[],k,L,A,O;if(N){p?(k=m-E,L=m):(k=m,L=m+E);for(A=0;A=k&&O.dist<=L&&C.push(O.node)}return C}var n=/^([\d.]+)%$/;e.each(["nearest","furthest","touching"],function(n,i){var s={x:0,y:0,w:0,h:0,tolerance:1,container:document,furthest:i=="furthest",includeSelf:!1,checkHoriz:i!="touching",checkVert:i!="touching"};e[i]=function(n,i,o){if(!n||n.x===t||n.y===t)return e([]);var u=e.extend({},s,n,o||{});return e(r(i,u))},e.fn[i]=function(t,n){var i;if(t&&e.isPlainObject(t))return i=e.extend({},s,t,n||{}),this.pushStack(r(this,i));var o=this.offset(),u={x:o.left,y:o.top,w:this.outerWidth(),h:this.outerHeight()};return i=e.extend({},s,u,n||{}),this.pushStack(r(t,i,this))}})})(jQuery); \ No newline at end of file diff --git a/addons/website/static/lib/nearest/nearest.jquery.json b/addons/website/static/lib/nearest/nearest.jquery.json new file mode 100644 index 00000000000..9c9ee5c05c8 --- /dev/null +++ b/addons/website/static/lib/nearest/nearest.jquery.json @@ -0,0 +1,24 @@ +{ + "name": "nearest", + "title": "jQuery Nearest Element", + "description": "Find the elements in a page that are closest to (or furthest away from) a particular point or element, based on pixel dimensions", + "version": "1.2.1", + "keywords": ["nearest", "furthest", "touching", "pixel", "distance"], + "homepage": "http://gilmoreorless.github.io/jquery-nearest/", + "docs": "http://gilmoreorless.github.io/jquery-nearest/", + "demo": "http://gilmoreorless.github.io/jquery-nearest/demo.html", + "bugs": "https://github.com/gilmoreorless/jquery-nearest/issues", + "author": { + "name": "Gilmore Davidson", + "url": "http://shoehornwithteeth.com/" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://gilmoreorless.mit-license.org/2011/" + } + ], + "dependencies": { + "jquery": ">=1.4" + } +} \ No newline at end of file diff --git a/addons/website/static/src/css/editor.css b/addons/website/static/src/css/editor.css index a541274f00d..45960414926 100644 --- a/addons/website/static/src/css/editor.css +++ b/addons/website/static/src/css/editor.css @@ -164,7 +164,7 @@ table.editorbar-panel td.selected { position: fixed; left: 0px; right: 0px; - top: 50px; + top: 51px; background: #282828; -webkit-box-shadow: 0px 10px 10px -10px black inset; -moz-box-shadow: 0px 10px 10px -10px black inset; @@ -183,9 +183,7 @@ table.editorbar-panel td.selected { display: inline-block; border-bottom: none !important; vertical-align: middle; - margin-top: 5px; min-width: 120px; - margin-left: 6px; z-index: 1; } #oe_snippets .nav > li { @@ -208,11 +206,9 @@ table.editorbar-panel td.selected { display: inline-block; white-space: nowrap; background: black; - margin-top: 5px; } #oe_snippets .tab-content > div { background: black; - padding: 5px; } #oe_snippets .tab-content > div label { width: 44px; @@ -237,8 +233,8 @@ table.editorbar-panel td.selected { .oe_snippet { float: left; vertical-align: top; - width: 100px; - margin: 1px; + width: 93px; + margin-left: 1px; margin-top: 0px; position: relative; overflow: hidden; @@ -269,6 +265,7 @@ table.editorbar-panel td.selected { text-shadow: 0 0 2px black; } .oe_snippet .oe_snippet_thumbnail .oe_snippet_thumbnail_img { + height: 74px; -webkit-transition: all 150ms linear; -moz-transition: all 150ms linear; -o-transition: all 150ms linear; diff --git a/addons/website/static/src/css/editor.sass b/addons/website/static/src/css/editor.sass index ddb860ddd33..82497b6f784 100644 --- a/addons/website/static/src/css/editor.sass +++ b/addons/website/static/src/css/editor.sass @@ -148,7 +148,7 @@ table.editorbar-panel position: fixed left: 0px right: 0px - top: 50px + top: 51px background: rgb(40,40,40) +box-shadow(0px 10px 10px -10px black inset) z-index: 1010 @@ -162,9 +162,7 @@ table.editorbar-panel display: inline-block border-bottom: none !important vertical-align: middle - margin-top: 5px min-width: 120px - margin-left: 6px > li display: block float: none @@ -182,10 +180,8 @@ table.editorbar-panel display: inline-block white-space: nowrap background: black - margin-top: 5px > div background: rgb(0,0,0) - padding: 5px label width: 44px color: #fff @@ -200,8 +196,8 @@ table.editorbar-panel .oe_snippet float: left vertical-align: top - width: 100px - margin: 1px + width: 93px + margin-left: 1px margin-top: 0px position: relative overflow: hidden @@ -223,6 +219,7 @@ table.editorbar-panel display: block +text-shadow(0 0 2px rgb(0,0,0)) .oe_snippet_thumbnail_img + height: 74px @include transition(all 150ms linear) +box-shadow(inset 0px 0px 0px 3px #333333) @include transform( scale(1,1)) diff --git a/addons/website/static/src/css/website.css b/addons/website/static/src/css/website.css index 6af2e7485fe..ce87e592136 100644 --- a/addons/website/static/src/css/website.css +++ b/addons/website/static/src/css/website.css @@ -223,11 +223,15 @@ footer { } /* ---- HACK FOR COVERING UP CK EDITOR BOGUS P INSERTION --- */ -.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { +.oe_structure.oe_editable.oe_empty:empty, .oe_editable[data-oe-type=html]:empty, .oe_structure.oe_editable.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { background-image: url("/website/static/src/img/drag_here.png"); +} + +.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { + background-image: url("/website/static/src/img/edit_here.png"); background-repeat: no-repeat; - background-position: center top; - height: 200px !important; + background-position: center; + height: 220px !important; } .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { @@ -238,8 +242,8 @@ footer { content: "Click Edit To Create Content"; text-align: center; display: block; - padding-top: 100px; - padding-bottom: 50px; + padding-top: 160px; + padding-bottom: 30px; color: grey; font-size: 24px; } @@ -345,6 +349,17 @@ footer { } /* Parallax Theme */ +.parallax_quote { + background: url("/website/static/src/img/parallax/quote.png") center center no-repeat fixed; + background-size: contain; +} +.parallax_quote .carousel-indicators li { + border: 1px solid grey; +} +.parallax_quote .carousel-indicators .active { + background-color: grey; +} + .parallax_full { background: #eeeeee bottom center repeat fixed; min-height: 650px; diff --git a/addons/website/static/src/css/website.sass b/addons/website/static/src/css/website.sass index 997b45a0253..5197653429c 100644 --- a/addons/website/static/src/css/website.sass +++ b/addons/website/static/src/css/website.sass @@ -151,11 +151,14 @@ footer /* ---- HACK FOR COVERING UP CK EDITOR BOGUS P INSERTION --- */ -.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child +.oe_structure.oe_editable.oe_empty:empty, .oe_editable[data-oe-type=html]:empty, .oe_structure.oe_editable.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child background-image: url('/website/static/src/img/drag_here.png') + +.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child + background-image: url('/website/static/src/img/edit_here.png') background-repeat: no-repeat - background-position: center top - height: 200px !important + background-position: center + height: 220px !important .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child position: static @@ -164,8 +167,8 @@ footer content: 'Click Edit To Create Content' text-align: center display: block - padding-top: 100px - padding-bottom: 50px + padding-top: 160px + padding-bottom: 30px color: grey font-size: 24px @@ -263,6 +266,15 @@ footer /* Parallax Theme */ +.parallax_quote + background: url('/website/static/src/img/parallax/quote.png') center center no-repeat fixed + background-size: contain + .carousel-indicators + li + border: 1px solid grey + .active + background-color: grey + .parallax_full background: #eee bottom center repeat fixed min-height: 650px diff --git a/addons/website/static/src/img/big_picture.png b/addons/website/static/src/img/big_picture.png index cecb39679d5..519e713ff7f 100644 Binary files a/addons/website/static/src/img/big_picture.png and b/addons/website/static/src/img/big_picture.png differ diff --git a/addons/website/static/src/img/drag_here.png b/addons/website/static/src/img/drag_here.png index f2e3d38b2df..0dfeb1bc5da 100644 Binary files a/addons/website/static/src/img/drag_here.png and b/addons/website/static/src/img/drag_here.png differ diff --git a/addons/website/static/src/img/edit_here.png b/addons/website/static/src/img/edit_here.png new file mode 100644 index 00000000000..b53f56e2ac8 Binary files /dev/null and b/addons/website/static/src/img/edit_here.png differ diff --git a/addons/website/static/src/img/parallax/quote.png b/addons/website/static/src/img/parallax/quote.png new file mode 100644 index 00000000000..769cb6b5e0f Binary files /dev/null and b/addons/website/static/src/img/parallax/quote.png differ diff --git a/addons/website/static/src/js/website.snippets.js b/addons/website/static/src/js/website.snippets.js index 3877635a84d..96f153bf86e 100644 --- a/addons/website/static/src/js/website.snippets.js +++ b/addons/website/static/src/js/website.snippets.js @@ -313,7 +313,15 @@ }, }); }, - stop: function(){ + stop: function(ev, ui){ + if (action === 'insert' && ! dropped) { + var el = $('.oe_drop_zone').nearest({x: ui.position.left, y: ui.position.top}).first() + if (el) { + el.after($toInsert) + dropped = true; + } + } + $('.oe_drop_zone').droppable('destroy').remove(); if (dropped) { var $target = false; @@ -1134,33 +1142,6 @@ }, }); - website.snippet.animationRegistry.surprise = website.snippet.Animation.extend({ - start: function() { - this._super(); - var hue=0; - var beat = false; - var self = this; - self.$target.append(''); - - var a = setInterval(function(){ - self.$target.next().css({'-webkit-filter':'hue-rotate('+hue+'deg)'}); - self.$target.prev().css({'-webkit-filter':'hue-rotate('+(-hue)+'deg)'}); - hue -= 5; - }, 10); - - setTimeout(function(){ - clearInterval(a); - setInterval(function(){ - var filter = 'hue-rotate('+hue+'deg)'+ (beat ? ' invert()' : ''); - $(document.documentElement).css({'-webkit-filter': filter}); hue += 5; - if(hue % 35 === 0){ - beat = !beat; - } - }, 10); - },5000); - } - }); - /* * data-snippet-id automatically setted * Don't need to add data-snippet-id="..." into the views diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js index 147ed80c50c..09e222acf64 100644 --- a/addons/website/static/src/js/website.tour.js +++ b/addons/website/static/src/js/website.tour.js @@ -19,9 +19,24 @@ keyboard: false, }); this.tour.addSteps(_.map(this.steps, function (step) { - step.title = render('website.tour_title', { title: step.title }); + step.title = render('website.tour_popover_title', { title: step.title }); return step; })); + this.monkeyPatchTour(); + }, + monkeyPatchTour: function () { + var self = this; + // showStep should wait for 'element' to appear instead of moving to the next step + self.tour.showStep = function (i) { + var step = self.tour.getStep(i); + return (function proceed () { + if (step.orphan || $(step.element).length > 0) { + return Tour.prototype.showStep.call(self.tour, i); + } else { + setTimeout(proceed, 50); + } + }()); + }; }, reset: function () { this.tourStorage.removeItem(this.id+'_current_step'); @@ -68,7 +83,7 @@ website.EditorBasicTour = website.EditorTour.extend({ id: 'add_banner_tour', - name: "How to add a banner", + name: "Insert a banner", init: function (editor) { var self = this; self.steps = [ @@ -77,43 +92,44 @@ orphan: true, backdrop: true, title: "Welcome to your website!", - content: "This tutorial will guide you through the firsts steps to build your enterprise class website.", - template: render('website.tour_full', { next: "Continue", end: "Close Tutorial" }), + content: "This tutorial will guide you to build your first page. We will start by adding a banner.", + template: render('website.tour_popover', { next: "Start Tutorial", end: "Skip It" }), }, { stepId: 'edit-page', element: 'button[data-action=edit]', - placement: 'right', + placement: 'bottom', reflex: true, title: "Edit this page", - content: "Every page of your website can be edited. Click the Edit button to modify your homepage.", - template: render('website.tour_simple'), - }, - { - stepId: 'add-banner', - orphan: true, - backdrop: true, - title: "Now, let's add a banner", - content: "Let's add a banner on the top of the page to make your homepage more attractive.", - template: render('website.tour_confirm', { next: "Continue" }), + content: "Every page of your website can be modified through the Edit button.", + template: render('website.tour_popover'), }, { stepId: 'add-block', element: 'button[data-action=snippet]', - placement: 'right', - reflex: true, - title: "Shows Building Blocks", - content: "Click on the Insert Blocks button to show the available building blocks.", - template: render('website.tour_simple'), + placement: 'bottom', + title: "Insert building blocks", + content: "To add content in a page, you can insert building blocks.", + template: render('website.tour_popover'), + onShow: function () { + function refreshAddBlockStep () { + self.tour.showStep(self.indexOfStep('add-block')); + editor.off('rte:ready', editor, refreshAddBlockStep); + } + editor.on('rte:ready', editor, refreshAddBlockStep); + $('button[data-action=snippet]').click(function () { + self.movetoStep('drag-banner'); + }); + } }, { stepId: 'drag-banner', element: '#website-top-navbar [data-snippet-id=carousel]', placement: 'bottom', title: "Drag & Drop a Banner", - content: "Drag the Banner block and drop it to the top of your page (purple zone).", - template: render('website.tour_simple'), - onShown: function () { + content: "Drag the Banner block and drop it in your page.

Tip: release the mouse button when you are in a valid zone, with a preview of the banner.

", + template: render('website.tour_popover'), + onShow: function () { function beginDrag () { $('.popover.tour').remove(); $('body').off('mousedown', beginDrag); @@ -130,10 +146,10 @@ { stepId: 'edit-title', element: '#wrap [data-snippet-id=carousel]:first .carousel-caption', - placement: 'top', - title: "Set your Banner text", - content: "Click on the text to start modifying it then click Continue to continue the tutorial.
You can also use the options of the top menubar to change the look of the banner. ", - template: render('website.tour_confirm', { next: "Continue" }), + placement: 'left', + title: "Customize banner's text", + content: "Click in the text and start editing it. Click continue once it's done.", + template: render('website.tour_popover', { next: "Continue" }), onHide: function () { var $banner = $("#wrap [data-snippet-id=carousel]:first"); if ($banner.length) { @@ -145,9 +161,9 @@ stepId: 'customize-banner', element: '.oe_overlay_options .oe_options', placement: 'left', - title: "Customize your new Banner style", - content: "Click on Customize and change the background of your banner.
If your are satisfied with the current background, just click Continue.", - template: render('website.tour_confirm', { next: "Continue" }), + title: "Customize the banner", + content: "You can customize components of your page through the Customize menu. Try to change the background of your banner.", + template: render('website.tour_popover', { next: "Continue" }), onShow: function () { $('.dropdown-menu [name=carousel-background]').click(function () { self.movetoStep('save-changes'); @@ -160,8 +176,8 @@ placement: 'right', reflex: true, title: "Save your modifications", - content: "Click the Save button to apply modifications on your website.", - template: render('website.tour_simple'), + content: "Once you click on save, your website page is updated.", + template: render('website.tour_popover'), onHide: function () { self.saveStep('part-2'); }, @@ -170,40 +186,17 @@ { stepId: 'part-2', orphan: true, - backdrop: true, - title: "Congratutaltions!", - content: "Congratulations on your first modifications.", - template: render('website.tour_confirm', { next: "OK" }), - }, - { - stepId: 'show-customize', - element: '#customize-menu-button', - placement: 'left', - title: "Customize your Website", - content: "Go on the Customize menu to get access customization options for the current page.", - template: render('website.tour_simple'), - onShow: function () { - editor.on('rte:customize_menu_ready', self, function () { - self.movetoStep('change-themes'); - }); - }, - }, - { - stepId: 'change-themes', - element: '.js_change_theme', - placement: 'left', - reflex: true, - title: "Click to View Themes", - content: "You can change the theme at any time to customize the look and feel of your website.", - template: render('website.tour_simple'), + title: "Congratulation!", + content: "Your homepage have been updated. Now, we suggest you to insert others building blocks like texts and images to structure your page.", + template: render('website.tour_popover', { next: "Continue" }), }, { stepId: 'show-tutorials', element: '#help-menu-button', placement: 'left', title: "Help is always available", - content: "You can find more tutorials in the Help menu.", - template: render('website.tour_end', { end: "Close" }), + content: "But you can always click here if you want more tutorials.", + template: render('website.tour_popover', { end: "Close" }), }, ]; return this._super(); @@ -249,7 +242,7 @@ menu.append($menuItem); }); var url = new website.UrlParser(window.location.href); - if (url.search === '?tutorial=true' || website.tutorials.basic.startOfPart2()) { + if (url.search.indexOf('?tutorial=true') === 0 || website.tutorials.basic.startOfPart2()) { website.tutorials.basic.start(); } $('.tour-backdrop').click(function (e) { @@ -260,4 +253,4 @@ }, }); -}()); \ No newline at end of file +}()); diff --git a/addons/website/static/src/xml/website.editor.xml b/addons/website/static/src/xml/website.editor.xml index 66da9692d8e..685712d3411 100644 --- a/addons/website/static/src/xml/website.editor.xml +++ b/addons/website/static/src/xml/website.editor.xml @@ -55,7 +55,8 @@ New page - +
  • diff --git a/addons/website/static/src/xml/website.tour.xml b/addons/website/static/src/xml/website.tour.xml index 75ffe0fe505..d2f562dec61 100644 --- a/addons/website/static/src/xml/website.tour.xml +++ b/addons/website/static/src/xml/website.tour.xml @@ -1,44 +1,27 @@ - +

    + + +
    - -
    -
    -

    -
    - -
    -
    - -
    -
    -

    -
    - -
    -
    - -
    -
    -

    -
    - -
    -
    - + -
    \ No newline at end of file + diff --git a/addons/website/views/snippets.xml b/addons/website/views/snippets.xml index 5e9bb5e623d..8a768a9fbb9 100644 --- a/addons/website/views/snippets.xml +++ b/addons/website/views/snippets.xml @@ -40,8 +40,7 @@
  • Velour
  • Wood
  • Yellow Green
  • -
  • -
  • Chose your picture
  • +
  • Choose a photo...