From 7e43c5e13529c34224b510b4114e3943f89da902 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Wed, 18 Apr 2012 11:59:43 +0530 Subject: [PATCH 001/168] q bzr revid: tta@openerp.com-20120418062943-rtvpby15skwqmywx --- addons/base_contact/i18n/cs.po | 501 -------------------------- addons/base_contact/i18n/ja.po | 264 -------------- addons/fetchmail_crm_claim/i18n/ja.po | 34 ++ 3 files changed, 34 insertions(+), 765 deletions(-) delete mode 100644 addons/base_contact/i18n/cs.po delete mode 100644 addons/base_contact/i18n/ja.po create mode 100644 addons/fetchmail_crm_claim/i18n/ja.po diff --git a/addons/base_contact/i18n/cs.po b/addons/base_contact/i18n/cs.po deleted file mode 100644 index e48443f7681..00000000000 --- a/addons/base_contact/i18n/cs.po +++ /dev/null @@ -1,501 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * base_contact -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2012-02-08 00:36+0000\n" -"PO-Revision-Date: 2012-04-15 15:01+0000\n" -"Last-Translator: Jiří Hajda \n" -"Language-Team: Czech \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-04-16 04:40+0000\n" -"X-Generator: Launchpad (build 15099)\n" -"X-Poedit-Language: Czech\n" - -#. module: base_contact -#: field:res.partner.location,city:0 -msgid "City" -msgstr "Město" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "First/Lastname" -msgstr "Křestní jméno/Příjmení" - -#. module: base_contact -#: model:ir.actions.act_window,name:base_contact.action_partner_contact_form -#: model:ir.ui.menu,name:base_contact.menu_partner_contact_form -#: model:ir.ui.menu,name:base_contact.menu_purchases_partner_contact_form -#: model:process.node,name:base_contact.process_node_contacts0 -#: field:res.partner.location,job_ids:0 -msgid "Contacts" -msgstr "Kontakty" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Professional Info" -msgstr "Povolání" - -#. module: base_contact -#: field:res.partner.contact,first_name:0 -msgid "First Name" -msgstr "Křestní jméno" - -#. module: base_contact -#: field:res.partner.address,location_id:0 -msgid "Location" -msgstr "Umístění" - -#. module: base_contact -#: model:process.transition,name:base_contact.process_transition_partnertoaddress0 -msgid "Partner to address" -msgstr "Partner na adresu" - -#. module: base_contact -#: help:res.partner.contact,active:0 -msgid "" -"If the active field is set to False, it will allow you to " -"hide the partner contact without removing it." -msgstr "" -"Pokud je aktivní pole nastaveno na Nepravda, umožní vám to " -"skrýt kontakt partnera bez jeho odstranění." - -#. module: base_contact -#: field:res.partner.contact,website:0 -msgid "Website" -msgstr "Webová stránka" - -#. module: base_contact -#: field:res.partner.location,zip:0 -msgid "Zip" -msgstr "PSČ" - -#. module: base_contact -#: field:res.partner.location,state_id:0 -msgid "Fed. State" -msgstr "Fed. stát" - -#. module: base_contact -#: field:res.partner.location,company_id:0 -msgid "Company" -msgstr "Společnost" - -#. module: base_contact -#: field:res.partner.contact,title:0 -msgid "Title" -msgstr "Název" - -#. module: base_contact -#: field:res.partner.location,partner_id:0 -msgid "Main Partner" -msgstr "Hlavní partner" - -#. module: base_contact -#: model:process.process,name:base_contact.process_process_basecontactprocess0 -msgid "Base Contact" -msgstr "Základní kontakt" - -#. module: base_contact -#: field:res.partner.contact,email:0 -msgid "E-Mail" -msgstr "E-mail" - -#. module: base_contact -#: field:res.partner.contact,active:0 -msgid "Active" -msgstr "Aktivní" - -#. module: base_contact -#: field:res.partner.contact,country_id:0 -msgid "Nationality" -msgstr "Národnost" - -#. module: base_contact -#: view:res.partner:0 -#: view:res.partner.address:0 -msgid "Postal Address" -msgstr "Poštovní adresa" - -#. module: base_contact -#: field:res.partner.contact,function:0 -msgid "Main Function" -msgstr "Hlavní funkce" - -#. module: base_contact -#: model:process.transition,note:base_contact.process_transition_partnertoaddress0 -msgid "Define partners and their addresses." -msgstr "Určuje partnery a jejich adresy." - -#. module: base_contact -#: field:res.partner.contact,name:0 -msgid "Name" -msgstr "Jméno" - -#. module: base_contact -#: field:res.partner.contact,lang_id:0 -msgid "Language" -msgstr "Jazyk" - -#. module: base_contact -#: field:res.partner.contact,mobile:0 -msgid "Mobile" -msgstr "Mobil" - -#. module: base_contact -#: field:res.partner.location,country_id:0 -msgid "Country" -msgstr "Země" - -#. module: base_contact -#: view:res.partner.contact:0 -#: field:res.partner.contact,comment:0 -msgid "Notes" -msgstr "Poznámky" - -#. module: base_contact -#: model:process.node,note:base_contact.process_node_contacts0 -msgid "People you work with." -msgstr "Lidé, s kterými pracujete." - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Extra Information" -msgstr "Speciální informace" - -#. module: base_contact -#: view:res.partner.contact:0 -#: field:res.partner.contact,job_ids:0 -msgid "Functions and Addresses" -msgstr "Funkce a adresy" - -#. module: base_contact -#: model:ir.model,name:base_contact.model_res_partner_contact -#: field:res.partner.address,contact_id:0 -msgid "Contact" -msgstr "Kontakt" - -#. module: base_contact -#: model:ir.model,name:base_contact.model_res_partner_location -msgid "res.partner.location" -msgstr "res.partner.location" - -#. module: base_contact -#: model:process.node,note:base_contact.process_node_partners0 -msgid "Companies you work with." -msgstr "Společnosti, se kterými pracujete." - -#. module: base_contact -#: field:res.partner.contact,partner_id:0 -msgid "Main Employer" -msgstr "Hlavní zaměstnavatel" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Partner Contact" -msgstr "Kontakt partnera" - -#. module: base_contact -#: model:process.node,name:base_contact.process_node_addresses0 -msgid "Addresses" -msgstr "Adresy" - -#. module: base_contact -#: model:process.node,note:base_contact.process_node_addresses0 -msgid "Working and private addresses." -msgstr "Pracovní a soukromé adresy." - -#. module: base_contact -#: field:res.partner.contact,last_name:0 -msgid "Last Name" -msgstr "Příjmení" - -#. module: base_contact -#: view:res.partner.contact:0 -#: field:res.partner.contact,photo:0 -msgid "Photo" -msgstr "Fotka" - -#. module: base_contact -#: view:res.partner.location:0 -msgid "Locations" -msgstr "Umístění" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "General" -msgstr "Obecný" - -#. module: base_contact -#: field:res.partner.location,street:0 -msgid "Street" -msgstr "Ulice" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Partner" -msgstr "Partner" - -#. module: base_contact -#: model:process.node,name:base_contact.process_node_partners0 -msgid "Partners" -msgstr "Partneři" - -#. module: base_contact -#: model:ir.model,name:base_contact.model_res_partner_address -msgid "Partner Addresses" -msgstr "Adresy partnerů" - -#. module: base_contact -#: field:res.partner.location,street2:0 -msgid "Street2" -msgstr "Ulice 2" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Personal Information" -msgstr "Osobní informace" - -#. module: base_contact -#: field:res.partner.contact,birthdate:0 -msgid "Birth Date" -msgstr "Datum narození" - -#~ msgid "Categories" -#~ msgstr "Kategorie" - -#~ msgid "Current" -#~ msgstr "Stávající" - -#~ msgid "Fax" -#~ msgstr "Fax" - -#~ msgid "Address" -#~ msgstr "Adresa" - -#~ msgid "Invalid XML for View Architecture!" -#~ msgstr "Invalidní XML pro zobrazení architektury!" - -#~ msgid "" -#~ "The Object name must start with x_ and not contain any special character !" -#~ msgstr "" -#~ "Jméno objektu musí začínat znakem x_ a nesmí obsahovat žádný speciální znak!" - -#~ msgid "Invalid model name in the action definition." -#~ msgstr "Špatný název modelu v definici akce" - -#~ msgid "Contact Functions" -#~ msgstr "Kontaktní funkce" - -#~ msgid "Phone" -#~ msgstr "Telefon" - -#~ msgid "Function" -#~ msgstr "Funkce" - -#~ msgid "# of Contacts" -#~ msgstr "# z kontaktů" - -#~ msgid "title" -#~ msgstr "nadpis" - -#~ msgid "Start date of job(Joining Date)" -#~ msgstr "Datum zahájení práce (datum připojení)" - -#~ msgid "Select the Option for Addresses Migration" -#~ msgstr "Vyberte volbu pro přesun adres" - -#~ msgid "Function of this contact with this partner" -#~ msgstr "Funkce tohoto kontaktu s tímto partnerem" - -#~ msgid "Status of Address" -#~ msgstr "Stav adresy" - -#~ msgid "" -#~ "You may enter Address first,Partner will be linked " -#~ "automatically if any." -#~ msgstr "" -#~ "Můžete zadat nejdříve adresu. Pokud je nějaký partner, " -#~ "bude napojen automaticky." - -#~ msgid "Job FAX no." -#~ msgstr "Číslo FAXu do práce" - -#~ msgid "Define functions and address." -#~ msgstr "Určit funkce a adresu." - -#~ msgid "Last date of job" -#~ msgstr "Poslední datum práce" - -#~ msgid "Migrate" -#~ msgstr "Přesunout" - -#~ msgid "Jobs at a same partner address." -#~ msgstr "Pracovní pozice u stejné adresy partnera." - -#~ msgid "State" -#~ msgstr "Stav" - -#~ msgid "" -#~ "\n" -#~ " This module allows you to manage your contacts entirely.\n" -#~ "\n" -#~ " It lets you define\n" -#~ " *contacts unrelated to a partner,\n" -#~ " *contacts working at several addresses (possibly for different " -#~ "partners),\n" -#~ " *contacts with possibly different functions for each of its job's " -#~ "addresses\n" -#~ "\n" -#~ " It also adds new menu items located in\n" -#~ " Partners \\ Contacts\n" -#~ " Partners \\ Functions\n" -#~ "\n" -#~ " Pay attention that this module converts the existing addresses into " -#~ "\"addresses + contacts\". It means that some fields of the addresses will be " -#~ "missing (like the contact name), since these are supposed to be defined in " -#~ "an other object.\n" -#~ " " -#~ msgstr "" -#~ "\n" -#~ " Tento modul umožňuje úplně spravovat vaše kontakty.\n" -#~ "\n" -#~ " Nechá vás určit\n" -#~ " *kontakty nevztažené k partnerovi,\n" -#~ " *kontakty pracující na několika adresách (případně i pro různé " -#~ "partnery),\n" -#~ " *kontakty s možnými různými funkcemi pro každou jeho pracovní " -#~ "adresu\n" -#~ "\n" -#~ " Také přidává nové položky nabídky umístěné v\n" -#~ " Partneři \\ Kontakty\n" -#~ " Partneři \\ Funkce\n" -#~ "\n" -#~ " Berte na vědomí, že tento modul převádí existující adresy na \"adresy + " -#~ "kontakty\". To znamená, že některé pole adres budou chybět (jako jméno " -#~ "kontaktu), protože ty jsou definovány v jiném objektu.\n" -#~ " " - -#~ msgid "Date Stop" -#~ msgstr "Datum zastavení" - -#~ msgid "Contact's Jobs" -#~ msgstr "Pozice kontaktu" - -#~ msgid "" -#~ "Order of importance of this job title in the list of job " -#~ "title of the linked partner" -#~ msgstr "" -#~ "Pořadí důležitosti této pracovní pozice v seznamu titulů " -#~ "pozic napojeného partnera" - -#~ msgid "Extension" -#~ msgstr "Rozšíření" - -#~ msgid "Internal/External extension phone number" -#~ msgstr "Vnitřní/vnější telefoní číslo klapky" - -#~ msgid "Job Phone no." -#~ msgstr "Telefoní číslo do práce." - -#~ msgid "Job E-Mail" -#~ msgstr "Pracovní E-Mail" - -#~ msgid "Partner Seq." -#~ msgstr "Poř. parnera" - -#~ msgid "Function to address" -#~ msgstr "Funkce na adresu" - -#~ msgid "Configuration Progress" -#~ msgstr "Průběh nastavení" - -#~ msgid "Communication" -#~ msgstr "Komunikace" - -#~ msgid "Image" -#~ msgstr "Obrázek" - -#~ msgid "Past" -#~ msgstr "Minulý" - -#~ msgid "Address's Migration to Contacts" -#~ msgstr "Stěhování adresy na kontakty" - -#~ msgid "Contact Seq." -#~ msgstr "Poř. kontaktu" - -#~ msgid "Search Contact" -#~ msgstr "Hledat kontakt" - -#~ msgid "" -#~ "Due to changes in Address and Partner's relation, some of the details from " -#~ "address are needed to be migrated into contact information." -#~ msgstr "" -#~ "Kvůli změnám v adrese a vztahu partnera, některé podrobnosti adresy jsou " -#~ "potřebné, aby byly přesunuty do informací účtu." - -#~ msgid "Address which is linked to the Partner" -#~ msgstr "Adresa, která je napojena na partnera" - -#~ msgid "Partner Function" -#~ msgstr "Funkce partnera" - -#~ msgid "Additional phone field" -#~ msgstr "Doplňující pole telefonu" - -#~ msgid "Otherwise these details will not be visible from address/contact." -#~ msgstr "Jinak tyto podrobnosti nebudou viditelné z adresy/kontaktu." - -#~ msgid "Configure" -#~ msgstr "Nastavit" - -#~ msgid "base.contact.installer" -#~ msgstr "base.contact.installer" - -#~ msgid "Do you want to migrate your Address data in Contact Data?" -#~ msgstr "Chcete stěhovat vaše data adresy v datech kontaktu?" - -#~ msgid "Seq." -#~ msgstr "Poř." - -#~ msgid "If you select this, all addresses will be migrated." -#~ msgstr "Pokud toto vyberete, všechny adresy budou přesunuty." - -#~ msgid "Contact Partner Function" -#~ msgstr "Kontakt funkce partnera" - -#~ msgid "Other" -#~ msgstr "Jiné" - -#~ msgid "Main Job" -#~ msgstr "Hlavní práce" - -#~ msgid "Defines contacts and functions." -#~ msgstr "Určuje kontakty a funkce." - -#~ msgid "Contact to function" -#~ msgstr "Kontakt na funkci" - -#~ msgid "Open Jobs" -#~ msgstr "Otevřené pozice" - -#~ msgid "You can migrate Partner's current addresses to the contact." -#~ msgstr "Můžete stěhovat partnerovu aktuální adresu do kontaktu." - -#~ msgid "Address Migration" -#~ msgstr "Stěhování adresy" - -#~ msgid "Date Start" -#~ msgstr "Počáteční datum" - -#~ msgid "" -#~ "Order of importance of this address in the list of " -#~ "addresses of the linked contact" -#~ msgstr "" -#~ "Pořadí podle důležitosti této adresy v seznamu adres napojeného " -#~ "kontaktu" diff --git a/addons/base_contact/i18n/ja.po b/addons/base_contact/i18n/ja.po deleted file mode 100644 index 89af47fb6ac..00000000000 --- a/addons/base_contact/i18n/ja.po +++ /dev/null @@ -1,264 +0,0 @@ -# Japanese translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:36+0000\n" -"PO-Revision-Date: 2012-04-14 00:01+0000\n" -"Last-Translator: Tomomi Mengelberg \n" -"Language-Team: Japanese \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-04-15 04:42+0000\n" -"X-Generator: Launchpad (build 15070)\n" - -#. module: base_contact -#: field:res.partner.location,city:0 -msgid "City" -msgstr "市区町村" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "First/Lastname" -msgstr "名/姓" - -#. module: base_contact -#: model:ir.actions.act_window,name:base_contact.action_partner_contact_form -#: model:ir.ui.menu,name:base_contact.menu_partner_contact_form -#: model:ir.ui.menu,name:base_contact.menu_purchases_partner_contact_form -#: model:process.node,name:base_contact.process_node_contacts0 -#: field:res.partner.location,job_ids:0 -msgid "Contacts" -msgstr "連絡先" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Professional Info" -msgstr "" - -#. module: base_contact -#: field:res.partner.contact,first_name:0 -msgid "First Name" -msgstr "姓" - -#. module: base_contact -#: field:res.partner.address,location_id:0 -msgid "Location" -msgstr "場所" - -#. module: base_contact -#: model:process.transition,name:base_contact.process_transition_partnertoaddress0 -msgid "Partner to address" -msgstr "" - -#. module: base_contact -#: help:res.partner.contact,active:0 -msgid "" -"If the active field is set to False, it will allow you to " -"hide the partner contact without removing it." -msgstr "" - -#. module: base_contact -#: field:res.partner.contact,website:0 -msgid "Website" -msgstr "ウェブサイト" - -#. module: base_contact -#: field:res.partner.location,zip:0 -msgid "Zip" -msgstr "郵便番号" - -#. module: base_contact -#: field:res.partner.location,state_id:0 -msgid "Fed. State" -msgstr "" - -#. module: base_contact -#: field:res.partner.location,company_id:0 -msgid "Company" -msgstr "会社" - -#. module: base_contact -#: field:res.partner.contact,title:0 -msgid "Title" -msgstr "役職" - -#. module: base_contact -#: field:res.partner.location,partner_id:0 -msgid "Main Partner" -msgstr "主なパートナ" - -#. module: base_contact -#: model:process.process,name:base_contact.process_process_basecontactprocess0 -msgid "Base Contact" -msgstr "" - -#. module: base_contact -#: field:res.partner.contact,email:0 -msgid "E-Mail" -msgstr "メール" - -#. module: base_contact -#: field:res.partner.contact,active:0 -msgid "Active" -msgstr "有効" - -#. module: base_contact -#: field:res.partner.contact,country_id:0 -msgid "Nationality" -msgstr "国籍" - -#. module: base_contact -#: view:res.partner:0 -#: view:res.partner.address:0 -msgid "Postal Address" -msgstr "住所" - -#. module: base_contact -#: field:res.partner.contact,function:0 -msgid "Main Function" -msgstr "主な役割" - -#. module: base_contact -#: model:process.transition,note:base_contact.process_transition_partnertoaddress0 -msgid "Define partners and their addresses." -msgstr "" - -#. module: base_contact -#: field:res.partner.contact,name:0 -msgid "Name" -msgstr "名前" - -#. module: base_contact -#: field:res.partner.contact,lang_id:0 -msgid "Language" -msgstr "言語" - -#. module: base_contact -#: field:res.partner.contact,mobile:0 -msgid "Mobile" -msgstr "携帯電話" - -#. module: base_contact -#: field:res.partner.location,country_id:0 -msgid "Country" -msgstr "国名" - -#. module: base_contact -#: view:res.partner.contact:0 -#: field:res.partner.contact,comment:0 -msgid "Notes" -msgstr "備考" - -#. module: base_contact -#: model:process.node,note:base_contact.process_node_contacts0 -msgid "People you work with." -msgstr "同僚" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Extra Information" -msgstr "その他の情報" - -#. module: base_contact -#: view:res.partner.contact:0 -#: field:res.partner.contact,job_ids:0 -msgid "Functions and Addresses" -msgstr "" - -#. module: base_contact -#: model:ir.model,name:base_contact.model_res_partner_contact -#: field:res.partner.address,contact_id:0 -msgid "Contact" -msgstr "連絡先" - -#. module: base_contact -#: model:ir.model,name:base_contact.model_res_partner_location -msgid "res.partner.location" -msgstr "" - -#. module: base_contact -#: model:process.node,note:base_contact.process_node_partners0 -msgid "Companies you work with." -msgstr "同僚" - -#. module: base_contact -#: field:res.partner.contact,partner_id:0 -msgid "Main Employer" -msgstr "" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Partner Contact" -msgstr "パートナー連絡先" - -#. module: base_contact -#: model:process.node,name:base_contact.process_node_addresses0 -msgid "Addresses" -msgstr "住所" - -#. module: base_contact -#: model:process.node,note:base_contact.process_node_addresses0 -msgid "Working and private addresses." -msgstr "勤め先住所と自宅住所" - -#. module: base_contact -#: field:res.partner.contact,last_name:0 -msgid "Last Name" -msgstr "姓" - -#. module: base_contact -#: view:res.partner.contact:0 -#: field:res.partner.contact,photo:0 -msgid "Photo" -msgstr "写真" - -#. module: base_contact -#: view:res.partner.location:0 -msgid "Locations" -msgstr "場所" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "General" -msgstr "" - -#. module: base_contact -#: field:res.partner.location,street:0 -msgid "Street" -msgstr "番地" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Partner" -msgstr "パートナ" - -#. module: base_contact -#: model:process.node,name:base_contact.process_node_partners0 -msgid "Partners" -msgstr "取引先" - -#. module: base_contact -#: model:ir.model,name:base_contact.model_res_partner_address -msgid "Partner Addresses" -msgstr "パートナの住所" - -#. module: base_contact -#: field:res.partner.location,street2:0 -msgid "Street2" -msgstr "番地" - -#. module: base_contact -#: view:res.partner.contact:0 -msgid "Personal Information" -msgstr "個人情報" - -#. module: base_contact -#: field:res.partner.contact,birthdate:0 -msgid "Birth Date" -msgstr "生年月日" diff --git a/addons/fetchmail_crm_claim/i18n/ja.po b/addons/fetchmail_crm_claim/i18n/ja.po new file mode 100644 index 00000000000..a1f6db4a764 --- /dev/null +++ b/addons/fetchmail_crm_claim/i18n/ja.po @@ -0,0 +1,34 @@ +# Japanese translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-04-08 05:43+0000\n" +"Last-Translator: Masaki Yamaya \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-04-09 04:56+0000\n" +"X-Generator: Launchpad (build 15060)\n" + +#. module: fetchmail_crm_claim +#: model:ir.actions.act_window,help:fetchmail_crm_claim.action_create_crm_claims_from_email_account +msgid "" +"You can connect your email account with claims in OpenERP. A new email sent " +"to this account (example: support@mycompany.com) will automatically create a " +"claim for the followup in OpenERP. The whole communication by email will be " +"attached to the claim automatically to keep track of the history." +msgstr "" +"あなたのEメールアカウントをOpenERPのクレームに関連づけることはできません。このアカウントに送られた新しいEメールはOpenERPのフォローアップの" +"ためのクレームを自動的に作成します。Eメールによる全てのコミュニケーションは、履歴を記録するために、自動的にクレームに関連づけられます。" + +#. module: fetchmail_crm_claim +#: model:ir.actions.act_window,name:fetchmail_crm_claim.action_create_crm_claims_from_email_account +msgid "Create Claims from Email Account" +msgstr "Eメールアカウントからクレームを作成" From 2c780efd12a47d440e7b9a4ecae7da0cf9565390 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Thu, 19 Apr 2012 18:59:16 +0530 Subject: [PATCH 002/168] Web Etherpad Integration bzr revid: tta@openerp.com-20120419132916-yzrdnz2y8gus2wlw --- addons/web_etherpad/__init__.py | 2 + addons/web_etherpad/__openerp__.py | 16 +++ addons/web_etherpad/res_company.py | 15 +++ addons/web_etherpad/res_company.xml | 16 +++ .../static/src/js/web_etherpad.js | 125 ++++++++++++++++++ .../web_etherpad/static/src/xml/etherpad.xml | 21 +++ 6 files changed, 195 insertions(+) create mode 100644 addons/web_etherpad/__init__.py create mode 100755 addons/web_etherpad/__openerp__.py create mode 100644 addons/web_etherpad/res_company.py create mode 100644 addons/web_etherpad/res_company.xml create mode 100755 addons/web_etherpad/static/src/js/web_etherpad.js create mode 100755 addons/web_etherpad/static/src/xml/etherpad.xml diff --git a/addons/web_etherpad/__init__.py b/addons/web_etherpad/__init__.py new file mode 100644 index 00000000000..df35bc32106 --- /dev/null +++ b/addons/web_etherpad/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +import res_company diff --git a/addons/web_etherpad/__openerp__.py b/addons/web_etherpad/__openerp__.py new file mode 100755 index 00000000000..829081e8c65 --- /dev/null +++ b/addons/web_etherpad/__openerp__.py @@ -0,0 +1,16 @@ +{ + "name": "web_etherpad", + "category" : "Hidden", + "description":'Openerp web Etherpad Widget', + "version": "2.0", + 'author': 'OpenERP SA', + 'website': 'http://openerp.com', + 'data': [ + 'res_company.xml' + ], + "depends": ['base','web'], + 'qweb' : ['static/src/xml/etherpad.xml'], + "css": [], + "js": ['static/src/js/web_etherpad.js'], + "auto_install": False, +} diff --git a/addons/web_etherpad/res_company.py b/addons/web_etherpad/res_company.py new file mode 100644 index 00000000000..0c1dc7c4929 --- /dev/null +++ b/addons/web_etherpad/res_company.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from osv import fields, osv + +class company_pad(osv.osv): + _inherit = 'res.company' + _columns = { + 'pad_url_template': fields.char('Pad URL Template', size=128, required=True, + help="Template used to generate pad URL."), + } + _defaults = { + 'pad_url_template': 'http://ietherpad.com/%(db)s-%(model)s-%(id)d-%(salt)s-%(name)s' + } + + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/web_etherpad/res_company.xml b/addons/web_etherpad/res_company.xml new file mode 100644 index 00000000000..20b6f52d853 --- /dev/null +++ b/addons/web_etherpad/res_company.xml @@ -0,0 +1,16 @@ + + + + res.company.form.pad + res.company + form + + + + + + + + + + diff --git a/addons/web_etherpad/static/src/js/web_etherpad.js b/addons/web_etherpad/static/src/js/web_etherpad.js new file mode 100755 index 00000000000..d19fb2b9512 --- /dev/null +++ b/addons/web_etherpad/static/src/js/web_etherpad.js @@ -0,0 +1,125 @@ +openerp.web_etherpad = function (instance) { + + instance.web.form.FieldEtherpad = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { + template: 'FieldEtherpad', + initialize_content: function() { + this.$textarea = undefined; + if (!this.get("effective_readonly")) { + this.$textarea = this.$element.find('textarea'); + //this.$textarea.hide(); + this.$textarea.change(_.bind(function() { + this.set({'value': instance.web.parse_value(this.$textarea.val(), this)}); + }, this)); + this.resized = false; + } + }, + set_value: function(value_) { + var self = this ; + var company_id = (self.view.datarecord.hasOwnProperty('id')) ?self.view.datarecord.company_id[0]: self.view.datarecord.company_id ; + /* getting etherpad url and set pad to field. */ + self.rpc('/web/dataset/get',{ + 'model':'res.company', + 'ids':[company_id], + 'fields':['pad_url_template'], + 'context':{} + },function(companies){ + var pad_template = companies[0].pad_url_template.replace('-%(salt)s-%(name)s','').replace(/\s/g,''); + + var patt_url = (_.str.sprintf(pad_template.replace('-%(id)d',''), { + db : self.session.db, + model : self.view.model, + })).replace(/\s/g,'') ; + //alert("match or not >?"+value_.search(patt_url)); + if(value_ == false) + self.add_pad(self,pad_template,value_); + else if(value_.search(patt_url) != 0) + self.add_pad(self,pad_template,value_); + else + self.show_pad_value(self,value_); + }); + }, + show_pad_value: function(self,value_) + { + self._inhibit_on_change = true; + self.set({'value': value_ }); + self._inhibit_on_change = false; + self.invalid = false; + self.update_dom(); + self.render_value(); + }, + add_pad: function(self,pad_template,value_){ + var url = (_.str.sprintf(pad_template, { + db : self.session.db, + model : self.view.model, + id : Math.round(new Date().getTime()/100.0), + })).replace(/\s/g,''); + var show_value = instance.web.format_value(value_, this, ''); + self.show_pad_value(self,url + '\n'+ show_value); + this.dirty = true; + }, + render_value: function() { + var show_value = instance.web.format_value(this.get('value'), this, ''); + if (!this.get("effective_readonly")) { + this.$textarea.val(show_value); + this.$element.find('div').html(''); + if (!this.resized && this.view.options.resize_textareas) { + this.do_resize(this.view.options.resize_textareas); + this.resized = true; + } + } else { + this.$element.text(show_value); + if(this.get('value') != false) + { + var self = this; + $.get(show_value.split('\n')[0]+'/export/html', function(data) { + console.log(data); + self.$element.html(data); + }); + } + } + }, + validate: function() { + this.invalid = false; + if (!this.get("effective_readonly")) { + try { + var value_ = instance.web.parse_value(this.$textarea.val(), this, ''); + this.invalid = this.get("required") && value_ === ''; + } catch(e) { + this.invalid = true; + } + } + }, + focus: function($element) { + this._super($element || this.$textarea); + }, + do_resize: function(max_height) { + max_height = parseInt(max_height, 10); + var $input = this.$textarea, + $div = $('
').width($input.width()), + new_height; + $div.text($input.val()); + _.each('font-family,font-size,white-space'.split(','), function(style) { + $div.css(style, $input.css(style)); + }); + $div.appendTo($('body')); + new_height = $div.height(); + if (new_height < 90) { + new_height = 90; + } + if (!isNaN(max_height) && new_height > max_height) { + new_height = max_height; + } + $div.remove(); + $input.height(new_height); + }, + reset: function() { + this.resized = false; + } + })); + + instance.web.form.widgets = instance.web.form.widgets.extend({ + 'etherpad': 'instance.web.form.FieldEtherpad', + }); + + +} diff --git a/addons/web_etherpad/static/src/xml/etherpad.xml b/addons/web_etherpad/static/src/xml/etherpad.xml new file mode 100755 index 00000000000..64c2e2dc6a0 --- /dev/null +++ b/addons/web_etherpad/static/src/xml/etherpad.xml @@ -0,0 +1,21 @@ + + + + + + + +
+ +
+
+
+
+ +
From 4cb57e25230fb289d4e61dd2acb31953ebe7e2a2 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Thu, 19 Apr 2012 19:05:22 +0530 Subject: [PATCH 003/168] Not show textarea bzr revid: tta@openerp.com-20120419133522-lk286h44c2y06j6g --- addons/web_etherpad/static/src/js/web_etherpad.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_etherpad/static/src/js/web_etherpad.js b/addons/web_etherpad/static/src/js/web_etherpad.js index d19fb2b9512..28afe60133d 100755 --- a/addons/web_etherpad/static/src/js/web_etherpad.js +++ b/addons/web_etherpad/static/src/js/web_etherpad.js @@ -6,7 +6,7 @@ openerp.web_etherpad = function (instance) { this.$textarea = undefined; if (!this.get("effective_readonly")) { this.$textarea = this.$element.find('textarea'); - //this.$textarea.hide(); + this.$textarea.hide(); this.$textarea.change(_.bind(function() { this.set({'value': instance.web.parse_value(this.$textarea.val(), this)}); }, this)); From fa035be71d8ccabd31b15fd26cf6d8eefe8ae2fc Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Fri, 20 Apr 2012 16:27:06 +0530 Subject: [PATCH 004/168] Etherpad : with edit avble to save pad. bzr revid: tta@openerp.com-20120420105706-58pf3atz6qy90ttb --- .../static/src/js/web_etherpad.js | 46 ++++++++----------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/addons/web_etherpad/static/src/js/web_etherpad.js b/addons/web_etherpad/static/src/js/web_etherpad.js index 28afe60133d..22f21cd1e67 100755 --- a/addons/web_etherpad/static/src/js/web_etherpad.js +++ b/addons/web_etherpad/static/src/js/web_etherpad.js @@ -16,27 +16,19 @@ openerp.web_etherpad = function (instance) { set_value: function(value_) { var self = this ; var company_id = (self.view.datarecord.hasOwnProperty('id')) ?self.view.datarecord.company_id[0]: self.view.datarecord.company_id ; - /* getting etherpad url and set pad to field. */ - self.rpc('/web/dataset/get',{ - 'model':'res.company', - 'ids':[company_id], - 'fields':['pad_url_template'], - 'context':{} - },function(companies){ - var pad_template = companies[0].pad_url_template.replace('-%(salt)s-%(name)s','').replace(/\s/g,''); + new instance.web.DataSet(this, 'res.company', {}).read_ids([company_id],['pad_url_template'],{}).then(function(res){ + console.log("dataset :::::" , res); + var pad_template = res[0].pad_url_template.replace('-%(salt)s-%(name)s','').replace(/\s/g,''); - var patt_url = (_.str.sprintf(pad_template.replace('-%(id)d',''), { + var patt_url = (_.str.sprintf(pad_template.replace('-%(id)d',''), { db : self.session.db, model : self.view.model, })).replace(/\s/g,'') ; - //alert("match or not >?"+value_.search(patt_url)); - if(value_ == false) - self.add_pad(self,pad_template,value_); - else if(value_.search(patt_url) != 0) - self.add_pad(self,pad_template,value_); - else - self.show_pad_value(self,value_); - }); + if(value_ == false || value_.search(patt_url) != 0) + self.add_pad(self,pad_template,value_); + else + self.show_pad_value(self,value_); + }); }, show_pad_value: function(self,value_) { @@ -44,7 +36,6 @@ openerp.web_etherpad = function (instance) { self.set({'value': value_ }); self._inhibit_on_change = false; self.invalid = false; - self.update_dom(); self.render_value(); }, add_pad: function(self,pad_template,value_){ @@ -54,14 +45,14 @@ openerp.web_etherpad = function (instance) { id : Math.round(new Date().getTime()/100.0), })).replace(/\s/g,''); var show_value = instance.web.format_value(value_, this, ''); - self.show_pad_value(self,url + '\n'+ show_value); - this.dirty = true; + self.show_pad_value(self,url + '\n'+ show_value); + self._dirty_flag = true ; }, render_value: function() { var show_value = instance.web.format_value(this.get('value'), this, ''); if (!this.get("effective_readonly")) { this.$textarea.val(show_value); - this.$element.find('div').html(''); + this.$element.find('div').html(''); if (!this.resized && this.view.options.resize_textareas) { this.do_resize(this.view.options.resize_textareas); this.resized = true; @@ -70,11 +61,14 @@ openerp.web_etherpad = function (instance) { this.$element.text(show_value); if(this.get('value') != false) { - var self = this; - $.get(show_value.split('\n')[0]+'/export/html', function(data) { - console.log(data); - self.$element.html(data); - }); + var self = this; + if(show_value.split('\n')[0] != '') + $.get(show_value.split('\n')[0]+'/export/html', function(data) { + console.log(data); + self.$element.html(data); + }); + else + self.$element.text(show_value); } } }, From ccb2731a49ea33b1a0a3a1dfca5a09ce7163e300 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Fri, 20 Apr 2012 19:07:43 +0530 Subject: [PATCH 005/168] in project widget='etherpad' added bzr revid: tta@openerp.com-20120420133743-2o5d0spxwfxin0yo --- addons/project/project_view.xml | 2 +- addons/web_etherpad/static/src/js/web_etherpad.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 63898cb518d..a5498e9849d 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -262,7 +262,7 @@ - - - - - - diff --git a/doc/form-notes.rst b/doc/form-notes.rst new file mode 100644 index 00000000000..fc450a336e1 --- /dev/null +++ b/doc/form-notes.rst @@ -0,0 +1,49 @@ +Notes on the usage of the Form View as a sub-widget +=================================================== + +Undocumented stuff +------------------ + +* ``initial_mode`` *option* defines the starting mode of the form + view, one of ``view`` and ``edit`` (?). Default value is ``view`` + (non-editable form). + +* ``embedded_view`` *attribute* has to be set separately when + providing a view directly, no option available for that usage. + + * View arch **must** contain node with + ``@class="oe_form_container"``, otherwise everything will break + without any info + + * Root element of view arch not being ``form`` may or may not work + correctly, no idea. + + * Freeform views => ``@version="7.0"`` + +* Form is not entirely loaded (some widgets may not appear) unless + ``on_record_loaded`` is called (or ``do_show``, which itself calls + ``on_record_loaded``). + +* "Empty" form => ``on_button_new`` (...), or manually call + ``default_get`` + ``on_record_loaded`` + +* Form fields default to width: 100%, padding, !important margin, can + be reached via ``.oe_form_field`` + +* Form *will* render buttons and a pager, offers options to locate + both outside of form itself (``$buttons`` and ``$pager``), providing + empty jquery objects (``$()``) seems to stop displaying both but not + sure if there are deleterious side-effects. + + Other options: + + * Pass in ``$(document.createDocumentFragment)`` to ensure it's a + DOM-compatible tree completely outside of the actual DOM. + + * ??? + +* readonly fields probably don't have a background, beware if need of + overlay + + * What is the difference between ``readonly`` and + ``effective_readonly``? diff --git a/doc/index.rst b/doc/index.rst index 9f54b879acc..c5b85326dac 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,6 +18,8 @@ Contents: search-view + form-notes + Older stuff ----------- From cbba19da672a74c6e3edd7dc577e09e5f07f3bb9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 28 Jun 2012 10:45:47 +0200 Subject: [PATCH 042/168] [IMP] automatically focus first field of edited row bzr revid: xmo@openerp.com-20120628084547-6fo7fkiy2gh2wb6m --- addons/web/static/src/js/view_list_editable.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 4109a5bd6d5..74b51c3c686 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -147,7 +147,6 @@ openerp.web.list_editable = function (instance) { return this.form.on_record_loaded(record.attributes).pipe(function () { return self.form.do_show({reload: false}); }).then(function () { - // TODO: automatic focus of ?first field // TODO: [Save] button // TODO: save on action button? _(cells).each(function (cell, field_name) { @@ -169,6 +168,8 @@ openerp.web.list_editable = function (instance) { minHeight: $cell.outerHeight() }); }); + // TODO: actually focus clicked field (if editable) + self.form.fields[self.form.fields_order[0]].focus(); self.trigger('edit:after', record, self.form) }); From ed8e667fcfc9f5cfd99da2d6fac31dd985b13a6b Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Thu, 28 Jun 2012 17:01:33 +0530 Subject: [PATCH 043/168] [FIX]changed tax reference in indian chart bzr revid: kbh@tinyerp.com-20120628113133-tone5ugzjqsorazq --- .../l10n_in_private_firm_tax_template.xml | 32 +++++++++---------- .../l10n_in_public_firm_tax_template.xml | 32 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_firm_tax_template.xml b/addons/l10n_in/l10n_in_private_firm_tax_template.xml index 35e9ecc6cdb..5bff8157884 100644 --- a/addons/l10n_in/l10n_in_private_firm_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_firm_tax_template.xml @@ -54,8 +54,8 @@ - - + + @@ -71,8 +71,8 @@ - - + + @@ -88,8 +88,8 @@ 0.15 percent purchase - - + + @@ -110,9 +110,9 @@ 1 - + 1 - + 1 1 @@ -131,9 +131,9 @@ 1 - + 1 - + 1 1 @@ -151,8 +151,8 @@ - - + + @@ -173,9 +173,9 @@ 1 1 - + 1 - + 1 @@ -214,8 +214,8 @@ - - + + diff --git a/addons/l10n_in/l10n_in_public_firm_tax_template.xml b/addons/l10n_in/l10n_in_public_firm_tax_template.xml index d86ef360134..c597fe260f4 100644 --- a/addons/l10n_in/l10n_in_public_firm_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_firm_tax_template.xml @@ -55,8 +55,8 @@ sale - - + + @@ -71,8 +71,8 @@ sale - - + + @@ -87,8 +87,8 @@ 0.15 percent purchase - - + + @@ -107,9 +107,9 @@ 0.05 percent all - + 1 - + 1 1 @@ -128,9 +128,9 @@ 0.15 percent all - + 1 - + 1 1 @@ -149,9 +149,9 @@ 0.08 percent all - + 1 - + 1 1 @@ -172,13 +172,13 @@ 0.12 percent all - + 1 1 1 - + 1 @@ -215,13 +215,13 @@ 0.10 percent sale - + 1 1 1 - + 1 From f83684265d4bf7b4d59789873cc1571810ee8df6 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 28 Jun 2012 16:14:03 +0200 Subject: [PATCH 044/168] [FIX] make edition of existing records kinda-sorta work (if the record is 'saved' by clicking on an other one) bzr revid: xmo@openerp.com-20120628141403-z8kdg24xy5thmg50 --- addons/web/static/src/js/view_list.js | 16 +- .../web/static/src/js/view_list_editable.js | 295 ++++++++++++++---- 2 files changed, 242 insertions(+), 69 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 7d1770069f8..49e6eceb4d8 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1133,6 +1133,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. * @returns {String} QWeb rendering of the selected record */ render_record: function (record) { + var self = this; var index = this.records.indexOf(record); return QWeb.render('ListView.row', { columns: this.columns, @@ -1141,7 +1142,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. row_parity: (index % 2 === 0) ? 'even' : 'odd', view: this.view, render_cell: function () { - return this.render_cell.apply(this, arguments); } + return self.render_cell.apply(self, arguments); } }); }, /** @@ -1843,6 +1844,19 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ }, // underscore-type methods + find: function (callback) { + var record = null; + for(var section in this._proxies) { + if (this._proxies.hasOwnProperty(section)) { + record = this._proxies[section].find(callback); + } + if (record) { return record; } + } + for(var i=0; i Date: Fri, 29 Jun 2012 12:38:29 +0530 Subject: [PATCH 045/168] [IMP] Clean code bzr revid: mra@tinyerp.com-20120629070829-whk2yy9ilhojf7vf --- addons/l10n_in/installer.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/l10n_in/installer.py b/addons/l10n_in/installer.py index 83a63fba122..5342e6c50bc 100644 --- a/addons/l10n_in/installer.py +++ b/addons/l10n_in/installer.py @@ -26,10 +26,10 @@ import tools class l10n_installer(osv.osv_memory): _inherit = 'account.installer' _columns = { - 'company_type': fields.selection([('public_company', 'Public Firm'), + 'company_type': fields.selection([('public_company', 'Public Firm'), ('partnership_private_company', 'Partnership/Private Firm') - ], 'Company Type', required=True, - help='Company Type is used to install Indian chart of accounts as per need of business.'), + ], 'Company Type', required=True, + help='Company Type is used to install Indian chart of accounts as per need of business.'), } _defaults = { 'company_type': 'public_company', @@ -42,7 +42,7 @@ class l10n_installer(osv.osv_memory): res = super(l10n_installer, self).execute_simple(cr, uid, ids, context=context) for chart in self.read(cr, uid, ids, context=context): - if chart['charts'] =='l10n_in' and chart['company_type']=='public_company': + if chart['charts'] == 'l10n_in' and chart['company_type'] == 'public_company': acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_firm_chart.xml')) tools.convert_xml_import(cr, 'l10n_in', acc_file_path, {}, 'init', True, None) acc_file_path.close() @@ -51,7 +51,7 @@ class l10n_installer(osv.osv_memory): tools.convert_xml_import(cr, 'l10n_in', tax_file_path, {}, 'init', True, None) tax_file_path.close() - elif chart['charts'] =='l10n_in' and chart['company_type']=='partnership_private_company': + elif chart['charts'] == 'l10n_in' and chart['company_type'] == 'partnership_private_company': acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_partnership_private_chart.xml')) tools.convert_xml_import(cr, 'l10n_in', acc_file_path, {}, 'init', True, None) acc_file_path.close() @@ -62,4 +62,4 @@ class l10n_installer(osv.osv_memory): return res -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 64e33e43e17e79a3dfc6106927a60adf05ad8b28 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Fri, 29 Jun 2012 14:14:29 +0530 Subject: [PATCH 046/168] [IMP] licence changed bzr revid: mra@tinyerp.com-20120629084429-0lsk4mvbdlanhvdj --- addons/l10n_in/__init__.py | 35 ++++++++++++++--------------------- addons/l10n_in/__openerp__.py | 4 ++-- addons/l10n_in/installer.py | 2 +- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/addons/l10n_in/__init__.py b/addons/l10n_in/__init__.py index f97bda7fb89..975dcf5aa59 100644 --- a/addons/l10n_in/__init__.py +++ b/addons/l10n_in/__init__.py @@ -1,32 +1,25 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # -# Copyright (c) 2004 TINY SPRL. (http://tiny.be) All Rights Reserved. -# Fabien Pinckaers +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). # -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsability of assessing all potential -# consequences resulting from its eventual inadequacies and bugs -# End users who are looking for a ready-to-use solution with commercial -# garantees and support are strongly adviced to contract a Free Software -# Service Company +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # -# This program is Free Software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . # ############################################################################## + import installer # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_in/__openerp__.py b/addons/l10n_in/__openerp__.py index 630d99ca8db..06b254605a7 100644 --- a/addons/l10n_in/__openerp__.py +++ b/addons/l10n_in/__openerp__.py @@ -1,8 +1,8 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). +# Copyright (C) 2004-2010 Tiny SPRL (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/addons/l10n_in/installer.py b/addons/l10n_in/installer.py index 5342e6c50bc..3568f04d2dd 100644 --- a/addons/l10n_in/installer.py +++ b/addons/l10n_in/installer.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). +# Copyright (C) 2004-2010 Tiny SPRL (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as From 798f519842c2bce0eedf36aab1d983285fc13525 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Fri, 29 Jun 2012 19:00:41 +0530 Subject: [PATCH 047/168] [FIX]ids changed,tax added bzr revid: kbh@tinyerp.com-20120629133041-2tf9c0wkxm3waf2u --- addons/l10n_in/__init__.py | 2 +- addons/l10n_in/__openerp__.py | 4 +- addons/l10n_in/account_tax.xml | 19 -- addons/l10n_in/account_tax_code.xml | 36 --- .../{installer.py => l10n_in_installer.py} | 8 +- ...er_view.xml => l10n_in_installer_view.xml} | 0 ...te_chart.xml => l10n_in_private_chart.xml} | 213 ++++++++------ ...e.xml => l10n_in_private_tax_template.xml} | 195 ++++++------- ...irm_chart.xml => l10n_in_public_chart.xml} | 274 ++++++++++-------- ...te.xml => l10n_in_public_tax_template.xml} | 198 ++++++------- ...late.xml => l10n_in_tax_code_template.xml} | 10 +- 11 files changed, 489 insertions(+), 470 deletions(-) delete mode 100644 addons/l10n_in/account_tax.xml delete mode 100644 addons/l10n_in/account_tax_code.xml rename addons/l10n_in/{installer.py => l10n_in_installer.py} (95%) rename addons/l10n_in/{installer_view.xml => l10n_in_installer_view.xml} (100%) rename addons/l10n_in/{l10n_in_partnership_private_chart.xml => l10n_in_private_chart.xml} (74%) rename addons/l10n_in/{l10n_in_private_firm_tax_template.xml => l10n_in_private_tax_template.xml} (53%) rename addons/l10n_in/{l10n_in_public_firm_chart.xml => l10n_in_public_chart.xml} (68%) rename addons/l10n_in/{l10n_in_public_firm_tax_template.xml => l10n_in_public_tax_template.xml} (53%) rename addons/l10n_in/{account_tax_code_template.xml => l10n_in_tax_code_template.xml} (81%) diff --git a/addons/l10n_in/__init__.py b/addons/l10n_in/__init__.py index f97bda7fb89..a7105d9d278 100644 --- a/addons/l10n_in/__init__.py +++ b/addons/l10n_in/__init__.py @@ -27,6 +27,6 @@ # ############################################################################## -import installer +import l10n_in_installer # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_in/__openerp__.py b/addons/l10n_in/__openerp__.py index 630d99ca8db..3c635082f7f 100644 --- a/addons/l10n_in/__openerp__.py +++ b/addons/l10n_in/__openerp__.py @@ -36,9 +36,9 @@ Indian accounting chart and localization. ], "demo_xml": [], "update_xml": [ - "account_tax_code_template.xml", + "l10n_in_tax_code_template.xml", "l10n_in_wizard.xml", - "installer_view.xml", + "l10n_in_installer_view.xml", ], "auto_install": False, "installable": True, diff --git a/addons/l10n_in/account_tax.xml b/addons/l10n_in/account_tax.xml deleted file mode 100644 index 90e6264398f..00000000000 --- a/addons/l10n_in/account_tax.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - PPn (10%)(10.0%) - 0.100000 - percent - - - - - - - - - - diff --git a/addons/l10n_in/account_tax_code.xml b/addons/l10n_in/account_tax_code.xml deleted file mode 100644 index bec870dd426..00000000000 --- a/addons/l10n_in/account_tax_code.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - Tax balance to pay - - - - Tax Due (Tax to pay) - - - - - Tax payable - - - - - Tax bases - - - - Base of taxed sales - - - - - - Base of taxed purchases - - - - - diff --git a/addons/l10n_in/installer.py b/addons/l10n_in/l10n_in_installer.py similarity index 95% rename from addons/l10n_in/installer.py rename to addons/l10n_in/l10n_in_installer.py index 83a63fba122..01c9395eb58 100644 --- a/addons/l10n_in/installer.py +++ b/addons/l10n_in/l10n_in_installer.py @@ -43,20 +43,20 @@ class l10n_installer(osv.osv_memory): for chart in self.read(cr, uid, ids, context=context): if chart['charts'] =='l10n_in' and chart['company_type']=='public_company': - acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_firm_chart.xml')) + acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_chart.xml')) tools.convert_xml_import(cr, 'l10n_in', acc_file_path, {}, 'init', True, None) acc_file_path.close() - tax_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_firm_tax_template.xml')) + tax_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_tax_template.xml')) tools.convert_xml_import(cr, 'l10n_in', tax_file_path, {}, 'init', True, None) tax_file_path.close() elif chart['charts'] =='l10n_in' and chart['company_type']=='partnership_private_company': - acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_partnership_private_chart.xml')) + acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_private_chart.xml')) tools.convert_xml_import(cr, 'l10n_in', acc_file_path, {}, 'init', True, None) acc_file_path.close() - tax_file_path = tools.file_open(opj('l10n_in', 'l10n_in_private_firm_tax_template.xml')) + tax_file_path = tools.file_open(opj('l10n_in', 'l10n_in_private_tax_template.xml')) tools.convert_xml_import(cr, 'l10n_in', tax_file_path, {}, 'init', True, None) tax_file_path.close() diff --git a/addons/l10n_in/installer_view.xml b/addons/l10n_in/l10n_in_installer_view.xml similarity index 100% rename from addons/l10n_in/installer_view.xml rename to addons/l10n_in/l10n_in_installer_view.xml diff --git a/addons/l10n_in/l10n_in_partnership_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml similarity index 74% rename from addons/l10n_in/l10n_in_partnership_private_chart.xml rename to addons/l10n_in/l10n_in_private_chart.xml index 6e2a764d64f..dcb705c113e 100644 --- a/addons/l10n_in/l10n_in_partnership_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -4,7 +4,7 @@ - + Partnership/Private Firm Chart of Account 0 view @@ -13,197 +13,234 @@ - + Balance Sheet 1 view - + - + Assets 10 view - + - + Cash 101 liquidity - + Checking account balance (as shown in company records), currency, coins, checks received from customers but not yet deposited. - + Accounts Receivable 120 receivable - + Amounts owed to the company for services performed or products sold but not yet paid for. - + Merchandise Inventory 140 other - + Cost of merchandise purchased but has not yet been sold. - + Supplies 150 other - + Cost of supplies that have not yet been used. Supplies that have been used are recorded in Supplies Expense. - + Prepaid Insurance 160 other - + Cost of insurance that is paid in advance and includes a future accounting period. - + Land 170 other - + Cost to acquire and prepare land for use by the company. - + Buildings 175 other - + Cost to purchase or construct buildings for use by the company. - + Accumulated Depreciation - Buildings 178 other - + Amount of the buildings' cost that has been allocated to Depreciation Expense since the time the building was acquired. - + Equipment 180 other - + Cost to acquire and prepare equipment for use by the company. - + Accumulated Depreciation - Equipment 188 other - + Amount of equipment's cost that has been allocated to Depreciation Expense since the time the equipment was acquired. - + Liabilities 20 view - + - + Notes Payable 210 other - + The amount of principal due on a formal written promise to pay. Loans from banks are included in this account. - + Accounts Payable 215 payable - + Amount owed to suppliers who provided goods and services to the company but did not require immediate payment in cash. - + Wages Payable 220 other - + Amount owed to employees for hours worked but not yet paid. - + Interest Payable 230 other - + Amount owed for interest on Notes Payable up until the date of the balance sheet. This is computed by multiplying the amount of the note times the effective interest rate times the time period. - + Unearned Revenues 240 other - + Amounts received in advance of delivering goods or providing services. When the goods are delivered or services are provided, this liability amount decreases. - + Mortgage Loan Payable 250 other - + A formal loan that involves a lien on real estate until the loan is repaid. - - + + + + + Sales Tax Payable + 216 + payable + + + + + + + VAT Payable + 217 + payable + + + + + + + Service Tax Payable + 218 + payable + + + + + + + Exice Duty Payable + 219 + payable + + + + + @@ -212,7 +249,7 @@ view - + - + Profit And Loss 3 view - + - + Income 30 view - + - + Operating Revenue Accounts 31 view - + - + Service Revenues 310 other - + Amounts earned from providing services to clients, either for cash or on credit. When a service is provided on credit, both this account and Accounts Receivable will increase. When a service is provided for immediate cash, both this account and Cash will increase. - + Product Sales 311 other - + Sales of product account - + Non-Operating Revenue and Gains 80 view - + - + Interest Revenues 810 other - + Interest and dividends earned on bank accounts, investments or notes receivable. This account is increased when the interest is earned and either Cash or Interest Receivable is also increased. - + Gain on Sale of Assets 811 other - + Occurs when the company sells one of its assets (other than inventory) for more than the asset's book value. - + Expense 50 view - + - + Operating Expense Accounts 51 view - + - + Salaries Expense 500 other - + Expenses incurred for the work performed by salaried employees during the accounting period. These employees normally receive a fixed amount on a weekly, monthly, or annual basis. - + Wages Expense 510 other - + Expenses incurred for the work performed by non-salaried employees during the accounting period. These employees receive an hourly rate of pay. - + Supplies Expense 540 other - + Cost of supplies used up during the accounting period. - + Rent Expense 560 other - + Cost of occupying rented facilities during the accounting period. - + Utilities Expense 570 other - + Costs for electricity, heat, water, and sewer that were used during the accounting period. - + Telephone Expense 576 other - + Cost of telephone used during the current accounting period. - + Advertising Expense 610 other - + Costs incurred by the company during the accounting period for ads, promotions, and other selling and expenses (other than salaries). - + Depreciation Expense 750 other - + Cost of long-term assets allocated to expense during the current accounting period. - + Non-Operating Expenses and Losses 90 view @@ -430,13 +467,13 @@ - + Loss on Sale of Assets 960 other - + Occurs when the company sells one of its assets (other than inventory) for less than the asset's book value. @@ -444,14 +481,14 @@ India - Chart of Accounts for Partnership/Private Firm - + - - - - - - + + + + + + diff --git a/addons/l10n_in/l10n_in_private_firm_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml similarity index 53% rename from addons/l10n_in/l10n_in_private_firm_tax_template.xml rename to addons/l10n_in/l10n_in_private_tax_template.xml index 5bff8157884..e95a9bc48e1 100644 --- a/addons/l10n_in/l10n_in_private_firm_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -2,117 +2,90 @@ - - - - Sales Tax Payable - 216 - payable - - - - - - - VAT Payable - 217 - payable - - - - - - - Service Tax Payable - 218 - payable - - - - - - - Exice Duty Payable - 219 - payable - - - - - + - Sale Tax - 15% Sale Tax - 15% 0.15 percent sale - - - - - - + + + + + + - Sale Tax -12% Sale Tax - 12% 0.12 percent sale - - - - - - + + + + + + + + Sale Tax - 4% + + 0.04 + percent + sale + + + + + + + + + + - Purchase Tax - 15% Purchase Tax - 15% - - + + 0.15 percent purchase - + - + - - - VAT - 5% - VAT - 5% + VAT - 5% (4% VAT + 1% Add. Tax.) 0.05 percent all - - - + + + 1 1 - + 1 1 @@ -121,19 +94,18 @@ - VAT - 15% - VAT - 15% + VAT - 15% (12.5% VAT + 2.5% Add. Tax.) 0.15 percent all - - - + + + 1 1 - + 1 1 @@ -142,17 +114,48 @@ - VAT - 8% VAT - 8% - 0.8 + 0.08 percent all - - - + + + - + + + + + + + + VAT - 10% + + 0.10 + percent + all + + + + + + + + + + + + VAT - 12.5% + + 12.5 + percent + all + + + + + @@ -161,29 +164,27 @@ - Exice Duty - 10.30% - Excise Duty + Excise Duty - 10% 0.10 percent sale - - - + + + 1 - + 1 - + 1 - + 1 - + - Excise duty -10% -%2 - Excise Duty - %2 + Excise Duty - 2% 0.02 percent sale @@ -192,7 +193,6 @@ - Excise duty - 10% - %1 Excise Duty - 1% 0.01 percent @@ -205,23 +205,21 @@ all - Service - 12% - Service Tax + Service Tax - 12% 0.12 percent - - - - - - + + + + + + - Service - 12% - %2 Service Tax - %2 0.02 percent @@ -231,7 +229,6 @@ - Service - 12% - 1% Service Tax - %1 0.01 percent diff --git a/addons/l10n_in/l10n_in_public_firm_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml similarity index 68% rename from addons/l10n_in/l10n_in_public_firm_chart.xml rename to addons/l10n_in/l10n_in_public_chart.xml index 9e72ec9569c..1b9bf1fc298 100644 --- a/addons/l10n_in/l10n_in_public_firm_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -5,7 +5,7 @@ - + Public Firm Chart of Account 0 view @@ -14,529 +14,565 @@ - + Balance Sheet 1 view - + - + Assets 10 view - + - + Current Assets 10000 view - + - + Cash - Regular Checking 10100 liquidity - + - + Cash - Payroll Checking 10200 liquidity - + - + Petty Cash Fund 10600 liquidity - + - + Accounts Receivable 12100 receivable - + - + Allowance for Doubtful Accounts 12500 other - + - + Inventory 13100 other - + - + Supplies 14100 other - + - + Prepaid Insurance 15300 other - + - + Liabilities 20 view - + - + Current Liabilities 20000 view - + - + Notes Payable - Credit Line #1 20100 other - + - + Notes Payable - Credit Line #2 20200 other - + - + Accounts Payable 21000 payable - + - + Wages Payable 22100 other - + - + Interest Payable 23100 other - + - + Unearned Revenues 24500 other - + - + Long-term Liabilities 25000 view - + - + Mortgage Loan Payable 25100 other - + - + Bonds Payable 25600 other - + - + Discount on Bonds Payable 25650 other - + - + Stockholders' Equity 27000 view - + - + Common Stock, No Par 27100 other - + - + Retained Earnings 27500 other - + - + Treasury Stock 29500 other - + - - - + + + + + Sales Tax Payable + 24600 + payable + + + + + + + VAT Payable + 24800 + payable + + + + + + + Exice Duty Payable + 24900 + payable + + + + + + + Service Tax Payable + 24700 + payable + + + + + - + Profit And Loss 3 view - + - + Income 30 view - + - + Operating Revenues 30000 view - + - + Sales - Division #1, Product Line 010 31010 other - + - + Sales - Division #1, Product Line 022 31022 other - + - + Sales - Division #2, Product Line 015 32015 other - + - + Sales - Division #3, Product Line 110 33110 other - + - + Non-Operating Revenue and Gains 90000 view - + - + Gain on Sale of Assets 91800 other - + - + Expense 40 view - + - + Cost of Goods Sold 40000 view - + - + COGS - Division #1, Product Line 010 41010 other - + - + COGS - Division #1, Product Line 022 41022 other - + - + COGS - Division #2, Product Line 015 42015 other - + - + COGS - Division #3, Product Line 110 43110 other - + - + Marketing Expenses 50000 view - + - + Marketing Dept. Salaries 50100 other - + - + Marketing Dept. Payroll Taxes 50150 other - + - + Marketing Dept. Supplies 50200 other - + - + Marketing Dept. Telephone 50600 other - + - + Payroll Dept. Expenses 59000 view - + - + Payroll Dept. Salaries 59100 other - + - + Payroll Dept. Payroll Taxes 59150 other - + - + Payroll Dept. Supplies 59200 other - + - + Payroll Dept. Telephone 59600 other - + - + Non-Operating Expenses and Losses 96000 view - + - + Loss on Sale of Assets 96100 other - + India - Chart of Accounts for Public Firm - + - - - - - - + + + + + + diff --git a/addons/l10n_in/l10n_in_public_firm_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml similarity index 53% rename from addons/l10n_in/l10n_in_public_firm_tax_template.xml rename to addons/l10n_in/l10n_in_public_tax_template.xml index c597fe260f4..0d2427af93a 100644 --- a/addons/l10n_in/l10n_in_public_firm_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -3,93 +3,66 @@ - - - - Sales Tax Payable - 24600 - payable - - - - - - - VAT Payable - 24800 - payable - - - - - - - Exice Duty Payable - 24900 - payable - - - - - - - Service Tax Payable - 24700 - payable - - - - - - - Sale Tax - 15% Sale Tax - 15% - - + + 0.15 percent sale - - - - + + + + - Sale Tax - 12% Sale Tax - 12% - - + + 0.12 percent sale - - - - + + + + + + + + + Sale Tax - 4% + + + + 0.04 + percent + sale + + + + - Purchase Tax - 15% Purchase Tax - 15% - - + + 0.15 percent purchase - + - + @@ -99,19 +72,18 @@ - VAT - 5% - VAT - 5% - - + VAT - 5% (4% VAT + 1% Add. Tax.) + + 0.05 percent all - + 1 1 - + 1 1 @@ -120,19 +92,18 @@ - VAT - 15% - VAT - 15% - - + VAT - 15% (12.5% VAT + 2.5% Add. Tax.) + + 0.15 percent all - + 1 1 - + 1 1 @@ -141,51 +112,88 @@ - VAT - 8% VAT - 8% - - + + 0.08 percent all - + 1 1 - + 1 1 - + + + VAT - 10% + + + + 0.10 + percent + all + + 1 + + 1 + + 1 + + 1 + + + + + + VAT - 12.5% + + + + 12.5 + percent + all + + 1 + + 1 + + 1 + + 1 + + + + - Service - 12% - Service Tax - - + Service Tax - 12% + + 0.12 percent all - + 1 - + 1 - + 1 - + 1 - Service - 12% - 2% Service Tax - %2 0.02 percent @@ -195,7 +203,6 @@ - Service - 12% - 1% Service Tax - %1 0.01 percent @@ -207,28 +214,26 @@ - Excise duty - 10% - Excise Duty - - + Excise Duty - 10% + + 0.10 percent sale - + 1 - + 1 - + 1 - + 1 - + - Excise duty - 10% - 2% Excise Duty - %2 0.02 percent @@ -238,7 +243,6 @@ - Excise duty - 10% - 1% Excise Duty - 1% 0.01 percent diff --git a/addons/l10n_in/account_tax_code_template.xml b/addons/l10n_in/l10n_in_tax_code_template.xml similarity index 81% rename from addons/l10n_in/account_tax_code_template.xml rename to addons/l10n_in/l10n_in_tax_code_template.xml index 1d8e5ed3b70..94217d79c3c 100644 --- a/addons/l10n_in/account_tax_code_template.xml +++ b/addons/l10n_in/l10n_in_tax_code_template.xml @@ -12,13 +12,13 @@ - - Tax Due (Tax to pay) + + Tax Received - Tax Payable + Tax Paid @@ -28,12 +28,12 @@ - + Base of Taxed Sales - + Base of Taxed Purchases From 879c8bb5a233d307a374c29c2b97c7fa9f34c72a Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Mon, 2 Jul 2012 10:32:25 +0530 Subject: [PATCH 048/168] [FIX]Id changed bzr revid: kbh@tinyerp.com-20120702050225-r95sr06v9adxnqp3 --- addons/l10n_in/l10n_in_private_chart.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index dcb705c113e..999c6e8c219 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -13,7 +13,7 @@ - + Balance Sheet 1 view From d762efd3c5a44fcef04042f37f2a7bdab2bb577b Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Mon, 2 Jul 2012 11:16:52 +0530 Subject: [PATCH 049/168] [FIX]ref chenged bzr revid: kbh@tinyerp.com-20120702054652-z66w4imb2hgakv7h --- addons/l10n_in/l10n_in_private_chart.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index 999c6e8c219..0314c85710b 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -464,7 +464,7 @@ view - + @@ -486,7 +486,7 @@ - + From ac2895fd62bf18787c83c7ff43d0e7eba4f31c12 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 11:31:13 +0200 Subject: [PATCH 050/168] [IMP] don't handle keypresses at the editor level, do that in the view instead maybe the editor could do it and trigger an event of its own for the view to handle? bzr revid: xmo@openerp.com-20120702093113-berlms96fqzfjlyg --- .../web/static/src/js/view_list_editable.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index fb367c41bb4..0971edc348e 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -78,16 +78,27 @@ openerp.web.list_editable = function (instance) { } }, on_loaded: function (data, grouped) { - var self = this, form_ready = $.when(); + var self = this; // tree/@editable takes priority on everything else if present. this.options.editable = ! this.options.read_only && (data.arch.attrs.editable || this.options.editable); var result = this._super(data, grouped); if (this.options.editable || true) { this.editor = new instance.web.list.Editor(this); - return $.when( - result, - this.editor.prependTo(this.$element)); + var editor_ready = this.editor.prependTo(this.$element).then(function () { + self.editor.$element.on('keyup', function (e) { + switch (e.which) { + case KEY_RETURN: + self.save_edition(); + break; + case KEY_ESCAPE: + self.cancel_edition(); + break; + } + }); + }); + + return $.when(result, editor_ready); } return result; @@ -264,19 +275,8 @@ openerp.web.list_editable = function (instance) { var self = this; var _super = this._super(); this.form.embedded_view = this.getParent().editionView(this); - var form_ready = this.form.appendTo(this.$element).then(function () { - self.form.do_hide(); - self.form.$element.on('keyup', function (e) { - switch (e.which) { - case KEY_RETURN: - self.save(); - break; - case KEY_ESCAPE: - self.cancel(); - break; - } - }); - }); + var form_ready = this.form.appendTo(this.$element).then( + self.form.proxy('do_hide')); return $.when(_super, form_ready); }, From 1d220128e3a262e7d9b07b6f44a03add3c60dde2 Mon Sep 17 00:00:00 2001 From: "Khushboo Bhatt (Open ERP)" Date: Mon, 2 Jul 2012 15:18:25 +0530 Subject: [PATCH 051/168] [FIX]ref chenged for account expense category bzr revid: kbh@tinyerp.com-20120702094825-ov0947vs0o4z2yip --- addons/l10n_in/l10n_in_private_chart.xml | 2 +- addons/l10n_in/l10n_in_public_chart.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index 0314c85710b..6fea0cfd970 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -486,7 +486,7 @@ - + diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index 1b9bf1fc298..a1f7dc4e466 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -570,7 +570,7 @@ - + From 718ae91920f7cafd8d7e50852f073755d5c29a32 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 13:05:04 +0200 Subject: [PATCH 052/168] [FIX] broken implementation of collection#find bzr revid: xmo@openerp.com-20120702110504-9fga0xwo0e5bzq1c --- addons/web/static/src/js/view_list.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 49e6eceb4d8..6c9e244c5e3 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1853,8 +1853,10 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ if (record) { return record; } } for(var i=0; i Date: Mon, 2 Jul 2012 13:05:30 +0200 Subject: [PATCH 053/168] [FIX] only select rows if select_view_id *is set* and matches the record's id bzr revid: xmo@openerp.com-20120702110530-54t24gh0lo1cctsv --- addons/web/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index a7c99e65b2c..66a1c02e448 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -645,7 +645,7 @@ From 3cc825994b44cb3c7d732091b95df127d2b26445 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 13:06:07 +0200 Subject: [PATCH 054/168] [TODO] add todo note bzr revid: xmo@openerp.com-20120702110607-csi1oa4hm6lxtwat --- addons/web/static/src/js/view_list_editable.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 0971edc348e..0843426a330 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -274,6 +274,7 @@ openerp.web.list_editable = function (instance) { start: function () { var self = this; var _super = this._super(); + // TODO: getParent() should be delegate defaulting to getParent() this.form.embedded_view = this.getParent().editionView(this); var form_ready = this.form.appendTo(this.$element).then( self.form.proxy('do_hide')); From d1eeaaa51eef4cf208ef74d8e888e9b0fa80ac05 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 13:06:58 +0200 Subject: [PATCH 055/168] [FIX] better filtering of id-less rows being selected in a ListView.List body bzr revid: xmo@openerp.com-20120702110658-7t8pu12uso55enrh --- addons/web/static/src/js/view_list_editable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 0843426a330..a0ff796ed5e 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -425,7 +425,7 @@ openerp.web.list_editable = function (instance) { record = new instance.web.list.Record(); this.records.add( record, {at: this.options.editable === 'top' ? 0 : null}); - $row = this.$current.find(':not([data-id])'); + $row = this.$current.children('tr:not([data-id])'); } else { record = this.records.get($row.data('id')); } From c262b2d1ae0c476be828aad0e1787939bebe2918 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 13:07:33 +0200 Subject: [PATCH 056/168] [FIX] shallow-copy info passed into Editor#edit to avoid mutating an object owned by somebody else bzr revid: xmo@openerp.com-20120702110733-0qp0ki3hbw5b2nd3 --- addons/web/static/src/js/view_list_editable.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index a0ff796ed5e..ac39f2c43e8 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -287,6 +287,7 @@ openerp.web.list_editable = function (instance) { edit: function (record, configureField) { var self = this; var form = self.form; + record = _.extend({}, record); form.on_record_loaded(record).pipe(function () { return form.do_show({reload: false}); }).then(function () { From d6a9d86e098ede1cea51305334c2cfefd787f7df Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 13:10:26 +0200 Subject: [PATCH 057/168] [FIX] change event handling for 'new' records (records w/o an id yet) bzr revid: xmo@openerp.com-20120702111026-twmh5gbg4i1fd4kj --- addons/web/static/src/js/view_list.js | 23 +++++++++++++------ .../web/static/src/js/view_list_editable.js | 3 ++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 6c9e244c5e3..8cbe18a46cc 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -905,27 +905,36 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. this.record_callbacks = { 'remove': function (event, record) { - var $row = self.$current.find( + var $row = self.$current.children( '[data-id=' + record.get('id') + ']'); var index = $row.data('index'); $row.remove(); self.refresh_zebra(index); }, 'reset': function () { return self.on_records_reset(); }, - 'change': function (event, record) { - var $row = self.$current.find('[data-id=' + record.get('id') + ']'); + 'change': function (event, record, attribute, value, old_value) { + var $row; + if (attribute === 'id') { + if (old_value) { + throw new Error("Setting 'id' attribute on existing record " + + JSON.stringify(record.attributes)); + } + // Set id on new record + $row = self.$current.children('tr:not([data-id])'); + } else { + $row = self.$current.children( + '[data-id=' + record.get('id') + ']'); + } $row.replaceWith(self.render_record(record)); }, 'add': function (ev, records, record, index) { - var $new_row = $('').attr({ - 'data-id': record.get('id') - }); + var $new_row = $(self.render_record(record)); if (index === 0) { $new_row.prependTo(self.$current); } else { var previous_record = records.at(index-1), - $previous_sibling = self.$current.find( + $previous_sibling = self.$current.children( '[data-id=' + previous_record.get('id') + ']'); $new_row.insertAfter($previous_sibling); } diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index ac39f2c43e8..f35e667c35d 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -170,8 +170,9 @@ openerp.web.list_editable = function (instance) { record = self.records.find(function (r) { return !r.get('id'); }); - record.set('id', attrs.id, {silent: true}); + record.set('id', attrs.id); } + self.reload_record(record); }); }, From 6719fb96d79959ffc1c49db54b6bf3b4a986d8fb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 14:29:02 +0200 Subject: [PATCH 058/168] [FIX] handling of setting/resetting ids on records in list collections bzr revid: xmo@openerp.com-20120702122902-f349shdjslbbxd3k --- addons/web/static/src/js/view_list.js | 19 ++++++++++++++++-- addons/web/static/test/list-utils.js | 29 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 8cbe18a46cc..07b24edbfcf 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -919,6 +919,9 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. throw new Error("Setting 'id' attribute on existing record " + JSON.stringify(record.attributes)); } + // add record to dataset + self.dataset.ids.splice( + self.records.indexOf(record), 0, value); // Set id on new record $row = self.$current.children('tr:not([data-id])'); } else { @@ -1846,9 +1849,21 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ return this; }, - _onRecordEvent: function (event, record, options) { + _onRecordEvent: function (event) { + switch(event) { // don't propagate reset events - if (event === 'reset') { return; } + case 'reset': return; + case 'change:id': + var record = arguments[1]; + var new_value = arguments[2]; + var old_value = arguments[3]; + // [change:id, record, new_value, old_value] + if (this._byId[old_value] === record) { + delete this._byId[old_value]; + this._byId[new_value] = record; + } + break; + } this.trigger.apply(this, arguments); }, diff --git a/addons/web/static/test/list-utils.js b/addons/web/static/test/list-utils.js index 7890e71c6bc..97d7ec90cfc 100644 --- a/addons/web/static/test/list-utils.js +++ b/addons/web/static/test/list-utils.js @@ -338,4 +338,33 @@ $(document).ready(function () { ids, [1, 2, 3, 10, 20, 30], 'tree collections should be deeply iterated'); }); + + module("list-weirds", { + setup: function () { + openerp = window.openerp.init([]); + window.openerp.web.corelib(openerp); + window.openerp.web.coresetup(openerp); + window.openerp.web.chrome(openerp); + // views loader stuff + window.openerp.web.data(openerp); + window.openerp.web.views(openerp); + window.openerp.web.list(openerp); + } + }); + test('set-from-noid', function () { + var root = new openerp.web.list.Collection(); + root.add({v: 3}); + root.at(0).set('id', 42); + var record = root.get(42); + equal(root.length, 1); + equal(record.get('v'), 3, "should have fetched the original record"); + }); + test('set-from-previd', function () { + var root = new openerp.web.list.Collection(); + root.add({id: 1, v: 2}); + root.get(1).set('id', 42); + var record = root.get(42); + equal(root.length, 1); + equal(record.get('v'), 2, "should have fetched the original record"); + }); }); From 13cf266e2ce9fe0d6130f5b1a5b04efb008a02ff Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 15:22:17 +0200 Subject: [PATCH 059/168] [FIX] next on create/save * Move prev/next behavior after save to ListView * Have fetching of row for a record be a method chain on Group/List * Have edition behavior be fully specified in ListView bzr revid: xmo@openerp.com-20120702132217-ni1byjkf7t6tr5a4 --- .../web/static/src/js/view_list_editable.js | 90 +++++++++++++------ 1 file changed, 62 insertions(+), 28 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index f35e667c35d..c1f81ccfa08 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -120,12 +120,17 @@ openerp.web.list_editable = function (instance) { /** * Set up the edition of a record of the list view "inline" * - * @param {instance.web.list.Record} record record to edit - * @param {Object} cells map of field names to the DOM elements used to display these fields for the record being edited + * @param {instance.web.list.Record} [record] record to edit, leave empty to create a new record * @return {jQuery.Deferred} */ - start_edition: function (record, cells) { + start_edition: function (record) { var self = this; + if (!record) { + record = new instance.web.list.Record(); + this.records.add(record, { + at: this.options.editable === 'top' ? 0 : null}); + } + var cells = this.getCellsFor(this.groups.getRowFor(record)); return this.ensure_saved().pipe(function () { return self.withEvent('edit', { record: record.attributes, @@ -154,6 +159,13 @@ openerp.web.list_editable = function (instance) { [record.attributes]); }); }, + getCellsFor: function ($row) { + var cells = {}; + $row.children('td').each(function (index, el) { + cells[el.getAttribute('data-field')] = el + }); + return cells; + }, /** * @return {jQuery.Deferred} */ @@ -169,8 +181,22 @@ openerp.web.list_editable = function (instance) { // new record record = self.records.find(function (r) { return !r.get('id'); - }); - record.set('id', attrs.id); + }).set('id', attrs.id); + + setTimeout(function () { + self.start_edition(); + }, 0); + + } else { + var next_index = self.records.indexOf(record) + 1; + if (next_index === self.records.length) { + next_index = 0; + } + + setTimeout(function () { + self.start_edition(self.records.at(next_index)); + }, 0); + } self.reload_record(record); @@ -351,6 +377,13 @@ openerp.web.list_editable = function (instance) { _.invoke( _.values(this.children), 'ensure_saved')); + }, + getRowFor: function (record) { + return _(this.children).chain() + .invoke('getRowFor', record) + .compact() + .first() + .value(); } }); @@ -421,24 +454,9 @@ openerp.web.list_editable = function (instance) { break; } }, - render_row_as_form: function ($row) { - var record; - if (!$row || $row.length === 0) { - record = new instance.web.list.Record(); - this.records.add( - record, {at: this.options.editable === 'top' ? 0 : null}); - $row = this.$current.children('tr:not([data-id])'); - } else { - record = this.records.get($row.data('id')); - } - - var cells = {}; - $row.children('td').each(function (index, el) { - cells[el.getAttribute('data-field')] = el - }); - - // TODO: creation (record_id === null?) - return this.view.start_edition(record, cells); + render_row_as_form: function (id) { + return this.view.start_edition( + id ? this.records.get(id) : null); }, handle_onwrite: function (source_record_id) { var self = this; @@ -524,14 +542,30 @@ openerp.web.list_editable = function (instance) { * Edits record currently selected via dataset */ edit_record: function (record_id) { - this.render_row_as_form( - this.$current.find('[data-id=' + record_id + ']')); - $(this).trigger( - 'edit', - [record_id, this.dataset]); + this.render_row_as_form(record_id); }, new_record: function () { this.render_row_as_form(); + }, + /** + * If a row mapping to the record (@data-id matching the record's id or + * no @data-id if the record has no id), returns it. Otherwise returns + * ``null``. + * + * @param {Record} record the record to get a row for + * @return {jQuery|null} + */ + getRowFor: function (record) { + var id, $row; + if (id = record.get('id')) { + $row = this.$current.children('[data-id=' + id + ']'); + } else { + $row = this.$current.children(':not([data-id])'); + } + if ($row.length) { + return $row; + } + return null; } }); }; From 5df6c47700fba8c3cf2145512990e526f38dfd26 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 15:34:51 +0200 Subject: [PATCH 060/168] [FIX] methods capitalization bzr revid: xmo@openerp.com-20120702133451-e5b7uozm0p36jbpr --- addons/web/static/src/js/view_form.js | 4 +-- .../web/static/src/js/view_list_editable.js | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 7792b5ffa19..76fcabe13f8 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3067,7 +3067,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ } return res; } else if (this.viewmanager.active_view === "list") { - var res = $.when(view.ensure_saved()); + var res = $.when(view.ensureSaved()); if (!res.isResolved() && !res.isRejected()) { console.warn("Asynchronous get_value() is not supported in list view."); } @@ -3282,7 +3282,7 @@ instance.web.form.One2ManyList = instance.web.ListView.List.extend({ return; } if (!self.edition_form.widget_is_stopped) { - self.view.ensure_saved(); + self.view.ensureSaved(); } }); }); diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index c1f81ccfa08..aebb549d6d5 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -89,10 +89,10 @@ openerp.web.list_editable = function (instance) { self.editor.$element.on('keyup', function (e) { switch (e.which) { case KEY_RETURN: - self.save_edition(); + self.saveEdition(); break; case KEY_ESCAPE: - self.cancel_edition(); + self.cancelEdition(); break; } }); @@ -111,11 +111,11 @@ openerp.web.list_editable = function (instance) { * * @returns {$.Deferred} */ - ensure_saved: function () { + ensureSaved: function () { if (!this.editor.isEditing()) { return $.when(); } - return this.save_edition(); + return this.saveEdition(); }, /** * Set up the edition of a record of the list view "inline" @@ -123,7 +123,7 @@ openerp.web.list_editable = function (instance) { * @param {instance.web.list.Record} [record] record to edit, leave empty to create a new record * @return {jQuery.Deferred} */ - start_edition: function (record) { + startEdition: function (record) { var self = this; if (!record) { record = new instance.web.list.Record(); @@ -131,7 +131,7 @@ openerp.web.list_editable = function (instance) { at: this.options.editable === 'top' ? 0 : null}); } var cells = this.getCellsFor(this.groups.getRowFor(record)); - return this.ensure_saved().pipe(function () { + return this.ensureSaved().pipe(function () { return self.withEvent('edit', { record: record.attributes, cancel: false @@ -169,7 +169,7 @@ openerp.web.list_editable = function (instance) { /** * @return {jQuery.Deferred} */ - save_edition: function () { + saveEdition: function () { var self = this; return this.withEvent('save', { editor: this.editor, @@ -184,7 +184,7 @@ openerp.web.list_editable = function (instance) { }).set('id', attrs.id); setTimeout(function () { - self.start_edition(); + self.startEdition(); }, 0); } else { @@ -194,7 +194,7 @@ openerp.web.list_editable = function (instance) { } setTimeout(function () { - self.start_edition(self.records.at(next_index)); + self.startEdition(self.records.at(next_index)); }, 0); } @@ -205,7 +205,7 @@ openerp.web.list_editable = function (instance) { /** * @return {jQuery.Deferred} */ - cancel_edition: function () { + cancelEdition: function () { var self = this; return this.withEvent('cancel', { editor: this.editor, @@ -372,11 +372,11 @@ openerp.web.list_editable = function (instance) { * * @returns {$.Deferred} */ - ensure_saved: function () { + ensureSaved: function () { return $.when.apply(null, _.invoke( _.values(this.children), - 'ensure_saved')); + 'ensureSaved')); }, getRowFor: function (record) { return _(this.children).chain() @@ -450,12 +450,12 @@ openerp.web.list_editable = function (instance) { }); break; case KEY_ESCAPE: - this.cancel_edition(); + this.cancelEdition(); break; } }, render_row_as_form: function (id) { - return this.view.start_edition( + return this.view.startEdition( id ? this.records.get(id) : null); }, handle_onwrite: function (source_record_id) { @@ -519,7 +519,7 @@ openerp.web.list_editable = function (instance) { /** * If the current list is being edited, ensures it's saved */ - ensure_saved: function () { + ensureSaved: function () { if (this.edition) { // kinda-hack-ish: if the user has entered data in a field, // oe_form_dirty will be set on the form so save, otherwise @@ -535,7 +535,7 @@ openerp.web.list_editable = function (instance) { /** * Cancels the edition of the row for the current dataset index */ - cancel_edition: function () { + cancelEdition: function () { this.cancel_pending_edition(); }, /** From 70fa57b9df15e8cfb30c84605441e4a20b5d6529 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 2 Jul 2012 15:58:24 +0200 Subject: [PATCH 061/168] [IMP] move onwrite handling to ListView (from List) untested bzr revid: xmo@openerp.com-20120702135824-ngcx34qfuu3t2kab --- .../web/static/src/js/view_list_editable.js | 88 +++++-------------- 1 file changed, 24 insertions(+), 64 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index aebb549d6d5..35edc19c9f4 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -175,7 +175,7 @@ openerp.web.list_editable = function (instance) { editor: this.editor, form: this.editor.form, cancel: false - }, this.editor.save).then(function (attrs) { + }, this.editor.save).pipe(function (attrs) { var record = self.records.get(attrs.id); if (!record) { // new record @@ -186,7 +186,6 @@ openerp.web.list_editable = function (instance) { setTimeout(function () { self.startEdition(); }, 0); - } else { var next_index = self.records.indexOf(record) + 1; if (next_index === self.records.length) { @@ -196,10 +195,10 @@ openerp.web.list_editable = function (instance) { setTimeout(function () { self.startEdition(self.records.at(next_index)); }, 0); - } - - self.reload_record(record); + return $.when( + self.handleOnWrite(record), + self.reload_record(record)); }); }, /** @@ -268,7 +267,26 @@ openerp.web.list_editable = function (instance) { widget.attrs.modifiers = JSON.stringify(modifiers); }); return view; - } + }, + handleOnWrite: function (source_record) { + var self = this; + var on_write_callback = self.fields_view.arch.attrs.on_write; + if (!on_write_callback) { return $.when(); } + return this.dataset.call(on_write_callback, [source_record.get('id')]) + .pipe(function (ids) { + return $.when.apply(null, _(ids).map(function (id) { + var record = self.records.get(id); + if (!record) { + // insert after the source record + var index = self.records.indexOf(source_record) + 1; + record = new instance.web.list.Record({id: id}); + self.records.add(record, {at: index}); + self.dataset.ids.splice(index, 0, id); + } + return self.reload_record(record); + })); + }); + }, }); instance.web.list.Editor = instance.web.Widget.extend({ @@ -458,64 +476,6 @@ openerp.web.list_editable = function (instance) { return this.view.startEdition( id ? this.records.get(id) : null); }, - handle_onwrite: function (source_record_id) { - var self = this; - var on_write_callback = self.view.fields_view.arch.attrs.on_write; - if (!on_write_callback) { return; } - this.dataset.call(on_write_callback, [source_record_id], function (ids) { - _(ids).each(function (id) { - var record = self.records.get(id); - if (!record) { - // insert after the source record - var index = self.records.indexOf( - self.records.get(source_record_id)) + 1; - record = new instance.web.list.Record({id: id}); - self.records.add(record, {at: index}); - self.dataset.ids.splice(index, 0, id); - } - self.reload_record(record); - }); - }); - }, - /** - * Saves the current row, and returns a Deferred resolving to an object - * with the following properties: - * - * ``created`` - * Boolean flag indicating whether the record saved was being created - * (``true`` or edited (``false``) - * ``edited_record`` - * The result of saving the record (either the newly created record, - * or the post-edition record), after insertion in the Collection if - * needs be. - * - * @returns {$.Deferred<{created: Boolean, edited_record: Record}>} - */ - save_row: function () { - //noinspection JSPotentiallyInvalidConstructorUsage - var self = this; - return this.edition_form - .do_save(null, this.options.editable === 'top') - .pipe(function (result) { - if (result.created && !self.edition_id) { - self.records.add({id: result.result}, - {at: self.options.editable === 'top' ? 0 : null}); - self.edition_id = result.result; - } - var edited_record = self.records.get(self.edition_id); - - return $.when( - self.handle_onwrite(self.edition_id), - self.cancel_pending_edition().then(function () { - $(self).trigger('saved', [self.dataset]); - })).pipe(function () { - return { - created: result.created || false, - edited_record: edited_record - }; - }); - }); - }, /** * If the current list is being edited, ensures it's saved */ From 42d455b899670da5006e93e6069f61b637fe5aad Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Tue, 3 Jul 2012 11:36:21 +0530 Subject: [PATCH 062/168] [IMP] l10n_in: Add Reserve and Surplus Account and Improve name of tax bzr revid: jap@tinyerp.com-20120703060621-n1g1kdql0uqp8mqv --- addons/l10n_in/l10n_in_private_chart.xml | 13 ++++++++++++- addons/l10n_in/l10n_in_private_tax_template.xml | 4 ++-- addons/l10n_in/l10n_in_public_chart.xml | 17 +++++++++++++---- addons/l10n_in/l10n_in_public_tax_template.xml | 4 ++-- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index 6fea0cfd970..b0e05f4a781 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -204,6 +204,17 @@ A formal loan that involves a lien on real estate until the loan is repaid. + + Reserve and Surplus Account + 260 + other + + + + A Reserve and Surplus Account. + + + Sales Tax Payable @@ -488,7 +499,7 @@ - + diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index d4334eb49e1..d28160b16ca 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -164,7 +164,7 @@ - Excise Duty - 10% + Excise Duty - 10.30% 0.10 percent @@ -205,7 +205,7 @@ all - Service Tax - 12% + Service Tax - 12.30% 0.12 percent diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index cf9804fd929..7d96458539d 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -178,7 +178,7 @@ - + Unearned Revenues 24500 @@ -259,8 +259,8 @@ - - + + @@ -299,6 +299,15 @@ + + Reserve and Surplus Account + 24950 + other + + + + + @@ -572,7 +581,7 @@ - + diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index fb1c470aade..ccf813bb713 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -174,7 +174,7 @@ - Service Tax - 12% + Service Tax - 12.30% @@ -214,7 +214,7 @@ - Excise Duty - 10% + Excise Duty - 10.30% From 29e65ff0526bad593c84b254e7f72663f4bc6f16 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 11:10:58 +0200 Subject: [PATCH 063/168] [FIX] move 'behavior on save' to handler for [Return] key as it's the only situation where we want to skip to next record bzr revid: xmo@openerp.com-20120703091058-b7wdebu8ak6gssyb --- .../web/static/src/js/view_list_editable.js | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 35edc19c9f4..3e4d0d777e5 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -89,7 +89,18 @@ openerp.web.list_editable = function (instance) { self.editor.$element.on('keyup', function (e) { switch (e.which) { case KEY_RETURN: - self.saveEdition(); + self.saveEdition().then(function (saveInfo) { + if (saveInfo.created) { + self.startEdition(); + return; + } + var next_index = self.records.indexOf(saveInfo.record) + 1; + if (next_index === self.records.length) { + next_index = 0; + } + + self.startEdition(self.records.at(next_index)); + }); break; case KEY_ESCAPE: self.cancelEdition(); @@ -176,29 +187,23 @@ openerp.web.list_editable = function (instance) { form: this.editor.form, cancel: false }, this.editor.save).pipe(function (attrs) { + var created = false; var record = self.records.get(attrs.id); if (!record) { // new record + created = true; record = self.records.find(function (r) { return !r.get('id'); }).set('id', attrs.id); - - setTimeout(function () { - self.startEdition(); - }, 0); - } else { - var next_index = self.records.indexOf(record) + 1; - if (next_index === self.records.length) { - next_index = 0; - } - - setTimeout(function () { - self.startEdition(self.records.at(next_index)); - }, 0); } return $.when( self.handleOnWrite(record), - self.reload_record(record)); + self.reload_record(record)).pipe(function () { + return { + created: created, + record: record + } + }); }); }, /** From 4aa64c00338d9565a55ef4cc2b61503cdb42e6f3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 11:12:57 +0200 Subject: [PATCH 064/168] [FIX] removal of id-less records from list view bzr revid: xmo@openerp.com-20120703091257-3dw0qs9aw125hrc7 --- addons/web/static/src/js/view_list.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 07b24edbfcf..dab9fcb7727 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -905,8 +905,13 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. this.record_callbacks = { 'remove': function (event, record) { - var $row = self.$current.children( + var $row; + if (!record.get('id')) { + $row = self.$current.children(':not([data-id])'); + } else { + $row = self.$current.children( '[data-id=' + record.get('id') + ']'); + } var index = $row.data('index'); $row.remove(); self.refresh_zebra(index); From 75de0e54bb8185f4ad9a28bc1dbb489fd304d53c Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Tue, 3 Jul 2012 14:47:21 +0530 Subject: [PATCH 065/168] [IMP] l10n_in: Change reference of refund tax code bzr revid: jap@tinyerp.com-20120703091721-lmrwljpc91dyf3ir --- .../l10n_in/l10n_in_private_tax_template.xml | 20 +++++++++---------- .../l10n_in/l10n_in_public_tax_template.xml | 20 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index d28160b16ca..24fa028c23d 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -83,11 +83,11 @@ 1 - + 1 1 - + 1 @@ -103,11 +103,11 @@ 1 - + 1 1 - + 1 @@ -122,9 +122,9 @@ - + - + @@ -138,9 +138,9 @@ - + - + @@ -154,9 +154,9 @@ - + - + diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index ccf813bb713..ac043a8951f 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -81,11 +81,11 @@ all 1 - + 1 1 - + 1 @@ -101,11 +101,11 @@ all 1 - + 1 1 - + 1 @@ -121,11 +121,11 @@ all 1 - + 1 1 - + 1 @@ -141,11 +141,11 @@ all 1 - + 1 1 - + 1 @@ -161,11 +161,11 @@ all 1 - + 1 1 - + 1 From 1a7ca5f6763ce278c36560e97f196b838a6c92d5 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 11:32:00 +0200 Subject: [PATCH 066/168] [IMP] attempt to tighten concurrent operations during save phase of an edited row bzr revid: xmo@openerp.com-20120703093200-hxsr9pnwoszbgwgl --- .../web/static/src/js/view_list_editable.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 3e4d0d777e5..49e0e0a551f 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -141,7 +141,8 @@ openerp.web.list_editable = function (instance) { this.records.add(record, { at: this.options.editable === 'top' ? 0 : null}); } - var cells = this.getCellsFor(this.groups.getRowFor(record)); + var $recordRow = this.groups.getRowFor(record); + var cells = this.getCellsFor($recordRow); return this.ensureSaved().pipe(function () { return self.withEvent('edit', { record: record.attributes, @@ -196,13 +197,12 @@ openerp.web.list_editable = function (instance) { return !r.get('id'); }).set('id', attrs.id); } - return $.when( - self.handleOnWrite(record), - self.reload_record(record)).pipe(function () { - return { - created: created, - record: record - } + // onwrite callback could be altering & reloading the record + // which has *just* been saved, so first perform all onwrites + // then do a final reload of the record + return self.handleOnWrite(record) + .pipe(function () { return self.reload_record(record); }) + .pipe(function () { return { created: created, record: record }; }); }); }, @@ -338,9 +338,9 @@ openerp.web.list_editable = function (instance) { var self = this; var form = self.form; record = _.extend({}, record); - form.on_record_loaded(record).pipe(function () { + return form.on_record_loaded(record).pipe(function () { return form.do_show({reload: false}); - }).then(function () { + }).pipe(function () { self.record = record; // TODO: [Save] button // TODO: save on action button? From 54521dc35a5b516351ef692e654a915f8e42e608 Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Tue, 3 Jul 2012 15:12:57 +0530 Subject: [PATCH 067/168] [IMP] l10n_in: Remove extra space in tax name bzr revid: jap@tinyerp.com-20120703094257-ygdja7kek2oav7u6 --- .../l10n_in/l10n_in_private_tax_template.xml | 30 +++++++++---------- .../l10n_in/l10n_in_public_tax_template.xml | 30 +++++++++---------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index 24fa028c23d..f7b07dfd8dc 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -7,7 +7,7 @@ Sale Tax --> - Sale Tax - 15% + Sale Tax-15% 0.15 percent @@ -23,7 +23,7 @@ - Sale Tax - 12% + Sale Tax-12% 0.12 percent @@ -39,7 +39,7 @@ - Sale Tax - 4% + Sale Tax-4% 0.04 percent @@ -57,7 +57,7 @@ - Purchase Tax - 15% + Purchase Tax-15% @@ -74,7 +74,7 @@ - VAT - 5% (4% VAT + 1% Add. Tax.) + VAT-5%(4% VAT+1% Add. Tax.) 0.05 percent @@ -94,7 +94,7 @@ - VAT - 15% (12.5% VAT + 2.5% Add. Tax.) + VAT-15%(12.5% VAT+2.5% Add. Tax.) 0.15 percent @@ -114,7 +114,7 @@ - VAT - 8% + VAT-8% 0.08 percent @@ -130,7 +130,7 @@ - VAT - 10% + VAT-10% 0.10 percent @@ -146,7 +146,7 @@ - VAT - 12.5% + VAT-12.5% 12.5 percent @@ -164,7 +164,7 @@ - Excise Duty - 10.30% + Excise Duty-10.30% 0.10 percent @@ -184,7 +184,7 @@ - Excise Duty - 2% + Excise Duty-2% 0.02 percent sale @@ -193,7 +193,7 @@ - Excise Duty - 1% + Excise Duty-1% 0.01 percent sale @@ -205,7 +205,7 @@ all - Service Tax - 12.30% + Service Tax-12.30% 0.12 percent @@ -220,7 +220,7 @@ - Service Tax - %2 + Service Tax-%2 0.02 percent all @@ -229,7 +229,7 @@ - Service Tax - %1 + Service Tax-%1 0.01 percent all diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index ac043a8951f..efb49459973 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -6,7 +6,7 @@ - Sale Tax - 15% + Sale Tax-15% @@ -21,7 +21,7 @@ - Sale Tax - 12% + Sale Tax-12% @@ -36,7 +36,7 @@ - Sale Tax - 4% + Sale Tax-4% @@ -53,7 +53,7 @@ - Purchase Tax - 15% + Purchase Tax-15% @@ -72,7 +72,7 @@ - VAT - 5% (4% VAT + 1% Add. Tax.) + VAT-5%(4% VAT+1% Add. Tax.) @@ -92,7 +92,7 @@ - VAT - 15% (12.5% VAT + 2.5% Add. Tax.) + VAT-15% (12.5% VAT + 2.5% Add. Tax.) @@ -112,7 +112,7 @@ - VAT - 8% + VAT-8% @@ -132,7 +132,7 @@ - VAT - 10% + VAT-10% @@ -152,7 +152,7 @@ - VAT - 12.5% + VAT-12.5% @@ -174,7 +174,7 @@ - Service Tax - 12.30% + Service Tax-12.30% @@ -194,7 +194,7 @@ - Service Tax - %2 + Service Tax-%2 0.02 percent all @@ -203,7 +203,7 @@ - Service Tax - %1 + Service Tax-%1 0.01 percent all @@ -214,7 +214,7 @@ - Excise Duty - 10.30% + Excise Duty-10.30% @@ -234,7 +234,7 @@ - Excise Duty - %2 + Excise Duty-%2 0.02 percent sale @@ -243,7 +243,7 @@ - Excise Duty - 1% + Excise Duty-1% 0.01 percent sale From a5940c414790699caa9955c776002839917b0407 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 12:27:31 +0200 Subject: [PATCH 068/168] [IMP] reload record after cancelling an edition bzr revid: xmo@openerp.com-20120703102731-mh1gqbglenr4boem --- addons/web/static/src/js/view_list_editable.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 49e0e0a551f..0d88ddf6dee 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -216,13 +216,14 @@ openerp.web.list_editable = function (instance) { form: this.editor.form, cancel: false }, this.editor.cancel).then(function (attrs) { - if (!attrs.id) { - var to_delete = self.records.find(function (r) { - return !r.get('id'); - }); - if (to_delete) { - self.records.remove(to_delete); - } + if (attrs.id) { + return self.reload_record(self.records.get(attrs.id)); + } + var to_delete = self.records.find(function (r) { + return !r.get('id'); + }); + if (to_delete) { + self.records.remove(to_delete); } }); }, From ae6c6eb8ec1a00071045581f45be754783160b72 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 12:27:50 +0200 Subject: [PATCH 069/168] [ADD] save button instead of selector during edition bzr revid: xmo@openerp.com-20120703102750-1vmoljtbrnnl3lzo --- addons/web/static/src/css/base.css | 14 ++++++++++++++ addons/web/static/src/css/base.sass | 9 +++++++-- addons/web/static/src/js/view_list_editable.js | 18 +++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 41d48432559..6061113642a 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -2115,6 +2115,20 @@ .openerp .oe-listview-content .numeric input { text-align: right; } +.openerp .oe-listview-content tr.oe_edition th.oe-record-selector { + padding: 0 6px; + font-size: 1px; + letter-spacing: -1px; + color: transparent; +} +.openerp .oe-listview-content tr.oe_edition th.oe-record-selector:before { + font: 21px "mnmliconsRegular"; + content: "S"; + color: #404040; +} +.openerp .oe-listview-content tr.oe_edition th.oe-record-selector input { + display: none; +} .openerp .oe_trad_field.touched { border: 1px solid green !important; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 7135b474aa3..a55d1155859 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -83,9 +83,8 @@ $colour4: #8a89ba letter-spacing: -1px color: transparent &:before - font-family: "mnmliconsRegular" + font: 21px "mnmliconsRegular" content: $icon-name - font-size: 20px color: $color // }}} @@ -1667,6 +1666,12 @@ $colour4: #8a89ba width: 82px input text-align: right + + tr.oe_edition th.oe-record-selector + padding: 0 6px + @include text-to-icon("S") + input + display: none // }}} // Translation {{{ .oe_trad_field.touched diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 0d88ddf6dee..1c477046c2b 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -169,6 +169,8 @@ openerp.web.list_editable = function (instance) { }); }], [record.attributes]); + }).then(function () { + $recordRow.addClass('oe_edition') }); }, getCellsFor: function ($row) { @@ -343,7 +345,6 @@ openerp.web.list_editable = function (instance) { return form.do_show({reload: false}); }).pipe(function () { self.record = record; - // TODO: [Save] button // TODO: save on action button? _(form.fields).each(function (field, name) { configureField(name, field); @@ -412,6 +413,21 @@ openerp.web.list_editable = function (instance) { }); instance.web.ListView.List.include(/** @lends instance.web.ListView.List# */{ + init: function () { + var self = this; + this._super.apply(this, arguments); + var selection_handler = _.find(this.$_element.data('events').click, function (h) { + return h.selector === 'th.oe-record-selector'; + }).handler; + // TODO: cleaner way to do that? + this.$_element + .off('click', 'th.oe-record-selector') + .on('click', '.oe_edition th.oe-record-selector', function (e) { + e.stopImmediatePropagation(); + self.view.saveEdition(); + }) + .on('click', 'th.oe-record-selector', selection_handler); + }, row_clicked: function (event) { if (!this.options.editable) { return this._super.apply(this, arguments); From 336443d60446f059481cdef3ce954aefc4ff5e76 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 13:07:00 +0200 Subject: [PATCH 070/168] [IMP] hiding of readonly form fields in edition row: don't directly access DOM visibility properties bzr revid: xmo@openerp.com-20120703110700-k0dqtthwo1g36pod --- addons/web/static/src/js/view_list_editable.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 1c477046c2b..0926e233109 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -150,18 +150,16 @@ openerp.web.list_editable = function (instance) { }, self.editor.edit, [record.attributes, function (field_name, field) { var cell = cells[field_name]; - if (!cell) { return; } + if (!cell || field.get('effective_readonly')) { + // Readonly fields can just remain the list's, form's + // usually don't have backgrounds &al + field.set({invisible: true}); + return; + } var $cell = $(cell); var position = $cell.position(); - // FIXME: this is shit. Is it possible to prefilter? - if (field.get('effective_readonly')) { - // Readonly fields can just remain the list's, form's - // usually don't have backgrounds &al - field.$element.hide(); - return; - } - field.$element.show().css({ + field.$element.css({ top: position.top, left: position.left, width: $cell.outerWidth(), From 895dfe2448931f9f21e9d93c301e3e08890d851a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 15:32:10 +0200 Subject: [PATCH 071/168] [FIX] replace references to parent in editor with delegate, write some basic APIDoc bzr revid: xmo@openerp.com-20120703133210-kgrj7y10cr3c8hai --- .../web/static/src/js/view_list_editable.js | 17 +- doc/index.rst | 1 + doc/list-view.rst | 295 ++++++++++++++++++ 3 files changed, 307 insertions(+), 6 deletions(-) create mode 100644 doc/list-view.rst diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 0926e233109..826ee03a0c1 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -139,7 +139,7 @@ openerp.web.list_editable = function (instance) { if (!record) { record = new instance.web.list.Record(); this.records.add(record, { - at: this.options.editable === 'top' ? 0 : null}); + at: this.isPrependOnCreate() ? 0 : null}); } var $recordRow = this.groups.getRowFor(record); var cells = this.getCellsFor($recordRow); @@ -293,6 +293,9 @@ openerp.web.list_editable = function (instance) { })); }); }, + isPrependOnCreate: function () { + return this.options.editable === 'top'; + } }); instance.web.list.Editor = instance.web.Widget.extend({ @@ -305,18 +308,21 @@ openerp.web.list_editable = function (instance) { * @param {instance.web.Widget} parent * @param {Object} options * @param {instance.web.FormView} [options.formView=instance.web.FormView] + * @param {Object} [options.delegate] */ init: function (parent, options) { this._super(parent); this.options = options || {}; _.defaults(this.options, { - formView: instance.web.FormView + formView: instance.web.FormView, + delegate: this.getParent() }); + this.delegate = this.options.delegate; this.record = null; this.form = new (this.options.formView)( - this, this.getParent().dataset, false, { + this, this.delegate.dataset, false, { initial_mode: 'edit', $buttons: $(), $pager: $() @@ -325,8 +331,7 @@ openerp.web.list_editable = function (instance) { start: function () { var self = this; var _super = this._super(); - // TODO: getParent() should be delegate defaulting to getParent() - this.form.embedded_view = this.getParent().editionView(this); + this.form.embedded_view = this.delegate.editionView(this); var form_ready = this.form.appendTo(this.$element).then( self.form.proxy('do_hide')); return $.when(_super, form_ready); @@ -363,7 +368,7 @@ openerp.web.list_editable = function (instance) { save: function () { var self = this; return this.form - .do_save(null, this.getParent().options.editable === 'top') + .do_save(null, this.delegate.isPrependOnCreate()) .pipe(function (result) { var created = result.created && !self.record.id; if (created) { diff --git a/doc/index.rst b/doc/index.rst index c5b85326dac..8608af59d3d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,6 +18,7 @@ Contents: search-view + list-view form-notes Older stuff diff --git a/doc/list-view.rst b/doc/list-view.rst new file mode 100644 index 00000000000..a7436e419dc --- /dev/null +++ b/doc/list-view.rst @@ -0,0 +1,295 @@ +List View +========= + +Editable list view +------------------ + +List view edition is an extension to the base listview providing the +capability of inline record edition by delegating to an embedded form +view. + +.. todo:: + + cleanup options and settings for editability configuration. Right + now there are: + + ``defaults.editable`` + + ``null``, ``"top"`` or ``"bottom"``, generally broken and + useless + + ``context.set_editable`` + + forces ``options.editable`` to ``"bottom"`` + + ``view.arch.attrs.editable`` + + same as ``defaults.editable``, but applied separately (after + reloading the view), if absent delegates to + ``options.editable`` which may have been set previously. + + ``options.read_only`` + + worthless shit added by niv in the listview directly (wtf?) + + .. note:: can probably be replaced by cancelling ``edit:before`` + + and :js:func:`~openerp.web.ListView.set_editable` which + ultimately behaves weird-as-fuck-ly. + +The editable list view module adds a number of methods to the list +view, on top of implementing the :js:class:`EditorDelegate` protocol: + +Interaction Methods ++++++++++++++++++++ + +.. js:function:: openerp.web.ListView.ensureSaved + + Attempts to resolve the pending edition, if any, by saving the + edited row's current state. + + :returns: delegate resolving to all editions having been saved, or + rejected if a pending edition could not be saved + (e.g. validation failure) + +.. js:function:: openerp.web.ListView.startEdition([record]) + + Starts editing the provided record inline, through an overlay form + view of editable fields in the record. + + If no record is provided, creates a new one according to the + editability configuration of the list view. + + This method resolves any pending edition when invoked, before + starting a new edition. + + :type record: :js:class:`~openerp.web.list.Record` + :returns: delegate to the form used for the edition + +.. js:function:: openerp.web.ListView.saveEdition + + Resolves the pending edition. + + :returns: delegate to the save being completed, resolves to an + object with two attributes ``created`` (flag indicating + whether the saved record was just created or was + updated) and ``record`` the reloaded record having been + edited. + +.. js:function:: openerp.web.ListView.cancelEdition + + Cancels pending edition, cleans up the list view in case of + creation (removes the empty record being created). + +Utility Methods ++++++++++++++++ + +.. js:function:: openerp.web.ListView.getCellsFor(row) + + Extracts the cells from a listview row, and puts them in a + {fieldname: cell} mapping for analysis and manipulation. + + :param jQuery row: + :rtype: Object + +.. js:function:: openerp.web.ListView.withEvent(event_name, event, action[, args][, trigger_params]) + + Executes ``action`` in the context of the view's editor, + bracketing it with cancellable event signals. + + :param String event_name: base name for the bracketing event, will + be postfixed by ``:before`` and + ``:after`` before being called + (respectively before and after + ``action`` is executed) + :param Object event: object passed to the ``:before`` event + handlers. + :param Function action: function called with the view's editor as + its ``this``. May return a deferred. + :param Array args: arguments passed to ``action`` + :param Array trigger_params: arguments passed to the ``:after`` + event handler alongside the results + of ``action`` + +Behavioral Customizations ++++++++++++++++++++++++++ + +.. js:function:: openerp.web.ListView.handleOnWrite(record) + + Implements the handling of the ``onwrite`` listview attribute: + calls the RPC methods specified by ``@onwrite``, and if that + method returns an array of ids loads or reloads the records + corresponding to those ids. + + :param record: record being written having triggered the + ``onwrite`` callback + :type record: openerp.web.list.Record + :returns: deferred to all reloadings being done + +Events +++++++ + +For simpler interactions by/with external users of the listview, the +view provides a number of dedicated events to its lifecycle. + +.. note:: if an event is defined as *cancellable*, it means its first + parameter is an object on which the ``cancel`` attribute can + be set. If the ``cancel`` attribute is set, the view will + abort its current behavior as soon as possible, and rollback + any state modification. + +``edit:before`` *cancellable* + + Invoked before the list view starts editing a record. + + Provided with an event object with a single property ``record``, + holding the attributes of the record being edited (``record`` is + empty *but not null* for a new record) + +``edit:after`` + + Invoked after the list view has gone into an edition state, + provided with the attributes of the record being edited (see + ``edit:before``) as first parameter and the form used for the + edition as second parameter. + +``save:before`` *cancellable* + + Invoked right before saving a pending edition, provided with an + event object holding the listview's editor (``editor``) and the + edition form (``form``) + +``save:after`` + + Invoked after a save has been completed + + .. todo:: currently invoked before the record has reloaded, which + is kinda shitty + +``cancel:before`` *cancellable* + + Invoked before cancelling a pending edition, provided with the + same information as ``save:before``. + +``cancel:after`` + + Invoked after a pending edition has been cancelled. + +Editor +------ + +The list-edition modules does not generally interact with the embedded +formview, delegating instead to its +:js:class:`~openerp.web.list.Editor`. + +.. js:class:: openerp.web.list.Editor(parent[, options]) + + The editor object provides a more convenient interface to form + views, and simplifies the usage of form views for semi-arbitrary + edition of stuff. + + However, the editor does *not* task itself with being internally + consistent at this point: calling + e.g. :js:func:`~openerp.web.list.Editor.edit` multiple times in a + row without saving or cancelling each edit is undefined. + + .. todo:: define this behavior + + :param parent: + :type parent: :js:class:`~openerp.web.Widget` + :param EditorOptions options: + + .. js:function:: openerp.web.list.Editor.isEditing + + Indicates whether the editor is currently in the process of + providing edition for a field. + + :rtype: Boolean + + .. js:function:: openerp.web.list.Editor.edit(record, configureField) + + Loads the provided record into the internal form view and + displays the form view. + + Will also attempt to focus the first visible field of the form + view. + + :param Object record: record to load into the form view + (key:value mapping similar to the result + of a ``read``) + :param configureField: function called with each field of the + form view right after the form is + displayed, lets whoever called this + method do some last-minute + configuration of form fields. + :type configureField: Function + :returns: jQuery delegate to the form object + + .. js:function:: openerp.web.list.Editor.save + + Attempts to save the internal form, then hide it + + :returns: delegate to the record under edition (with ``id`` + added for a creation). The record is not updated + from when it was passed in, aside from the ``id`` + attribute. + + .. js:function:: openerp.web.list.Editor.cancel + + Attemps to cancel the edition of the internal form, then hide + the form + + :returns: delegate to the record under edition + +.. js:class:: EditorOptions + + .. js:attribute:: EditorOptions.formView + + Form view (sub)-class to instantiate and delegate edition to. + + By default, :js:class:`~openerp.web.FormView` + + .. js:attribute:: EditorOptions.delegate + + Object used to get various bits of information about how to + display stuff. + + By default, uses the editor's parent widget. See + :js:class:`EditorDelegate` for the methods and attributes to + provide. + +.. js:class:: EditorDelegate + + Informal protocol defining the methods and attributes expected of + the :js:class:`~openerp.web.list.Editor`'s delegate. + + .. js:attribute:: EditorDelegate.dataset + + The dataset passed to the form view to synchronize the form + view and the outer widget. + + .. js:function:: EditorDelegate.editionView(editor) + + Called by the :js:class:`~openerp.web.list.Editor` object to + get a form view (JSON) to pass along to the form view it + created. + + The result should be a valid form view, see :doc:`Form Notes + ` for various peculiarities of the form view + format. + + :param editor: editor object asking for the view + :type editor: :js:class:`~openerp.web.list.Editor` + :returns: form view + :rtype: Object + + .. js:function:: EditorDelegate.isPrependOnCreate + + By default, the :js:class:`~openerp.web.list.Editor` will + append the ids of newly created records to the + :js:attr:`EditorDelegate.dataset`. If this method returns + ``true``, it will prepend these ids instead. + + :returns: whether new records should be prepended to the + dataset (instead of appended) + :rtype: Boolean From 58d1d6bb3961ef1774272b0481b320271d223b33 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 16:30:35 +0200 Subject: [PATCH 072/168] [FIX] forgot to instantiate deferred bzr revid: xmo@openerp.com-20120703143035-zi336bg5lheocjpa --- addons/web/static/src/js/view_list_editable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 826ee03a0c1..e26d74585d5 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -381,7 +381,7 @@ openerp.web.list_editable = function (instance) { var record = this.record; this.record = null; if (!this.form.can_be_discarded()) { - return $.Deferred.reject(); + return $.Deferred().reject().promise(); } this.form.do_hide(); return $.when(record); From 7ab7992fd6c958b51a5907997afb8d81e77df2c7 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 16:31:26 +0200 Subject: [PATCH 073/168] [FIX] ensure current edition is saved before performing action bzr revid: xmo@openerp.com-20120703143126-6ludobg5o75t14ic --- addons/web/static/src/js/view_list_editable.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index e26d74585d5..90c2d29b429 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -114,6 +114,12 @@ openerp.web.list_editable = function (instance) { return result; }, + do_button_action: function () { + var self = this, _super = this._super, args = arguments; + this.ensureSaved().then(function () { + _super.apply(self, args); + }); + }, /** * Ensures the editable list is saved (saves any pending edition if * needed, or tries to) @@ -348,7 +354,6 @@ openerp.web.list_editable = function (instance) { return form.do_show({reload: false}); }).pipe(function () { self.record = record; - // TODO: save on action button? _(form.fields).each(function (field, name) { configureField(name, field); }); From db4aa8dfe77bfcf188164198faa8e3d007b3ed5b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 3 Jul 2012 17:53:05 +0200 Subject: [PATCH 074/168] [REF] remove deprecated & unused methods; extract some other methods bzr revid: xmo@openerp.com-20120703155305-4bigm8htt3xutkyt --- .../web/static/src/js/view_list_editable.js | 190 +++++------------- doc/list-view.rst | 16 ++ 2 files changed, 65 insertions(+), 141 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 90c2d29b429..197cb3dda30 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -72,7 +72,7 @@ openerp.web.list_editable = function (instance) { if (this.options.editable) { this.$element.find('table:first').show(); this.$element.find('.oe_view_nocontent').remove(); - this.groups.new_record(); + this.startEdition(); } else { this._super(); } @@ -85,29 +85,8 @@ openerp.web.list_editable = function (instance) { if (this.options.editable || true) { this.editor = new instance.web.list.Editor(this); - var editor_ready = this.editor.prependTo(this.$element).then(function () { - self.editor.$element.on('keyup', function (e) { - switch (e.which) { - case KEY_RETURN: - self.saveEdition().then(function (saveInfo) { - if (saveInfo.created) { - self.startEdition(); - return; - } - var next_index = self.records.indexOf(saveInfo.record) + 1; - if (next_index === self.records.length) { - next_index = 0; - } - - self.startEdition(self.records.at(next_index)); - }); - break; - case KEY_ESCAPE: - self.cancelEdition(); - break; - } - }); - }); + var editor_ready = this.editor.prependTo(this.$element) + .then(this.proxy('setupEvents')); return $.when(result, editor_ready); } @@ -286,21 +265,54 @@ openerp.web.list_editable = function (instance) { if (!on_write_callback) { return $.when(); } return this.dataset.call(on_write_callback, [source_record.get('id')]) .pipe(function (ids) { - return $.when.apply(null, _(ids).map(function (id) { - var record = self.records.get(id); - if (!record) { - // insert after the source record - var index = self.records.indexOf(source_record) + 1; - record = new instance.web.list.Record({id: id}); - self.records.add(record, {at: index}); - self.dataset.ids.splice(index, 0, id); - } - return self.reload_record(record); - })); + return $.when.apply( + null, _(ids).map( + _.bind(self.handleOnWriteRecord, self, source_record))); }); }, + handleOnWriteRecord: function (id, source_record) { + var record = this.records.get(id); + if (!record) { + // insert after the source record + var index = this.records.indexOf(source_record) + 1; + record = new instance.web.list.Record({id: id}); + this.records.add(record, {at: index}); + this.dataset.ids.splice(index, 0, id); + } + return this.reload_record(record); + }, isPrependOnCreate: function () { return this.options.editable === 'top'; + }, + setupEvents: function () { + var self = this; + this.editor.$element.on('keyup', function (e) { + var key = _($.ui.keyCode).chain() + .map(function (v, k) { return {name: k, code: v}; }) + .find(function (o) { return o.code === e.which; }) + .value(); + if (!key) { return; } + var method = 'keyup_' + key.name; + if (!(method in self)) { return; } + self[method](e); + }); + }, + keyup_RETURN: function () { + var self = this; + return this.saveEdition().pipe(function (saveInfo) { + if (saveInfo.created) { + return self.startEdition(); + } + var next_index = self.records.indexOf(saveInfo.record) + 1; + if (next_index === self.records.length) { + next_index = 0; + } + + return self.startEdition(self.records.at(next_index)); + }); + }, + keyup_ESCAPE: function () { + return this.cancelEdition(); } }); @@ -395,22 +407,6 @@ openerp.web.list_editable = function (instance) { instance.web.ListView.Groups.include(/** @lends instance.web.ListView.Groups# */{ passtrough_events: instance.web.ListView.Groups.prototype.passtrough_events + " edit saved", - new_record: function () { - // TODO: handle multiple children - this.children[null].new_record(); - }, - /** - * Ensures descendant editable List instances are all saved if they have - * pending editions. - * - * @returns {$.Deferred} - */ - ensureSaved: function () { - return $.when.apply(null, - _.invoke( - _.values(this.children), - 'ensureSaved')); - }, getRowFor: function (record) { return _(this.children).chain() .invoke('getRowFor', record) @@ -442,100 +438,12 @@ openerp.web.list_editable = function (instance) { } this.edit_record($(event.currentTarget).data('id')); }, - /** - * Checks if a record is being edited, and if so cancels it - */ - cancel_pending_edition: function () { - var self = this, cancelled; - if (!this.edition) { - return $.when(); - } - - if (this.edition_id) { - cancelled = this.reload_record(this.records.get(this.edition_id)); - } else { - cancelled = $.when(); - } - cancelled.then(function () { - self.view.unpad_columns(); - self.edition_form.destroy(); - self.edition_form.$element.remove(); - delete self.edition_form; - self.dataset.index = null; - delete self.edition_id; - delete self.edition; - }); - this.pad_table_to(5); - return cancelled; - }, - on_row_keyup: function (e) { - var self = this; - switch (e.which) { - case KEY_RETURN: - $(e.target).blur(); - e.preventDefault(); - //e.stopImmediatePropagation(); - setTimeout(function () { - self.save_row().then(function (result) { - if (result.created) { - self.new_record(); - return; - } - - var next_record_id, - next_record = self.records.at( - self.records.indexOf(result.edited_record) + 1); - if (next_record) { - next_record_id = next_record.get('id'); - self.dataset.index = _(self.dataset.ids) - .indexOf(next_record_id); - } else { - self.dataset.index = 0; - next_record_id = self.records.at(0).get('id'); - } - self.edit_record(next_record_id); - }, 0); - }); - break; - case KEY_ESCAPE: - this.cancelEdition(); - break; - } - }, - render_row_as_form: function (id) { - return this.view.startEdition( - id ? this.records.get(id) : null); - }, - /** - * If the current list is being edited, ensures it's saved - */ - ensureSaved: function () { - if (this.edition) { - // kinda-hack-ish: if the user has entered data in a field, - // oe_form_dirty will be set on the form so save, otherwise - // discard the current (entirely empty) line - if (this.edition_form.$element.is('.oe_form_dirty')) { - return this.save_row(); - } - return this.cancel_pending_edition(); - } - //noinspection JSPotentiallyInvalidConstructorUsage - return $.when(); - }, - /** - * Cancels the edition of the row for the current dataset index - */ - cancelEdition: function () { - this.cancel_pending_edition(); - }, /** * Edits record currently selected via dataset */ edit_record: function (record_id) { - this.render_row_as_form(record_id); - }, - new_record: function () { - this.render_row_as_form(); + return this.view.startEdition( + record_id ? this.records.get(record_id) : null); }, /** * If a row mapping to the record (@data-id matching the record's id or diff --git a/doc/list-view.rst b/doc/list-view.rst index a7436e419dc..e71c6a828d6 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -293,3 +293,19 @@ formview, delegating instead to its :returns: whether new records should be prepended to the dataset (instead of appended) :rtype: Boolean + +Changes from 6.1 +---------------- + +* The editable listview behavior has been rewritten pretty much from + scratch, any code touching on editability will have to be modified + + * The overloading of :js:class:`~openerp.web.ListView.Groups` and + :js:class:`~openerp.web.ListView.List` for editability has been + drastically simplified, and most of the behavior has been moved to + the list view itself. Only + :js:function:`~openerp.web.ListView.List.edit_record` remains from + the methods previously added, and only + :js:function:`~openerp.web.ListView.List.row_clicked` and + :js:function:`~openerp.web.ListView.List.init` are still + overridden. From 41956ffca79abd9e71cb4e93883805e638ec205f Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Wed, 4 Jul 2012 14:19:16 +0530 Subject: [PATCH 075/168] [IMP] l10n_in: Rename company type and add Tax payable account put 4 accounts of tax inside it, also add Tax receivable account for Purchase tax. bzr revid: jap@tinyerp.com-20120704084916-o9ke1u84aw2kv4ct --- addons/l10n_in/l10n_in_installer.py | 4 +- addons/l10n_in/l10n_in_private_chart.xml | 54 +++++++-- .../l10n_in/l10n_in_private_tax_template.xml | 44 +++---- addons/l10n_in/l10n_in_public_chart.xml | 113 +++++++++++------- .../l10n_in/l10n_in_public_tax_template.xml | 44 +++---- 5 files changed, 158 insertions(+), 101 deletions(-) diff --git a/addons/l10n_in/l10n_in_installer.py b/addons/l10n_in/l10n_in_installer.py index f3b82d7b0dd..c76346057c8 100644 --- a/addons/l10n_in/l10n_in_installer.py +++ b/addons/l10n_in/l10n_in_installer.py @@ -26,8 +26,8 @@ import tools class l10n_installer(osv.osv_memory): _inherit = 'account.installer' _columns = { - 'company_type': fields.selection([('public_company', 'Public Firm'), - ('partnership_private_company', 'Partnership/Private Firm') + 'company_type': fields.selection([('public_company', 'Public Ltd.'), + ('partnership_private_company', 'Private/Partnership Ltd.') ], 'Company Type', required=True, help='Company Type is used to install Indian chart of accounts as per need of business.'), } diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index d6ef24a20a6..bacaf5487eb 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -132,7 +132,26 @@ Amount of equipment's cost that has been allocated to Depreciation Expense since the time the equipment was acquired. + + + Tax Receivable + 190 + view + + + + + + Purchase Tax + 191 + receivable + + + + + + @@ -215,41 +234,52 @@ + + - Sales Tax Payable + Tax payable 216 + view + + + + + + + Sales Tax Payable + 2161 other - + - + VAT Payable - 217 + 2162 other - + - + Service Tax Payable - 218 + 2163 other - + - + Exice Duty Payable - 219 + 2164 other - + @@ -491,7 +521,7 @@ - India - Chart of Accounts for Partnership/Private Firm + India - Chart of Accounts for Private/Partnership Ltd. diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index f7b07dfd8dc..2198e2a1034 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -12,8 +12,8 @@ 0.15 percent sale - - + + @@ -28,8 +28,8 @@ 0.12 percent sale - - + + @@ -44,8 +44,8 @@ 0.04 percent sale - - + + @@ -58,8 +58,8 @@ Purchase Tax-15% - - + + 0.15 percent @@ -79,8 +79,8 @@ 0.05 percent all - - + + 1 @@ -99,8 +99,8 @@ 0.15 percent all - - + + 1 @@ -119,8 +119,8 @@ 0.08 percent all - - + + @@ -135,8 +135,8 @@ 0.10 percent all - - + + @@ -151,8 +151,8 @@ 12.5 percent all - - + + @@ -169,8 +169,8 @@ 0.10 percent sale - - + + 1 @@ -209,8 +209,8 @@ 0.12 percent - - + + diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index 7084d2ee1cf..6781d35008f 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -113,7 +113,25 @@ - + + + Tax Receivable + 15400 + view + + + + + + + Purchase tax + 15410 + other + + + + + @@ -260,54 +278,63 @@ - + + + Reserve and Surplus Account + 24600 + other + + + + + - - Sales Tax Payable - 24600 - other - - - - - - - VAT Payable - 24800 - other - - - - - - - Exice Duty Payable - 24900 - other - - - - - - Service Tax Payable + Tax payable 24700 - other - - - - - - - Reserve and Surplus Account - 24950 - other + view - + + + Sales Tax Payable + 24710 + other + + + + + + + VAT Payable + 24720 + other + + + + + + + Exice Duty Payable + 24730 + other + + + + + + + Service Tax Payable + 24740 + other + + + + + @@ -573,7 +600,7 @@ - India - Chart of Accounts for Public Firm + India - Chart of Accounts for Public Ltd. @@ -581,7 +608,7 @@ - + diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index efb49459973..f213b72408a 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -7,8 +7,8 @@ Sale Tax-15% - - + + 0.15 percent @@ -22,8 +22,8 @@ Sale Tax-12% - - + + 0.12 percent @@ -37,8 +37,8 @@ Sale Tax-4% - - + + 0.04 percent @@ -54,8 +54,8 @@ Purchase Tax-15% - - + + 0.15 percent @@ -73,8 +73,8 @@ VAT-5%(4% VAT+1% Add. Tax.) - - + + 0.05 percent @@ -93,8 +93,8 @@ VAT-15% (12.5% VAT + 2.5% Add. Tax.) - - + + 0.15 percent @@ -113,8 +113,8 @@ VAT-8% - - + + 0.08 percent @@ -133,8 +133,8 @@ VAT-10% - - + + 0.10 percent @@ -153,8 +153,8 @@ VAT-12.5% - - + + 12.5 percent @@ -175,8 +175,8 @@ Service Tax-12.30% - - + + 0.12 percent @@ -215,8 +215,8 @@ Excise Duty-10.30% - - + + 0.10 percent From 1fdad4f4928ee381d51b6c577bd13499937f5bd1 Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Wed, 4 Jul 2012 15:25:34 +0530 Subject: [PATCH 076/168] [IMP] l10n_in: remove purchase tax account and improve name bzr revid: jap@tinyerp.com-20120704095534-1agdv0mn41dvmnmx --- addons/l10n_in/l10n_in_installer.py | 4 ++-- addons/l10n_in/l10n_in_private_chart.xml | 19 +++++-------------- .../l10n_in/l10n_in_private_tax_template.xml | 6 +++--- addons/l10n_in/l10n_in_public_chart.xml | 13 ++----------- .../l10n_in/l10n_in_public_tax_template.xml | 6 +++--- 5 files changed, 15 insertions(+), 33 deletions(-) diff --git a/addons/l10n_in/l10n_in_installer.py b/addons/l10n_in/l10n_in_installer.py index c76346057c8..0d2b4f665b6 100644 --- a/addons/l10n_in/l10n_in_installer.py +++ b/addons/l10n_in/l10n_in_installer.py @@ -26,8 +26,8 @@ import tools class l10n_installer(osv.osv_memory): _inherit = 'account.installer' _columns = { - 'company_type': fields.selection([('public_company', 'Public Ltd.'), - ('partnership_private_company', 'Private/Partnership Ltd.') + 'company_type': fields.selection([('public_company', 'Public Ltd'), + ('partnership_private_company', 'Private Ltd/Partnership') ], 'Company Type', required=True, help='Company Type is used to install Indian chart of accounts as per need of business.'), } diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index bacaf5487eb..c156f5596ac 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -133,22 +133,13 @@ Amount of equipment's cost that has been allocated to Depreciation Expense since the time the equipment was acquired. - + Tax Receivable - 190 - view - - - - - - - Purchase Tax - 191 - receivable + 189 + other - + @@ -521,7 +512,7 @@ - India - Chart of Accounts for Private/Partnership Ltd. + India - Chart of Accounts for Private Ltd/Partnership diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index 2198e2a1034..2aa6ddbad22 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -58,8 +58,8 @@ Purchase Tax-15% - - + + 0.15 percent @@ -238,4 +238,4 @@ - \ No newline at end of file + diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index 6781d35008f..703093372db 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -117,19 +117,10 @@ Tax Receivable 15400 - view - - - - - - - Purchase tax - 15410 other - + @@ -600,7 +591,7 @@ - India - Chart of Accounts for Public Ltd. + India - Chart of Accounts for Public Ltd diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index f213b72408a..f32c5b6356a 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -54,8 +54,8 @@ Purchase Tax-15% - - + + 0.15 percent @@ -252,4 +252,4 @@ - \ No newline at end of file + From 039cf85e32c5445981d5706c8efd14c73a8619d3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 11:56:26 +0200 Subject: [PATCH 077/168] [TEST] start adding some testing to new editable listview, validate structure of editionView in Editor bzr revid: xmo@openerp.com-20120704095626-j7wtbgdmoti0kjie --- .../web/static/src/js/view_list_editable.js | 36 +++++++++- addons/web/static/src/js/views.js | 4 +- addons/web/static/test/list-editable.js | 71 +++++++++++++++++++ addons/web/static/test/test.html | 2 + doc/list-view.rst | 5 -- 5 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 addons/web/static/test/list-editable.js diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 197cb3dda30..a02383a5670 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -50,11 +50,12 @@ openerp.web.list_editable = function (instance) { * @param {Boolean} [force] forces the list to editability. Sets new row edition status to "bottom". */ set_editable: function (force) { + // TODO: fix handling of editability status to be simpler & clearer & more coherent // If ``force``, set editability to bottom // otherwise rely on view default // view' @editable is handled separately as we have not yet // fetched and processed the view at this point. - this.options.editable = true || ( + this.options.editable = ( ! this.options.read_only && ((force && "bottom") || this.defaults.editable)); }, /** @@ -82,7 +83,7 @@ openerp.web.list_editable = function (instance) { // tree/@editable takes priority on everything else if present. this.options.editable = ! this.options.read_only && (data.arch.attrs.editable || this.options.editable); var result = this._super(data, grouped); - if (this.options.editable || true) { + if (this.options.editable) { this.editor = new instance.web.list.Editor(this); var editor_ready = this.editor.prependTo(this.$element) @@ -168,6 +169,7 @@ openerp.web.list_editable = function (instance) { */ saveEdition: function () { var self = this; + // TODO: save:after should be invoked after reload return this.withEvent('save', { editor: this.editor, form: this.editor.form, @@ -349,16 +351,44 @@ openerp.web.list_editable = function (instance) { start: function () { var self = this; var _super = this._super(); - this.form.embedded_view = this.delegate.editionView(this); + this.form.embedded_view = this._validateView( + this.delegate.editionView(this)); var form_ready = this.form.appendTo(this.$element).then( self.form.proxy('do_hide')); return $.when(_super, form_ready); }, + _validateView: function (edition_view) { + if (!edition_view) { + throw new Error("editor delegate's #editionView must return " + + "a view descriptor"); + } + var arch = edition_view.arch; + if (!(arch && arch.children instanceof Array)) { + throw new Error("Editor delegate's #editionView must have a" + + " non-empty arch") + } + if (!(arch.tag === "form")) { + throw new Error("Editor delegate's #editionView must have a" + + " 'form' root node"); + } + if (!(arch.attrs && arch.attrs.version === "7.0")) { + throw new Error("Editor delegate's #editionView must be a" + + " version 7 view"); + } + if (!/\boe_form_container\b/.test(arch.attrs['class'])) { + throw new Error("Editor delegate's #editionView must have the" + + " class 'oe_form_container' on its root" + + " element"); + } + + return edition_view; + }, isEditing: function () { return !!this.record; }, edit: function (record, configureField) { + // TODO: specify sequence of edit calls var self = this; var form = self.form; record = _.extend({}, record); diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index e82d3d0ae9b..35901e90165 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -1238,7 +1238,9 @@ instance.web.json_node_to_xml = function(node, human_readable, indent) { if (typeof(node) === 'string') { return sindent + node; } else if (typeof(node.tag) !== 'string' || !node.children instanceof Array || !node.attrs instanceof Object) { - throw("Node a json node"); + throw new Error( + _.str.sprintf("Node [%s] is not a JSONified XML node", + JSON.stringify(node))); } for (var attr in node.attrs) { var vattr = node.attrs[attr]; diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js new file mode 100644 index 00000000000..6ac3d96df2c --- /dev/null +++ b/addons/web/static/test/list-editable.js @@ -0,0 +1,71 @@ +$(document).ready(function () { + var $fix = $('#qunit-fixture'); + var xhr = QWeb2.Engine.prototype.get_xhr(); + xhr.open('GET', '/web/static/src/xml/base.xml', false); + xhr.send(null); + var doc = xhr.responseXML; + + var noop = function () {}; + /** + * Make connection RPC responses mockable by setting keys on the + * Connection#responses object (key is the URL, value is the function to + * call with the RPC request payload) + * + * @param {openerp.web.Connection} connection connection instance to mockify + * @param {Object} [responses] url:function mapping to seed the mock connection + */ + var mockifyRPC = function (connection, responses) { + connection.responses = responses || {}; + connection.rpc_function = function (url, payload) { + if (!(url.url in this.responses)) { + return $.Deferred().reject({}, 'failed', _.str.sprintf("Url %s not found in mock responses", url.url)).promise(); + } + return $.when(this.responses[url.url](payload)); + }; + }; + + var instance; + var baseSetup = function () { + instance = window.openerp.init([]); + window.openerp.web.corelib(instance); + window.openerp.web.coresetup(instance); + window.openerp.web.chrome(instance); + window.openerp.web.data(instance); + window.openerp.web.views(instance); + window.openerp.web.list(instance); + window.openerp.web.form(instance); + window.openerp.web.list_editable(instance); + + instance.web.qweb.add_template(doc); + + mockifyRPC(instance.connection); + }; + module('editor', { + setup: baseSetup + }); + asyncTest('base-state', 2, function () { + var e = new instance.web.list.Editor({ + dataset: {}, + editionView: function () { + return { + arch: { + tag: 'form', + attrs: { + version: '7.0', + 'class': 'oe_form_container' + }, + children: [] + } + }; + } + }); + e.appendTo($fix) + .always(start) + .fail(function (error) { ok(false, error && error.message); }) + .done(function () { + ok(!e.isEditing(), "should not be editing"); + ok(e.form instanceof instance.web.FormView, + "should use default form type"); + }); + }); +}); diff --git a/addons/web/static/test/test.html b/addons/web/static/test/test.html index e352f63c17c..f06d68ed4da 100644 --- a/addons/web/static/test/test.html +++ b/addons/web/static/test/test.html @@ -38,6 +38,7 @@ +

OpenERP web Test Suite

@@ -55,4 +56,5 @@ + diff --git a/doc/list-view.rst b/doc/list-view.rst index e71c6a828d6..28f22ab7ad4 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -163,9 +163,6 @@ view provides a number of dedicated events to its lifecycle. Invoked after a save has been completed - .. todo:: currently invoked before the record has reloaded, which - is kinda shitty - ``cancel:before`` *cancellable* Invoked before cancelling a pending edition, provided with the @@ -193,8 +190,6 @@ formview, delegating instead to its e.g. :js:func:`~openerp.web.list.Editor.edit` multiple times in a row without saving or cancelling each edit is undefined. - .. todo:: define this behavior - :param parent: :type parent: :js:class:`~openerp.web.Widget` :param EditorOptions options: From 28d4c08aefde3bf2fe81ea90810de63423009be6 Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Wed, 4 Jul 2012 16:41:51 +0530 Subject: [PATCH 078/168] [IMP] l10n_in: Change user_type of tax account bzr revid: jap@tinyerp.com-20120704111151-a48mtne32mg0p0ym --- addons/l10n_in/l10n_in_private_chart.xml | 10 +++++----- addons/l10n_in/l10n_in_public_chart.xml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index c156f5596ac..feb7e58521e 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -137,7 +137,7 @@ Tax Receivable 189 other - +
@@ -241,7 +241,7 @@ Sales Tax Payable 2161 other - +
@@ -250,7 +250,7 @@ VAT Payable 2162 other - +
@@ -259,7 +259,7 @@ Service Tax Payable 2163 other - +
@@ -268,7 +268,7 @@ Exice Duty Payable 2164 other - +
diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index 703093372db..452a483b1dc 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -118,7 +118,7 @@ Tax Receivable 15400 other - +
@@ -294,7 +294,7 @@ Sales Tax Payable 24710 other - +
@@ -303,7 +303,7 @@ VAT Payable 24720 other - +
@@ -312,7 +312,7 @@ Exice Duty Payable 24730 other - +
@@ -321,7 +321,7 @@ Service Tax Payable 24740 other - +
From dda83dc1ea343e0f37bb037df773706d4c1375a2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 13:24:06 +0200 Subject: [PATCH 079/168] [IMP] extract some testing primitives to a dedicated module, migrate search view tests to those bzr revid: xmo@openerp.com-20120704112406-1lqwahtdo7fnla8o --- addons/web/static/test/list-editable.js | 37 +------ addons/web/static/test/search.js | 123 ++++++------------------ addons/web/static/test/test.html | 2 + addons/web/static/test/testing.js | 92 ++++++++++++++++++ 4 files changed, 129 insertions(+), 125 deletions(-) create mode 100644 addons/web/static/test/testing.js diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js index 6ac3d96df2c..4a8fbae1094 100644 --- a/addons/web/static/test/list-editable.js +++ b/addons/web/static/test/list-editable.js @@ -1,44 +1,13 @@ $(document).ready(function () { var $fix = $('#qunit-fixture'); - var xhr = QWeb2.Engine.prototype.get_xhr(); - xhr.open('GET', '/web/static/src/xml/base.xml', false); - xhr.send(null); - var doc = xhr.responseXML; - - var noop = function () {}; - /** - * Make connection RPC responses mockable by setting keys on the - * Connection#responses object (key is the URL, value is the function to - * call with the RPC request payload) - * - * @param {openerp.web.Connection} connection connection instance to mockify - * @param {Object} [responses] url:function mapping to seed the mock connection - */ - var mockifyRPC = function (connection, responses) { - connection.responses = responses || {}; - connection.rpc_function = function (url, payload) { - if (!(url.url in this.responses)) { - return $.Deferred().reject({}, 'failed', _.str.sprintf("Url %s not found in mock responses", url.url)).promise(); - } - return $.when(this.responses[url.url](payload)); - }; - }; var instance; var baseSetup = function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.views(instance); - window.openerp.web.list(instance); - window.openerp.web.form(instance); - window.openerp.web.list_editable(instance); + instance = openerp.testing.instanceFor('list_editable'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); }; module('editor', { setup: baseSetup diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index e5beab22498..a57a017e666 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -1,37 +1,8 @@ $(document).ready(function () { - var xhr = QWeb2.Engine.prototype.get_xhr(); - xhr.open('GET', '/web/static/src/xml/base.xml', false); - xhr.send(null); - var doc = xhr.responseXML; - - var noop = function () {}; - /** - * Make connection RPC responses mockable by setting keys on the - * Connection#responses object (key is the URL, value is the function to - * call with the RPC request payload) - * - * @param {openerp.web.Connection} connection connection instance to mockify - * @param {Object} [responses] url:function mapping to seed the mock connection - */ - var mockifyRPC = function (connection, responses) { - connection.responses = responses || {}; - connection.rpc_function = function (url, payload) { - if (!(url.url in this.responses)) { - return $.Deferred().reject({}, 'failed', _.str.sprintf("Url %s not found in mock responses", url.url)).promise(); - } - return $.when(this.responses[url.url](payload)); - }; - }; - var instance; module('query', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); } }); test('Adding a facet to the query creates a facet and a value', function () { @@ -167,16 +138,11 @@ $(document).ready(function () { module('defaults', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); @@ -404,18 +370,11 @@ $(document).ready(function () { module('completions', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - // date complete - window.openerp.web.formats(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); asyncTest('calling', 4, function () { @@ -454,7 +413,11 @@ $(document).ready(function () { var completion = { label: "Dummy", facet: { - field: {get_domain: noop, get_context: noop, get_groupby: noop}, + field: { + get_domain: openerp.testing.noop, + get_context: openerp.testing.noop, + get_groupby: openerp.testing.noop + }, category: 'Dummy', values: [{label: 'dummy', value: 42}] } @@ -476,7 +439,11 @@ $(document).ready(function () { }); }); asyncTest('facet selection: new value existing facet', 3, function () { - var field = {get_domain: noop, get_context: noop, get_groupby: noop}; + var field = { + get_domain: openerp.testing.noop, + get_context: openerp.testing.noop, + get_groupby: openerp.testing.noop + }; var completion = { label: "Dummy", facet: { @@ -663,16 +630,11 @@ $(document).ready(function () { module('search-serialization', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); asyncTest('No facet, no call', 6, function () { @@ -919,16 +881,11 @@ $(document).ready(function () { module('removal', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); asyncTest('clear button', function () { @@ -954,16 +911,11 @@ $(document).ready(function () { module('drawer', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); asyncTest('is-drawn', 2, function () { @@ -982,16 +934,11 @@ $(document).ready(function () { module('filters', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection, { + openerp.testing.mockifyRPC(instance, { '/web/searchview/load': function () { // view with a single group of filters return {result: {fields_view: { @@ -1096,17 +1043,11 @@ $(document).ready(function () { module('advanced', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.formats(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); asyncTest('single-advanced', 6, function () { diff --git a/addons/web/static/test/test.html b/addons/web/static/test/test.html index f06d68ed4da..21daf20241a 100644 --- a/addons/web/static/test/test.html +++ b/addons/web/static/test/test.html @@ -39,6 +39,8 @@ + +

OpenERP web Test Suite

diff --git a/addons/web/static/test/testing.js b/addons/web/static/test/testing.js new file mode 100644 index 00000000000..5b6e27700ab --- /dev/null +++ b/addons/web/static/test/testing.js @@ -0,0 +1,92 @@ +// Test support structures and methods for OpenERP +openerp.testing = (function () { + var xhr = QWeb2.Engine.prototype.get_xhr(); + xhr.open('GET', '/web/static/src/xml/base.xml', false); + xhr.send(null); + var doc = xhr.responseXML; + + var dependencies = { + corelib: [], + coresetup: ['corelib'], + data: ['corelib', 'coresetup'], + dates: [], + formats: ['coresetup', 'dates'], + chrome: ['corelib', 'coresetup'], + views: ['corelib', 'coresetup', 'data', 'chrome'], + search: ['data', 'coresetup', 'formats'], + list: ['views', 'data'], + form: ['data', 'views', 'list', 'formats'], + list_editable: ['list', 'form', 'data'], + }; + + return { + /** + * Function which does not do anything + */ + noop: function () { }, + /** + * Loads 'base.xml' template file into qweb for the provided instance + * + * @param instance openerp instance being initialized, to load the template file in + */ + loadTemplate: function (instance) { + instance.web.qweb.add_template(doc); + }, + /** + * Alter provided instance's ``connection`` attribute to make response + * mockable: + * + * * The ``responses`` parameter can be used to provide a map of (RPC) + * paths (e.g. ``/web/view/load``) to a function returning a response + * to the query. + * * ``instance,connection`` grows a ``responses`` attribute which is + * a map of the same (and is in fact initialized to the ``responses`` + * parameter if one is provided) + * + * Note that RPC requests to un-mocked URLs will be rejected with an + * error message: only explicitly specified urls will get a response. + * + * Mocked connections will *never* perform an actual RPC connection. + * + * @param instance openerp instance being initialized + * @param {Object} [responses] + */ + mockifyRPC: function (instance, responses) { + var connection = instance.connection; + connection.responses = responses || {}; + connection.rpc_function = function (url, payload) { + if (!(url.url in this.responses)) { + return $.Deferred().reject({}, 'failed', + _.str.sprintf("Url %s not found in mock responses", url.url)).promise(); + } + return $.when(this.responses[url.url](payload)); + }; + }, + /** + * Creates an openerp web instance loading the specified module after + * all of its dependencies. + * + * @param {String} module + * @returns OpenERP Web instance + */ + instanceFor: function (module) { + var instance = openerp.init([]); + this._load(instance, module); + return instance; + }, + _load: function (instance, module, loaded) { + if (!loaded) { loaded = []; } + + var deps = dependencies[module]; + if (!deps) { throw new Error("Unknown dependencies for " + module); } + + var to_load = _.difference(deps, loaded); + while (!_.isEmpty(to_load)) { + this._load(instance, to_load[0], loaded); + to_load = _.difference(deps, loaded); + } + openerp.web[module](instance); + loaded.push(module); + } + } +})(); From 9c6f8c53354893548e8c2d8457783ab2a0701beb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 14:19:57 +0200 Subject: [PATCH 080/168] [FIX] broken keyup handling for return key, incorrect name ($.ui.keyCode uses enter) bzr revid: xmo@openerp.com-20120704121957-hcwk5ove76kpo7y0 --- addons/web/static/src/js/view_list_editable.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index a02383a5670..17e1a04cf7a 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -3,10 +3,6 @@ * @namespace */ openerp.web.list_editable = function (instance) { - var KEY_RETURN = 13, - KEY_ESCAPE = 27; - var QWeb = instance.web.qweb; - // editability status of list rows instance.web.ListView.prototype.defaults.editable = null; @@ -299,7 +295,7 @@ openerp.web.list_editable = function (instance) { self[method](e); }); }, - keyup_RETURN: function () { + keyup_ENTER: function () { var self = this; return this.saveEdition().pipe(function (saveInfo) { if (saveInfo.created) { From 25284686f3ae459560c4f39bec83d045a0f3c500 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 15:28:22 +0200 Subject: [PATCH 081/168] [TEST] saving of record being edited, improve RPC mocking to allow dispatch on ORM method name bzr revid: xmo@openerp.com-20120704132822-3p4h1c6cyr0qvn2x --- .../web/static/src/js/view_list_editable.js | 7 ++- addons/web/static/test/list-editable.js | 62 +++++++++++++++++++ addons/web/static/test/testing.js | 11 +++- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 17e1a04cf7a..1c1c4cc0dfd 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -232,7 +232,9 @@ openerp.web.list_editable = function (instance) { event = event || {}; this.trigger(event_name + ':before', event); if (event.cancel) { - return $.Deferred().reject(); + return $.Deferred().reject({ + message: _.str.sprintf("Event %s:before cancelled", + event_name)}); } return $.when(action.apply(this.editor, args || [])).then(function () { self.trigger.apply(self, [event_name + ':after'] @@ -424,7 +426,8 @@ openerp.web.list_editable = function (instance) { var record = this.record; this.record = null; if (!this.form.can_be_discarded()) { - return $.Deferred().reject().promise(); + return $.Deferred().reject({ + message: "The form's data can not be discarded"}).promise(); } this.form.do_hide(); return $.when(record); diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js index 4a8fbae1094..62d9d82ae83 100644 --- a/addons/web/static/test/list-editable.js +++ b/addons/web/static/test/list-editable.js @@ -37,4 +37,66 @@ $(document).ready(function () { "should use default form type"); }); }); + asyncTest('toggle-edition-new', function () { + instance.connection.responses['/web/dataset/call_kw:create'] = function () { + return { result: 42 }; + }; + instance.connection.responses['/web/dataset/call_kw:read'] = function () { + return { result: [{ + id: 42, + a: false, + b: false, + c: false + }]}; + }; + var e = new instance.web.list.Editor({ + do_warn: function (e) { + warning = e; + }, + dataset: new instance.web.DataSetSearch(), + isPrependOnCreate: function () { return false; }, + editionView: function () { + return { + arch: { + tag: 'form', + attrs: { + version: '7.0', + 'class': 'oe_form_container' + }, + children: [ + {tag: 'field', attrs: {name: 'a'}}, + {tag: 'field', attrs: {name: 'b'}}, + {tag: 'field', attrs: {name: 'c'}} + ] + }, + fields: { + a: {type: 'char'}, + b: {type: 'char'}, + c: {type: 'char'} + } + }; + } + }); + var counter = 0; + var warning = null; + e.appendTo($fix) + .pipe(function () { + return e.edit(null, function () { + ++counter; + }); + }) + .pipe(function (form) { + ok(e.isEditing(), "editor is now editing"); + equal(counter, 3, "all fields have been configured"); + strictEqual(form, e.form); + return e.save(); + }) + .always(start) + .fail(function (error) { ok(false, error && error.message); }) + .done(function (record) { + ok(!warning, "should have received no warning"); + ok(!e.isEditing(), "should have stopped editing"); + equal(record.id, 42, "should have newly created id"); + }) + }); }); diff --git a/addons/web/static/test/testing.js b/addons/web/static/test/testing.js index 5b6e27700ab..e9525fc82a0 100644 --- a/addons/web/static/test/testing.js +++ b/addons/web/static/test/testing.js @@ -55,11 +55,16 @@ openerp.testing = (function () { var connection = instance.connection; connection.responses = responses || {}; connection.rpc_function = function (url, payload) { - if (!(url.url in this.responses)) { + var fn = this.responses[url.url + ':' + payload.params.method] + || this.responses[url.url]; + + if (!fn) { return $.Deferred().reject({}, 'failed', - _.str.sprintf("Url %s not found in mock responses", url.url)).promise(); + _.str.sprintf("Url %s not found in mock responses, with arguments %s", + url.url, JSON.stringify(payload.params)) + ).promise(); } - return $.when(this.responses[url.url](payload)); + return $.when(fn(payload)); }; }, /** From cd90a9365cc936c3a4d4b0f156f2fc9214baadef Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 15:35:21 +0200 Subject: [PATCH 082/168] [FUCK] that shit bzr revid: xmo@openerp.com-20120704133521-7x05840jzek1d8e7 --- addons/web/static/test/registry.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/addons/web/static/test/registry.js b/addons/web/static/test/registry.js index da0cb952783..ca689a351e0 100644 --- a/addons/web/static/test/registry.js +++ b/addons/web/static/test/registry.js @@ -9,21 +9,6 @@ $(document).ready(function () { openerp.web.Foo2 = {}; } }); - test('key fetch', function () { - var reg = new openerp.web.Registry({ - foo: 'openerp.web.Foo', - bar: 'openerp.web.Bar', - quux: 'openerp.web.Quux' - }); - - strictEqual(reg.get_object('foo'), openerp.web.Foo); - raises(function () { reg.get_object('qux'); }, - openerp.web.KeyNotFound, - "Unknown keys should raise KeyNotFound"); - raises(function () { reg.get_object('quux'); }, - openerp.web.ObjectNotFound, - "Incorrect file paths should raise ObjectNotFound"); - }); test('key set', function () { var reg = new openerp.web.Registry(); From 028f9d115f6bcc4ceccfc620d452dcca8a88f92d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 16:02:40 +0200 Subject: [PATCH 083/168] [FIX] strangely implemented searchview test breaking some subsequent tests randomly bzr revid: xmo@openerp.com-20120704140240-6yehb6c6ffxi7d12 --- addons/web/static/test/search.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index a57a017e666..2b86bcaabd9 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -391,10 +391,7 @@ $(document).ready(function () { } }); view.appendTo($('#qunit-fixture')) - .always(start) - .fail(function (error) { ok(false, error.message); }) .done(function () { - stop(); view.complete_global_search({term: "dum"}, function (completions) { start(); equal(completions.length, 1, "should have a single completion"); From b289447826560b34f9e0d0125730bf2f36e3836a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Jul 2012 17:23:29 +0200 Subject: [PATCH 084/168] [TEST] saving of editor with required non-filled field, and cancelling of edition bzr revid: xmo@openerp.com-20120704152329-81ktb8umm9xbr5wt --- addons/web/static/src/js/view_form.js | 17 +-- addons/web/static/test/list-editable.js | 164 ++++++++++++++++++------ 2 files changed, 134 insertions(+), 47 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 76fcabe13f8..2620694b74b 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -717,14 +717,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM });}); }, on_invalid: function() { - var msg = "
    "; - _.each(this.fields, function(f) { - if (!f.is_valid()) { - msg += "
  • " + (f.node.attrs.string || f.field.string) + "
  • "; - } - }); - msg += "
"; - this.do_warn("The following fields are invalid :", msg); + var warnings = _(this.fields).chain() + .filter(function (f) { return !f.is_valid(); }) + .map(function (f) { + return _.str.sprintf('
  • %s
  • ', + _.escape(f.node.attrs.string || f.field.string)); + }).value(); + warnings.unshift('
      '); + warnings.push('
    '); + this.do_warn("The following fields are invalid :", warnings.join('')); }, on_saved: function(r, success) { if (!r.result) { diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js index 62d9d82ae83..c96d50061b2 100644 --- a/addons/web/static/test/list-editable.js +++ b/addons/web/static/test/list-editable.js @@ -9,6 +9,64 @@ $(document).ready(function () { openerp.testing.mockifyRPC(instance); }; + + + /** + * + * @param {String} name + * @param {Object} [attrs] + * @param {String} [attrs.type="char"] + * @param {Boolean} [attrs.required] + * @param {Boolean} [attrs.invisible] + * @param {Boolean} [attrs.readonly] + * @return {Object} + */ + function field(name, attrs) { + attrs = attrs || {}; + attrs.name = name; + return _.defaults(attrs, { + type: 'char' + }); + } + + /** + * @param {Array} fields + * @return {Object} + */ + function makeFormView(fields) { + var fobj = {}; + _(fields).each(function (field) { + fobj[field.name] = { + type: field.type, + string: field.string + }; + }); + var children = _(fields).map(function (field) { + return { + tag: 'field', + attrs: { + name: field.name, + modifiers: JSON.stringify({ + required: field.required, + invisible: field.invisible, + readonly: field.readonly + }) + } + } + }); + return { + arch: { + tag: 'form', + attrs: { + version: '7.0', + 'class': 'oe_form_container' + }, + children: children + }, + fields: fobj + }; + } + module('editor', { setup: baseSetup }); @@ -16,16 +74,7 @@ $(document).ready(function () { var e = new instance.web.list.Editor({ dataset: {}, editionView: function () { - return { - arch: { - tag: 'form', - attrs: { - version: '7.0', - 'class': 'oe_form_container' - }, - children: [] - } - }; + return makeFormView(); } }); e.appendTo($fix) @@ -37,10 +86,10 @@ $(document).ready(function () { "should use default form type"); }); }); - asyncTest('toggle-edition-new', function () { + asyncTest('toggle-edition-save', 4, function () { instance.connection.responses['/web/dataset/call_kw:create'] = function () { return { result: 42 }; - }; + }; instance.connection.responses['/web/dataset/call_kw:read'] = function () { return { result: [{ id: 42, @@ -50,35 +99,13 @@ $(document).ready(function () { }]}; }; var e = new instance.web.list.Editor({ - do_warn: function (e) { - warning = e; - }, dataset: new instance.web.DataSetSearch(), isPrependOnCreate: function () { return false; }, editionView: function () { - return { - arch: { - tag: 'form', - attrs: { - version: '7.0', - 'class': 'oe_form_container' - }, - children: [ - {tag: 'field', attrs: {name: 'a'}}, - {tag: 'field', attrs: {name: 'b'}}, - {tag: 'field', attrs: {name: 'c'}} - ] - }, - fields: { - a: {type: 'char'}, - b: {type: 'char'}, - c: {type: 'char'} - } - }; + return makeFormView([ field('a'), field('b'), field('c') ]); } }); var counter = 0; - var warning = null; e.appendTo($fix) .pipe(function () { return e.edit(null, function () { @@ -86,17 +113,76 @@ $(document).ready(function () { }); }) .pipe(function (form) { - ok(e.isEditing(), "editor is now editing"); - equal(counter, 3, "all fields have been configured"); - strictEqual(form, e.form); + ok(e.isEditing(), "should be editing"); + equal(counter, 3, "should have configured all fields"); return e.save(); }) .always(start) .fail(function (error) { ok(false, error && error.message); }) .done(function (record) { - ok(!warning, "should have received no warning"); ok(!e.isEditing(), "should have stopped editing"); equal(record.id, 42, "should have newly created id"); }) }); + asyncTest('toggle-edition-cancel', 2, function () { + instance.connection.responses['/web/dataset/call_kw:create'] = function () { + return { result: 42 }; + }; + var e = new instance.web.list.Editor({ + dataset: new instance.web.DataSetSearch(), + isPrependOnCreate: function () { return false; }, + editionView: function () { + return makeFormView([ field('a'), field('b'), field('c') ]); + } + }); + var counter = 0; + e.appendTo($fix) + .pipe(function () { + return e.edit(null, function () { + ++counter; + }); + }) + .pipe(function (form) { + return e.cancel(); + }) + .always(start) + .fail(function (error) { ok(false, error && error.message); }) + .done(function (record) { + ok(!e.isEditing(), "should have stopped editing"); + ok(!record.id, "should have no id"); + }) + }); + asyncTest('toggle-save-required', 2, function () { + instance.connection.responses['/web/dataset/call_kw:create'] = function () { + return { result: 42 }; + }; + var e = new instance.web.list.Editor({ + do_warn: function () { + warnings++; + }, + dataset: new instance.web.DataSetSearch(), + isPrependOnCreate: function () { return false; }, + editionView: function () { + return makeFormView([ + field('a', {required: true}), field('b'), field('c') ]); + } + }); + var counter = 0; + var warnings = 0; + e.appendTo($fix) + .pipe(function () { + return e.edit(null, function () { + ++counter; + }); + }) + .pipe(function (form) { + return e.save(); + }) + .always(start) + .done(function () { ok(false, "cancel should not succeed"); }) + .fail(function () { + equal(warnings, 1, "should have been warned"); + ok(e.isEditing(), "should have kept editing"); + }) + }); }); From 29059749b5c1b2f2b9f007dddf67fab9c8e98e01 Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Thu, 5 Jul 2012 11:03:07 +0530 Subject: [PATCH 085/168] [IMP] l10n_in: Add new account in public chart bzr revid: jap@tinyerp.com-20120705053307-xcsu2hzg0pudz03c --- addons/l10n_in/l10n_in_public_chart.xml | 76 ++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index 452a483b1dc..40c3227dc4c 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -122,7 +122,81 @@
    - + + + + + Property, Plant, and Equipment + 17000 + view + + + + + + + Land + 17200 + other + + + + + + + Buildings + 17100 + other + + + + + + + Equipment + 17300 + other + + + + + + + Vehicles + 17800 + other + + + + + + + Accumulated Depreciation - Buildings + 18100 + other + + + + + + + Accumulated Depreciation - Equipment + 18300 + other + + + + + + + Accumulated Depreciation - Vehicles + 18800 + other + + + + + From 09bf459bbc3faf5c2ee4198d703007e640575835 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jul 2012 09:08:54 +0200 Subject: [PATCH 086/168] [TESTS] add some bzr revid: xmo@openerp.com-20120705070854-tsyl27v3hdh7sbds --- .../web/static/src/js/view_list_editable.js | 103 +++++++++--------- addons/web/static/test/list-editable.js | 50 +++++++++ 2 files changed, 104 insertions(+), 49 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 1c1c4cc0dfd..8f0a036b1b9 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -125,32 +125,34 @@ openerp.web.list_editable = function (instance) { } var $recordRow = this.groups.getRowFor(record); var cells = this.getCellsFor($recordRow); + return this.ensureSaved().pipe(function () { return self.withEvent('edit', { record: record.attributes, cancel: false - }, self.editor.edit, - [record.attributes, function (field_name, field) { - var cell = cells[field_name]; - if (!cell || field.get('effective_readonly')) { - // Readonly fields can just remain the list's, form's - // usually don't have backgrounds &al - field.set({invisible: true}); - return; - } - var $cell = $(cell); - var position = $cell.position(); + }, function () { + return self.editor.edit(record.attributes, function (field_name, field) { + var cell = cells[field_name]; + if (!cell || field.get('effective_readonly')) { + // Readonly fields can just remain the list's, form's + // usually don't have backgrounds &al + field.set({invisible: true}); + return; + } + var $cell = $(cell); + var position = $cell.position(); - field.$element.css({ - top: position.top, - left: position.left, - width: $cell.outerWidth(), - minHeight: $cell.outerHeight() + field.$element.css({ + top: position.top, + left: position.left, + width: $cell.outerWidth(), + minHeight: $cell.outerHeight() + }); + }).pipe(function () { + $recordRow.addClass('oe_edition'); + return record.attributes; }); - }], - [record.attributes]); - }).then(function () { - $recordRow.addClass('oe_edition') + }); }); }, getCellsFor: function ($row) { @@ -165,27 +167,29 @@ openerp.web.list_editable = function (instance) { */ saveEdition: function () { var self = this; - // TODO: save:after should be invoked after reload return this.withEvent('save', { editor: this.editor, form: this.editor.form, cancel: false - }, this.editor.save).pipe(function (attrs) { - var created = false; - var record = self.records.get(attrs.id); - if (!record) { - // new record - created = true; - record = self.records.find(function (r) { - return !r.get('id'); - }).set('id', attrs.id); - } - // onwrite callback could be altering & reloading the record - // which has *just* been saved, so first perform all onwrites - // then do a final reload of the record - return self.handleOnWrite(record) - .pipe(function () { return self.reload_record(record); }) - .pipe(function () { return { created: created, record: record }; + }, function () { + return this.editor.save().pipe(function (attrs) { + var created = false; + var record = self.records.get(attrs.id); + if (!record) { + // new record + created = true; + record = self.records.find(function (r) { + return !r.get('id'); + }).set('id', attrs.id); + } + // onwrite callback could be altering & reloading the + // record which has *just* been saved, so first perform all + // onwrites then do a final reload of the record + return self.handleOnWrite(record) + .pipe(function () { + return self.reload_record(record); }) + .pipe(function () { + return { created: created, record: record }; }); }); }); }, @@ -198,16 +202,18 @@ openerp.web.list_editable = function (instance) { editor: this.editor, form: this.editor.form, cancel: false - }, this.editor.cancel).then(function (attrs) { - if (attrs.id) { - return self.reload_record(self.records.get(attrs.id)); - } - var to_delete = self.records.find(function (r) { - return !r.get('id'); + }, function () { + return this.editor.cancel().pipe(function (attrs) { + if (attrs.id) { + return self.reload_record(self.records.get(attrs.id)); + } + var to_delete = self.records.find(function (r) { + return !r.get('id'); + }); + if (to_delete) { + self.records.remove(to_delete); + } }); - if (to_delete) { - self.records.remove(to_delete); - } }); }, /** @@ -227,7 +233,7 @@ openerp.web.list_editable = function (instance) { * @param {Array} [trigger_params] supplementary arguments provided to the ``:after`` sub-event, before anything fetched by the ``action`` function * @return {jQuery.Deferred} */ - withEvent: function (event_name, event, action, args, trigger_params) { + withEvent: function (event_name, event, action) { var self = this; event = event || {}; this.trigger(event_name + ':before', event); @@ -236,9 +242,8 @@ openerp.web.list_editable = function (instance) { message: _.str.sprintf("Event %s:before cancelled", event_name)}); } - return $.when(action.apply(this.editor, args || [])).then(function () { + return $.when(action.call(this)).then(function () { self.trigger.apply(self, [event_name + ':after'] - .concat(trigger_params || []) .concat(_.toArray(arguments))); }); }, diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js index c96d50061b2..5029f9a7643 100644 --- a/addons/web/static/test/list-editable.js +++ b/addons/web/static/test/list-editable.js @@ -185,4 +185,54 @@ $(document).ready(function () { ok(e.isEditing(), "should have kept editing"); }) }); + + module('list-edition-events', { + setup: function () { + baseSetup(); + _.extend(instance.connection.responses, { + '/web/listview/load': function () { + return {result: { + type: 'tree', + fields: { + a: {type: 'char', string: "A"}, + b: {type: 'char', string: "B"}, + c: {type: 'char', string: "C"} + }, + arch: { + tag: 'tree', + attrs: {}, + children: [ + {tag: 'field', attrs: {name: 'a'}}, + {tag: 'field', attrs: {name: 'b'}}, + {tag: 'field', attrs: {name: 'c'}} + ] + } + }}; + } + }); + } + }); + asyncTest('edition events', function () { + var ds = new instance.web.DataSetStatic(null, 'demo', null, [1]); + var o = { + counter: 0, + onEvent: function (e) { this.counter++; } + }; + var l = new instance.web.ListView(null, ds); + l.set_editable(true); + l.on('edit:before edit:after', o, o.onEvent); + l.appendTo($fix) + .always(start) + .pipe(function () { + ok(l.options.editable, "should be editable"); + equal(o.counter, 0, "should have seen no event yet"); + return l.startEdition(); + }) + .pipe(function () { + ok(l.editor.isEditing(), "should be editing"); + equal(o.counter, 2, "should have seen two edition events"); + }) + .fail(function (e) { ok(false, e && e.message); }); + }); + // TODO: test cancelling edition events }); From 039b7397c9fcf139b0e02519b3f2b9b7a090f593 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Thu, 5 Jul 2012 16:32:07 +0530 Subject: [PATCH 087/168] [FIX] l10n_in: Fix indetation bzr revid: mra@tinyerp.com-20120705110207-gdvvbz07jy1vt8or --- .../l10n_in/l10n_in_public_tax_template.xml | 80 +++++++++---------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index f32c5b6356a..88f78121b22 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -1,11 +1,10 @@ - - - - - - + + + + + Sale Tax-15% @@ -19,8 +18,8 @@ - - + + Sale Tax-12% @@ -52,7 +51,7 @@ - + Purchase Tax-15% @@ -68,10 +67,10 @@ - - - - + + + + VAT-5%(4% VAT+1% Add. Tax.) @@ -91,7 +90,7 @@ - + VAT-15% (12.5% VAT + 2.5% Add. Tax.) @@ -109,9 +108,9 @@ 1 - - - + + + VAT-8% @@ -151,7 +150,7 @@ - + VAT-12.5% @@ -171,9 +170,9 @@ - - - + + + Service Tax-12.30% @@ -191,29 +190,28 @@ 1 - - - + + Service Tax-%2 0.02 percent all - - - + + + Service Tax-%1 0.01 percent all - + + + - - - + Excise Duty-10.30% @@ -231,25 +229,25 @@ 1 - - - + + + Excise Duty-%2 0.02 percent sale - - - + + + Excise Duty-1% 0.01 percent sale - - - - + + + + \ No newline at end of file From 986b1af0996c8829ff77e6d02c3d3bea79923247 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Thu, 5 Jul 2012 16:35:34 +0530 Subject: [PATCH 088/168] [FIX] l10n_in: Fix indetation bzr revid: mra@tinyerp.com-20120705110534-qqcya0kf4w84c65n --- .../l10n_in/l10n_in_private_tax_template.xml | 81 +++++++++---------- 1 file changed, 39 insertions(+), 42 deletions(-) diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index 2aa6ddbad22..6cb8933728c 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -1,12 +1,9 @@ - - - - - - + + + + Sale Tax-15% 0.15 @@ -20,9 +17,9 @@ - - - + + + Sale Tax-12% 0.12 @@ -36,7 +33,7 @@ - + Sale Tax-4% @@ -70,10 +67,10 @@ - - - - + + + + VAT-5%(4% VAT+1% Add. Tax.) 0.05 @@ -91,9 +88,9 @@ 1 - - - + + + VAT-15%(12.5% VAT+2.5% Add. Tax.) 0.15 @@ -112,8 +109,8 @@ - - + + VAT-8% 0.08 @@ -161,11 +158,11 @@ - - - + + + Excise Duty-10.30% - + 0.10 percent sale @@ -181,9 +178,9 @@ 1 - - - + + + Excise Duty-2% 0.02 percent @@ -191,8 +188,8 @@ - - + + Excise Duty-1% 0.01 percent @@ -200,10 +197,10 @@ - - - - + + + + all Service Tax-12.30% @@ -218,24 +215,24 @@ - - + + Service Tax-%2 0.02 percent all - - - + + + Service Tax-%1 0.01 percent all - - - - +
    + + + \ No newline at end of file From d968398d153a76cb36b5099ad312fef6cdb03c8d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jul 2012 14:43:42 +0200 Subject: [PATCH 089/168] [ADD] events tests bzr revid: xmo@openerp.com-20120705124342-vm0pavyzqfuwa3k5 --- addons/web/static/test/list-editable.js | 39 +++++++++++++++++++++++-- addons/web/static/test/test.html | 3 ++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js index 5029f9a7643..5a03f263ffe 100644 --- a/addons/web/static/test/list-editable.js +++ b/addons/web/static/test/list-editable.js @@ -208,6 +208,14 @@ $(document).ready(function () { ] } }}; + }, + '/web/dataset/call_kw:read': function (params) { + return {result: [{ + id: 1, + a: 'foo', + b: 'bar', + c: 'baz' + }]}; } }); } @@ -218,10 +226,11 @@ $(document).ready(function () { counter: 0, onEvent: function (e) { this.counter++; } }; - var l = new instance.web.ListView(null, ds); + var l = new instance.web.ListView({}, ds); l.set_editable(true); l.on('edit:before edit:after', o, o.onEvent); l.appendTo($fix) + .pipe(l.proxy('reload_content')) .always(start) .pipe(function () { ok(l.options.editable, "should be editable"); @@ -234,5 +243,31 @@ $(document).ready(function () { }) .fail(function (e) { ok(false, e && e.message); }); }); - // TODO: test cancelling edition events + + asyncTest('edition events: cancelling', 3, function () { + var edit_after = false; + var ds = new instance.web.DataSetStatic(null, 'demo', null, [1]); + var l = new instance.web.ListView({}, ds); + l.set_editable(true); + l.on('edit:before', {}, function (e) { + e.cancel = true; + }); + l.on('edit:after', {}, function () { + edit_after = true; + }); + l.appendTo($fix) + .pipe(l.proxy('reload_content')) + .always(start) + .pipe(function () { + ok(l.options.editable, "should be editable"); + return l.startEdition(); + }) + // cancelling an event rejects the deferred + .pipe($.Deferred().reject(), function () { + ok(!l.editor.isEditing(), "should not be editing"); + ok(!edit_after, "should not have fired the edit:after event"); + return $.when(); + }) + .fail(function (e) { ok(false, e && e.message || e); }); + }); }); diff --git a/addons/web/static/test/test.html b/addons/web/static/test/test.html index 21daf20241a..520a7106b5b 100644 --- a/addons/web/static/test/test.html +++ b/addons/web/static/test/test.html @@ -41,6 +41,9 @@ +

    OpenERP web Test Suite

    From ee20d563570fcf3b3eabb90d82dd5f1c5164f1a9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jul 2012 16:37:21 +0200 Subject: [PATCH 090/168] [FIX] Create new records as a bunch of empty (false) fields, otherwise Bad Things Happen ~/projects/tiny/web/current namely, if the list view fields have e.g. attributes associated, the computation of the domains blow up also, always create an editor in the listview (if the editable listview module has been installed), avoids blowing up 'safety' calls to #ensureSaved. An alternative would be to fix #ensureSaved not to blow up if there's no editor, but that means third parties which *know* there may be an editor in the list view can't easily hook up to it. Things will have to change anyway as currently toggling a list view from not-editable to editable after on_loaded has been called will not work correctly (it won't start the editor), which is shitty. bzr revid: xmo@openerp.com-20120705143721-4fiz64k7fka4052k --- addons/web/static/src/js/view_list_editable.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 8f0a036b1b9..ab02ef49093 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -12,6 +12,8 @@ openerp.web.list_editable = function (instance) { var self = this; this._super.apply(this, arguments); + this.editor = new instance.web.list.Editor(this); + $(this.groups).bind({ 'edit': function (e, id, dataset) { self.do_edit(dataset.index, id, dataset); @@ -80,8 +82,6 @@ openerp.web.list_editable = function (instance) { this.options.editable = ! this.options.read_only && (data.arch.attrs.editable || this.options.editable); var result = this._super(data, grouped); if (this.options.editable) { - this.editor = new instance.web.list.Editor(this); - var editor_ready = this.editor.prependTo(this.$element) .then(this.proxy('setupEvents')); @@ -119,7 +119,12 @@ openerp.web.list_editable = function (instance) { startEdition: function (record) { var self = this; if (!record) { - record = new instance.web.list.Record(); + var attrs = {}; + _(this.columns).chain() + .filter(function (x) { return x.tag === 'field'}) + .pluck('name') + .each(function (field) { attrs[field] = false; }); + record = new instance.web.list.Record(attrs); this.records.add(record, { at: this.isPrependOnCreate() ? 0 : null}); } From cd59881b05bcfc6d27e2b97ad5edb617dd3fdbb7 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 9 Jul 2012 10:06:04 +0200 Subject: [PATCH 091/168] [FIX] Editor is not restartable, so don't restart it. Instead, create a new one at each on_loaded. Editor is not restartable because the formview wedges itself if its on_loaded is called more than once bzr revid: xmo@openerp.com-20120709080604-er1l6bn5eespue59 --- addons/web/static/src/js/view_list_editable.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index ab02ef49093..1285e48885f 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -78,10 +78,16 @@ openerp.web.list_editable = function (instance) { }, on_loaded: function (data, grouped) { var self = this; + if (this.editor) { + this.editor.destroy(); + } // tree/@editable takes priority on everything else if present. this.options.editable = ! this.options.read_only && (data.arch.attrs.editable || this.options.editable); var result = this._super(data, grouped); if (this.options.editable) { + // Editor is not restartable due to formview not being + // restartable + this.editor = new instance.web.list.Editor(this); var editor_ready = this.editor.prependTo(this.$element) .then(this.proxy('setupEvents')); From 853c5a70c0281d622c86919f85afd5ae9e4be5ee Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 9 Jul 2012 10:46:52 +0200 Subject: [PATCH 092/168] [ADD] 'false' id to newly created records, otherwise format_cell's button rendering blows up also fix various bits of code looking for an absence of @data-id, so that they look for a false @data-id to match the row of the new record instead bzr revid: xmo@openerp.com-20120709084652-rt1ffu2ea20scw53 --- addons/web/static/src/js/view_list.js | 11 +++-------- addons/web/static/src/js/view_list_editable.js | 10 +++------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index dab9fcb7727..936af4de5e1 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -905,13 +905,8 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. this.record_callbacks = { 'remove': function (event, record) { - var $row; - if (!record.get('id')) { - $row = self.$current.children(':not([data-id])'); - } else { - $row = self.$current.children( - '[data-id=' + record.get('id') + ']'); - } + var $row = self.$current.children( + '[data-id=' + record.get('id') + ']'); var index = $row.data('index'); $row.remove(); self.refresh_zebra(index); @@ -928,7 +923,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. self.dataset.ids.splice( self.records.indexOf(record), 0, value); // Set id on new record - $row = self.$current.children('tr:not([data-id])'); + $row = self.$current.children('[data-id=false]'); } else { $row = self.$current.children( '[data-id=' + record.get('id') + ']'); diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 1285e48885f..e66fdc1c917 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -125,7 +125,7 @@ openerp.web.list_editable = function (instance) { startEdition: function (record) { var self = this; if (!record) { - var attrs = {}; + var attrs = {id: false}; _(this.columns).chain() .filter(function (x) { return x.tag === 'field'}) .pluck('name') @@ -499,12 +499,8 @@ openerp.web.list_editable = function (instance) { * @return {jQuery|null} */ getRowFor: function (record) { - var id, $row; - if (id = record.get('id')) { - $row = this.$current.children('[data-id=' + id + ']'); - } else { - $row = this.$current.children(':not([data-id])'); - } + var id; + var $row = this.$current.children('[data-id=' + record.get('id') + ']'); if ($row.length) { return $row; } From d51c9a85903fc26bdc305cd9dce2f7cb2bc684ec Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 9 Jul 2012 11:24:01 +0200 Subject: [PATCH 093/168] [FIX] double-include of ids in the dataset, and double-save in some cases ~/projects/tiny/web/current on [change] of a listview record, if there was no id on the record (id=false) we need to add one. But depending how the creation/addition of the record was done, the id may already have been inserted e.g. by the formview. So first check if the record's id is already in the dataset, and add it if it's not. bzr revid: xmo@openerp.com-20120709092401-p1in6bvs5e2ptp5p --- addons/web/static/src/js/view_list.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 936af4de5e1..f25164d56e5 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -919,9 +919,12 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. throw new Error("Setting 'id' attribute on existing record " + JSON.stringify(record.attributes)); } - // add record to dataset - self.dataset.ids.splice( - self.records.indexOf(record), 0, value); + if (!_.contains(self.dataset.ids, value)) { + // add record to dataset if not already in (added by + // the form view?) + self.dataset.ids.splice( + self.records.indexOf(record), 0, value); + } // Set id on new record $row = self.$current.children('[data-id=false]'); } else { From e9921d62df5c7811aeaa83225b6e5a1877ca4df0 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 9 Jul 2012 13:01:12 +0200 Subject: [PATCH 094/168] [FIX] ensures the o2m is correctly saved before activating action buttons, even when a row is being edited bzr revid: xmo@openerp.com-20120709110112-dgpm1jhb9o2lmweg --- addons/web/static/src/js/view_form.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 2620694b74b..14fa87e5be5 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3243,11 +3243,17 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ readonly: self.o2m.get("effective_readonly") }); }, - do_button_action: function (name, id, callback) { - var _super = _.bind(this._super, this); - - this.o2m.view.do_save().then(function () { - _super(name, id, callback); + /** + * Ensures the o2m is saved and committed to db before returning: executes + * the super-method (saves the current edition to the buffered dataset) + * then saves the parent form. + * + * @returns {jQuery.Deferred} + */ + ensureSaved: function () { + var parent_form = this.o2m.view; + return this._super().pipe(function () { + return parent_form.do_save(); }); } }); From 46e511d1f25f01da02db6fe1b8f2bcc73b44099e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 9 Jul 2012 13:04:26 +0200 Subject: [PATCH 095/168] [FIX] o2m validation workflow for lists, to match new edition methods bzr revid: xmo@openerp.com-20120709110426-w6v512ff5dskmr3x --- addons/web/static/src/js/view_form.js | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 14fa87e5be5..93c6ea103cc 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3156,11 +3156,8 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ })); }, is_valid: function () { - var form; - // A list not being edited is always valid - if (!(form = this.first_edition_form())) { - return true; - } + var form = this.editor.form; + // If the form has not been modified, the view can only be valid // NB: is_dirty will also be set on defaults/onchanges/whatever? // oe_form_dirty seems to only be set on actual user actions @@ -3171,25 +3168,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ // Otherwise validate internal form return _(form.fields).chain() .invoke(function () { - this._check_css_flag(); + this._check_css_flags(); return this.is_valid(); }) .all(_.identity) .value(); }, - first_edition_form: function () { - var get_form = function (group_or_list) { - if (group_or_list.edition) { - return group_or_list.edition_form; - } - return _(group_or_list.children).chain() - .map(get_form) - .compact() - .first() - .value(); - }; - return get_form(this.groups); - }, do_add_record: function () { if (this.options.editable) { this._super.apply(this, arguments); From 9568c463b3444db0bb3633e826c7a039f7e38802 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jul 2012 09:39:28 +0200 Subject: [PATCH 096/168] [FIX] conflicts between save-on-blur and action buttons in o2m bzr revid: xmo@openerp.com-20120710073928-riswpz7f9mddqjgf --- addons/web/static/src/js/view_form.js | 96 +++++++++---------- addons/web/static/src/js/view_list.js | 13 +++ .../web/static/src/js/view_list_editable.js | 16 +++- 3 files changed, 70 insertions(+), 55 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 93c6ea103cc..bb020f8db49 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3105,6 +3105,7 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({ form: 'instance.web.form.One2ManyFormView', kanban: 'instance.web.form.One2ManyKanbanView', }); + this.__ignore_blur = false; }, switch_view: function(mode, unused) { if (mode !== 'form') { @@ -3154,6 +3155,15 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ this._super(parent, dataset, view_id, _.extend(options || {}, { ListType: instance.web.form.One2ManyList })); + this.on('edit:before', this, this.proxy('_beforeEdit')); + this.on('save:before cancel:before', this, this.proxy('_beforeUnEdit')); + }, + start: function () { + var ret = this._super(); + this.$element + .off('mousedown.handleButtons') + .on('mousedown.handleButtons', 'table button', this.proxy('_buttonDown')); + return ret; }, is_valid: function () { var form = this.editor.form; @@ -3227,62 +3237,46 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ readonly: self.o2m.get("effective_readonly") }); }, - /** - * Ensures the o2m is saved and committed to db before returning: executes - * the super-method (saves the current edition to the buffered dataset) - * then saves the parent form. - * - * @returns {jQuery.Deferred} - */ - ensureSaved: function () { + do_button_action: function () { var parent_form = this.o2m.view; - return this._super().pipe(function () { + var self = this, args = arguments; + return this.ensureSaved().pipe(function () { return parent_form.do_save(); - }); - } -}); -instance.web.form.One2ManyList = instance.web.ListView.List.extend({ - KEY_RETURN: 13, - // blurring caused by hitting the [Return] key, should skip the - // autosave-on-blur and let the handler for [Return] do its thing - __return_blur: false, - render_row_as_form: function () { - var self = this; - return this._super.apply(this, arguments).then(function () { - // Replace the "Save Row" button with "Cancel Edition" - self.edition_form.$element - .undelegate('button.oe-edit-row-save', 'click') - .delegate('button.oe-edit-row-save', 'click', function () { - self.cancel_pending_edition(); - }); - - // Overload execute_action on the edition form to perform a simple - // reload_record after the action is done, rather than fully - // reload the parent view (or something) - var _execute_action = self.edition_form.do_execute_action; - self.edition_form.do_execute_action = function (action, dataset, record_id, _callback) { - return _execute_action.call(this, action, dataset, record_id, function () { - self.view.reload_record( - self.view.records.get(record_id)); - }); - }; - - self.edition_form.on('blurred', null, function () { - if (self.__return_blur) { - delete self.__return_blur; - return; - } - if (!self.edition_form.widget_is_stopped) { - self.view.ensureSaved(); - } - }); + }).then(function () { + self.handleButton.apply(self, args); }); }, - on_row_keyup: function (e) { - if (e.which === this.KEY_RETURN) { - this.__return_blur = true; + + _beforeEdit: function () { + this.__ignore_blur = false; + this.editor.form.on('blurred', this, this._onFormBlur); + }, + _beforeUnEdit: function () { + this.editor.form.off('blurred', this, this._onFormBlur); + }, + _buttonDown: function () { + // If a button is clicked (usually some sort of action button), it's + // the button's responsibility to ensure the editable list is in the + // correct state -> ignore form blurring + this.__ignore_blur = true; + }, + /** + * Handles blurring of the nested form (saves the currently edited row), + * unless the flag to ignore the event is set to ``true`` + */ + _onFormBlur: function () { + if (this.__ignore_blur) { + this.__ignore_blur = false; + return; } - this._super(e); + this.saveEdition(); + }, + keyup_ENTER: function () { + // blurring caused by hitting the [Return] key, should skip the + // autosave-on-blur and let the handler for [Return] do its thing (save + // the current row *anyway*, then create a new one/edit the next one) + this.__ignore_blur = true; + this._super.apply(this, arguments); } }); diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index f25164d56e5..7c82d2b173f 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -661,6 +661,19 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi * @param {Function} callback should be called after the action is executed, if non-null */ do_button_action: function (name, id, callback) { + this.handleButton(name, id, callback); + }, + /** + * Base handling of buttons, can be called when overriding do_button_action + * in order to bypass parent overrides. + * + * This method should not be overridden. + * + * @param {String} name action name + * @param {Object} id id of the record the action should be called on + * @param {Function} callback should be called after the action is executed, if non-null + */ + handleButton: function (name, id, callback) { var action = _.detect(this.columns, function (field) { return field.name === name; }); diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index e66fdc1c917..f759c274287 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -12,7 +12,7 @@ openerp.web.list_editable = function (instance) { var self = this; this._super.apply(this, arguments); - this.editor = new instance.web.list.Editor(this); + this.editor = this.makeEditor(); $(this.groups).bind({ 'edit': function (e, id, dataset) { @@ -87,7 +87,7 @@ openerp.web.list_editable = function (instance) { if (this.options.editable) { // Editor is not restartable due to formview not being // restartable - this.editor = new instance.web.list.Editor(this); + this.editor = this.makeEditor(); var editor_ready = this.editor.prependTo(this.$element) .then(this.proxy('setupEvents')); @@ -96,10 +96,18 @@ openerp.web.list_editable = function (instance) { return result; }, + /** + * Builds a new editor object + * + * @return {instance.web.list.Editor} + */ + makeEditor: function () { + return new instance.web.list.Editor(this); + }, do_button_action: function () { - var self = this, _super = this._super, args = arguments; + var self = this, args = arguments; this.ensureSaved().then(function () { - _super.apply(self, args); + self.handleButton.apply(self, args); }); }, /** From 611fc6cc4f8a18dbe1eaf6df258e2a8d2a9a75ad Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jul 2012 12:35:57 +0200 Subject: [PATCH 097/168] [FIX] handling of resize event during edition so form fields don't get all fubar bzr revid: xmo@openerp.com-20120710103557-584hsyats0fdzpo1 --- .../web/static/src/js/view_list_editable.js | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index f759c274287..1fb99966eeb 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -13,6 +13,10 @@ openerp.web.list_editable = function (instance) { this._super.apply(this, arguments); this.editor = this.makeEditor(); + // Stores records of {field, cell}, allows for re-rendering fields + // depending on cell state during and after resize events + this.fields_for_resize = []; + instance.web.bus.on('resize', this, this.resizeFields); $(this.groups).bind({ 'edit': function (e, id, dataset) { @@ -27,6 +31,10 @@ openerp.web.list_editable = function (instance) { } }) }, + destroy: function () { + instance.web.bus.off('resize', this, this.resizeFields); + this._super(); + }, /** * Handles the activation of a record in editable mode (making a record * editable), called *after* the record has become editable. @@ -146,6 +154,7 @@ openerp.web.list_editable = function (instance) { var cells = this.getCellsFor($recordRow); return this.ensureSaved().pipe(function () { + self.fields_for_resize.splice(0, self.fields_for_resize.length); return self.withEvent('edit', { record: record.attributes, cancel: false @@ -158,17 +167,11 @@ openerp.web.list_editable = function (instance) { field.set({invisible: true}); return; } - var $cell = $(cell); - var position = $cell.position(); - field.$element.css({ - top: position.top, - left: position.left, - width: $cell.outerWidth(), - minHeight: $cell.outerHeight() - }); + self.fields_for_resize.push({field: field, cell: cell}); }).pipe(function () { $recordRow.addClass('oe_edition'); + self.resizeFields(); return record.attributes; }); }); @@ -181,6 +184,35 @@ openerp.web.list_editable = function (instance) { }); return cells; }, + /** + * If currently editing a row, resizes all registered form fields based + * on the corresponding row cell + */ + resizeFields: function () { + if (!this.editor.isEditing()) { return; } + for(var i=0, len=this.fields_for_resize.length; i Date: Tue, 10 Jul 2012 14:37:18 +0200 Subject: [PATCH 098/168] [ADD] successor method to list collections, to safely get the "next" record in a nested (groupby) context bzr revid: xmo@openerp.com-20120710123718-kiot6zzji07a4iao --- addons/web/static/src/js/view_list.js | 31 +++++++++-- .../web/static/src/js/view_list_editable.js | 8 +-- addons/web/static/test/list-utils.js | 51 ++++++++++++++++--- 3 files changed, 71 insertions(+), 19 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 7c82d2b173f..2d1a06173cd 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1849,7 +1849,7 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ * @returns this */ remove: function (record) { - var index = _(this.records).indexOf(record); + var index = this.indexOf(record); if (index === -1) { _(this._proxies).each(function (proxy) { proxy.remove(record); @@ -1885,12 +1885,14 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ // underscore-type methods find: function (callback) { - var record = null; + var record; for(var section in this._proxies) { - if (this._proxies.hasOwnProperty(section)) { - record = this._proxies[section].find(callback); + if (!this._proxies.hasOwnProperty(section)) { + continue + } + if ((record = this._proxies[section].find(callback))) { + return record; } - if (record) { return record; } } for(var i=0; i Date: Tue, 10 Jul 2012 15:12:05 +0200 Subject: [PATCH 099/168] [ADD] Collection#pred as well, while we're at it bzr revid: xmo@openerp.com-20120710131205-voi1nc5rkvewjr2f --- addons/web/static/src/js/view_list.js | 23 ++++++++++++++- addons/web/static/test/list-utils.js | 41 +++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 2d1a06173cd..27b39a40b22 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1931,7 +1931,7 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ var result; for(var section in this._proxies) { if (!this._proxies.hasOwnProperty(section)) { - continue + continue; } if ((result = this._proxies[section].succ(record, options))) { return result; @@ -1944,6 +1944,27 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ return this.at(0); } return this.at(next_index); + }, + pred: function (record, options) { + options = options || {wraparound: false}; + + var result; + for (var section in this._proxies) { + if (!this._proxies.hasOwnProperty(section)) { + continue; + } + if ((result = this._proxies[section].pred(record, options))) { + return result; + } + } + + var index = this.indexOf(record); + if (index === -1) { return null; } + var next_index = index - 1; + if (options.wraparound && (next_index === -1)) { + return this.at(this.length - 1); + } + return this.at(next_index); } }); Collection.include(Events); diff --git a/addons/web/static/test/list-utils.js b/addons/web/static/test/list-utils.js index 18069943b2d..baec728528e 100644 --- a/addons/web/static/test/list-utils.js +++ b/addons/web/static/test/list-utils.js @@ -278,6 +278,9 @@ $(document).ready(function () { root.at(0).attributes, "should return index 0 as successor to last record if" + " wraparound is set"); + deepEqual(root.succ(root.at(2), {wraparound: true}).attributes, + root.at(3).attributes, + "wraparound should have no effect if not succ(last_record)"); }); test('successor', function () { var root = new openerp.web.list.Collection(); @@ -295,6 +298,44 @@ $(document).ready(function () { root.get(3).attributes, "should wraparound within a collection"); }); + test('degenerate-predecessor', function () { + var root = new openerp.web.list.Collection([ + {id: 1, value: 1}, + {id: 2, value: 2}, + {id: 3, value: 3}, + {id: 4, value: 5}, + {id: 5, value: 8}, + ]); + + deepEqual(root.pred(root.at(2)).attributes, + root.at(1).attributes, + "should return the record at (index - 1) from the pivot"); + equal(root.pred(root.at(0)), null, + "should return null as predecessor to first record"); + deepEqual(root.pred(root.at(0), {wraparound: true}).attributes, + root.at(4).attributes, + "should return last record as predecessor to first record" + + " if wraparound is set"); + deepEqual(root.pred(root.at(1), {wraparound: true}).attributes, + root.at(0).attributes, + "wraparound should have no effect if not pred(first_record)"); + }); + test('predecessor', function () { + var root = new openerp.web.list.Collection(); + root.proxy('first').add([{id: 1, value: 1}, {id: 2, value: 2}]); + root.proxy('second').add([{id: 3, value: 3}, {id: 4, value: 5}]); + root.proxy('third').add([{id: 5, value: 8}, {id: 6, value: 13}]); + + deepEqual(root.pred(root.get(4)).attributes, + root.get(3).attributes, + "should get predecessor"); + equal(root.pred(root.get(3)), + null, + "predecessor do not cross collections"); + deepEqual(root.pred(root.get(3), {wraparound: true}).attributes, + root.get(4).attributes, + "should wraparound within a collection"); + }); module('list-hofs', { setup: function () { From 46da3547cabfeb8e8ab3c501f2049c2046a9bcb3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jul 2012 16:32:28 +0200 Subject: [PATCH 100/168] [IMP] move saving a row from per-row buttons to a single global button replacing [Create] bzr revid: xmo@openerp.com-20120710143228-mqfuaxw894x9khkc --- addons/web/static/src/css/base.css | 23 +++++------ addons/web/static/src/css/base.sass | 15 +++++--- addons/web/static/src/js/view_list.js | 2 +- .../web/static/src/js/view_list_editable.js | 38 +++++++------------ addons/web/static/src/xml/base.xml | 13 ++++--- 5 files changed, 41 insertions(+), 50 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 6061113642a..8a2020cba47 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1999,6 +1999,15 @@ .openerp .oe_form .oe_form_field_many2many > .oe-listview .oe_list_pager_single_page { display: none; } +.openerp .oe_list_buttons .oe_list_save { + display: none; +} +.openerp .oe_list_buttons.oe_editing .oe_list_add, .openerp .oe_list_buttons.oe_editing .oe_alternative { + display: none; +} +.openerp .oe_list_buttons.oe_editing .oe_list_save { + display: inline-block; +} .openerp .oe-listview { position: relative; } @@ -2115,20 +2124,6 @@ .openerp .oe-listview-content .numeric input { text-align: right; } -.openerp .oe-listview-content tr.oe_edition th.oe-record-selector { - padding: 0 6px; - font-size: 1px; - letter-spacing: -1px; - color: transparent; -} -.openerp .oe-listview-content tr.oe_edition th.oe-record-selector:before { - font: 21px "mnmliconsRegular"; - content: "S"; - color: #404040; -} -.openerp .oe-listview-content tr.oe_edition th.oe-record-selector input { - display: none; -} .openerp .oe_trad_field.touched { border: 1px solid green !important; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index a55d1155859..9377c11e2c2 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1587,6 +1587,15 @@ $colour4: #8a89ba display: none // }}} // ListView {{{ + .oe_list_buttons + .oe_list_save + display: none + &.oe_editing + .oe_list_add, .oe_alternative + display: none + .oe_list_save + display: inline-block + .oe-listview position: relative .oe_form .oe_form_field @@ -1666,12 +1675,6 @@ $colour4: #8a89ba width: 82px input text-align: right - - tr.oe_edition th.oe-record-selector - padding: 0 6px - @include text-to-icon("S") - input - display: none // }}} // Translation {{{ .oe_trad_field.touched diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 27b39a40b22..aa7ffdb66d4 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -285,7 +285,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi } this.$buttons.find('.oe_list_add') .click(this.proxy('do_add_record')) - .prop('disabled', grouped && this.options.editable); + .prop('disabled', grouped); this.$buttons.on('click', '.oe_list_button_import', function() { self.on_sidebar_import(); return false; diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 61ee6698452..7bc12b325fc 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -29,7 +29,14 @@ openerp.web.list_editable = function (instance) { self.configure_pager(self.dataset); self.compute_aggregates(); } - }) + }); + + this.on('edit:after', this, function () { + self.$element.add(self.$buttons).addClass('oe_editing'); + }); + this.on('save:after cancel:after', this, function () { + self.$element.add(self.$buttons).removeClass('oe_editing'); + }); }, destroy: function () { instance.web.bus.off('resize', this, this.resizeFields); @@ -93,6 +100,10 @@ openerp.web.list_editable = function (instance) { this.options.editable = ! this.options.read_only && (data.arch.attrs.editable || this.options.editable); var result = this._super(data, grouped); if (this.options.editable) { + // FIXME: any hook available to ensure this is only done once? + this.$buttons + .off('click', 'button.oe_list_save') + .on('click', 'button.oe_list_save', this.proxy('saveEdition')); // Editor is not restartable due to formview not being // restartable this.editor = this.makeEditor(); @@ -498,33 +509,12 @@ openerp.web.list_editable = function (instance) { }); instance.web.ListView.List.include(/** @lends instance.web.ListView.List# */{ - init: function () { - var self = this; - this._super.apply(this, arguments); - var selection_handler = _.find(this.$_element.data('events').click, function (h) { - return h.selector === 'th.oe-record-selector'; - }).handler; - // TODO: cleaner way to do that? - this.$_element - .off('click', 'th.oe-record-selector') - .on('click', '.oe_edition th.oe-record-selector', function (e) { - e.stopImmediatePropagation(); - self.view.saveEdition(); - }) - .on('click', 'th.oe-record-selector', selection_handler); - }, row_clicked: function (event) { if (!this.options.editable) { return this._super.apply(this, arguments); } - this.edit_record($(event.currentTarget).data('id')); - }, - /** - * Edits record currently selected via dataset - */ - edit_record: function (record_id) { - return this.view.startEdition( - record_id ? this.records.get(record_id) : null); + var record_id = $(event.currentTarget).data('id'); + this.view.startEdition(record_id ? this.records.get(record_id) : null); }, /** * If a row mapping to the record (@data-id matching the record's id or diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 66a1c02e448..ec5f9c6d9de 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -619,7 +619,9 @@ - or Import + + or Import + @@ -663,10 +665,11 @@
    - - + + + + From 52723ef0525d2044c3df7f0359b601fd9326394a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jul 2012 16:33:23 +0200 Subject: [PATCH 101/168] [FIX] monkey around keyboard handling to ensure we don't cancel a cancelled edition or any other such thing. maybe the form should be explicitly blurred when saved/cancelled? bzr revid: xmo@openerp.com-20120710143323-fye927s9k455mqls --- addons/web/static/src/js/view_list_editable.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 7bc12b325fc..b225af4cb0c 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -365,6 +365,7 @@ openerp.web.list_editable = function (instance) { }); }, keyup_ENTER: function () { + if (!this.editor.isEditing()) { return; } var self = this; return this.saveEdition().pipe(function (saveInfo) { if (saveInfo.created) { @@ -375,6 +376,7 @@ openerp.web.list_editable = function (instance) { }); }, keyup_ESCAPE: function () { + if (!this.editor.isEditing()) { return; } return this.cancelEdition(); } }); From e0a62b4bed7b1c883650859d87af84aff021f51b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 10:11:16 +0200 Subject: [PATCH 102/168] [FIX] modifiers handling in list view, add class for readonly fields bzr revid: xmo@openerp.com-20120711081116-ao854p4ebsgyelp3 --- addons/web/static/src/js/view_list.js | 23 ++++++++++++++++------- addons/web/static/src/xml/base.xml | 7 ++++--- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index aa7ffdb66d4..6a364d65f81 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -405,20 +405,27 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi if (column.modifiers) { var modifiers = JSON.parse(column.modifiers); column.modifiers_for = function (fields) { - if (!modifiers.invisible) { - return {}; + var out = {}; + + for (var attr in modifiers) { + if (!modifiers.hasOwnProperty(attr)) { continue; } + var modifier = modifiers[attr]; + out[attr] = _.isBoolean(modifier) + ? modifier + : domain_computer(modifier, fields); } - return { - 'invisible': domain_computer(modifiers.invisible, fields) - }; + + return out; }; if (modifiers['tree_invisible']) { column.invisible = '1'; } else { delete column.invisible; } + column.modifiers = modifiers; } else { column.modifiers_for = noop; + column.modifiers = {}; } return column; }; @@ -430,10 +437,12 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi if (grouped) { this.columns.unshift({ id: '_group', tag: '', string: _t("Group"), meta: true, - modifiers_for: function () { return {}; } + modifiers_for: function () { return {}; }, + modifiers: {} }, { id: '_count', tag: '', string: '#', meta: true, - modifiers_for: function () { return {}; } + modifiers_for: function () { return {}; }, + modifiers: {} }); } diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index ec5f9c6d9de..1a8c420fa18 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -641,6 +641,7 @@ + From af5cd045f29ac3b7b696f8a19d87d32318d00cc1 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 10:59:26 +0200 Subject: [PATCH 103/168] [DOC] doc bzr revid: xmo@openerp.com-20120711085926-dnsdnqmrd1tvl2oo --- doc/list-view.rst | 129 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 5 deletions(-) diff --git a/doc/list-view.rst b/doc/list-view.rst index 28f22ab7ad4..9e21fa38791 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -1,6 +1,79 @@ List View ========= +Style Hooks +----------- + +The list view provides a few style hook classes for re-styling of list views in +various situations: + +``.oe-listview`` + + The root element of the list view, styling rules should be rooted + on that class. + +``table.oe-listview-content`` + + The root table for the listview, accessory components may be + generated or added outside this section, this is the list view + "proper". + +``.oe_list_buttons`` + + The action buttons array for the list view, with its sub-elements + + ``.oe_list_add`` + + The default "Create"/"Add" button of the list view + + ``.oe_alternative`` + + The "alternative choice" for the list view, by default text + along the lines of "or import" with a link. + +``.oe-field-cell`` + + The cell (``td``) for a given field of the list view, cells which + are *not* fields (e.g. name of a group, or number of items in a + group) will not have this class. The field cell can be further + specified: + + ``.oe_number`` + + Numeric cell types (integer and float) + + ``.oe-button`` + + Action button (``button`` tag in the view) inside the cell + + ``.oe_readonly`` + + Readonly field cell + +``.oe-record-selector`` + + Selector cells + +Editable list view +++++++++++++++++++ + +The editable list view module adds a few supplementary style hook +classes, for edition situations: + +``.oe_editing`` + + Added to both ``.oe-listview`` and ``.oe_list_button`` (as the + buttons may be outside of the list view) when a row of the list is + currently being edited. + +``tr.oe_edition`` + + Class set on the row being edited itself. Note that the edition + form is *not* contained within the row, this allows for styling or + modifying the row while it's being edited separately. Mostly for + fields which can not be edited (e.g. read-only fields). + + Editable list view ------------------ @@ -30,7 +103,7 @@ view. ``options.read_only`` - worthless shit added by niv in the listview directly (wtf?) + force options.editable to false, or something? .. note:: can probably be replaced by cancelling ``edit:before`` @@ -172,6 +245,20 @@ view provides a number of dedicated events to its lifecycle. Invoked after a pending edition has been cancelled. +DOM events +++++++++++ + +The list view has grown hooks for the ``keyup`` event on its edition +form (during edition): any such event bubbling out of the edition form +will be forwarded to a method ``keyup_EVENTNAME``, where ``EVENTNAME`` +is the name of the key in ``$.ui.keyCode``. + +The method will also get the event object (originally passed to the +``keyup`` handler) as its sole parameter. + +The base editable list view has handlers for the ``ENTER`` and +``ESCAPE`` keys. + Editor ------ @@ -299,8 +386,40 @@ Changes from 6.1 :js:class:`~openerp.web.ListView.List` for editability has been drastically simplified, and most of the behavior has been moved to the list view itself. Only - :js:function:`~openerp.web.ListView.List.edit_record` remains from - the methods previously added, and only - :js:function:`~openerp.web.ListView.List.row_clicked` and - :js:function:`~openerp.web.ListView.List.init` are still + :js:func:`~openerp.web.ListView.List.row_clicked` is still overridden. + + * A new method ``getRowFor(record) -> jQuery(tr) | null`` has been + added to both ListView.List and ListView.Group, it can be called + from the list view to get the table row matching a record (if such + a row exists). + +* ``ListView#ensure_saved`` has been re-capitalized to + :js:func:`~openerp.web.ListView.ensureSaved` + +* :js:func:`~openerp.web.ListView.do_button_action`'s core behavior + has been split away to + :js:func:`~openerp.web.ListView.handleButton`. This allows bypassing + overrides of :js:func:`~openerp.web.ListView.do_button_action` in a + parent class. + + Ideally, :js:func:`~openerp.web.ListView.handleButton` should not be + overridden. + +* Modifiers handling has been improved (all modifiers information + should now be available through :js:func:`~Column.modifiers_for`, + not just ``invisible``) + +* Changed some handling of the list view's record: a record may now + have no id, and the listview will handle that correctly (for new + records being created) as well as correctly handle the ``id`` being + set. + +* Extended the internal collections structure of the list view with + `#find`_, `#succ`_ and `#pred`_. + +.. _#find: http://underscorejs.org/#find + +.. _#succ: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:succ + +.. _#pred: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:pred From c0e9d320f3b4fc53f914cd4af90d834f16aadfae Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 12:17:40 +0200 Subject: [PATCH 104/168] [ADD] one more styling hook for the exact type of the field rendered in the cell bzr revid: xmo@openerp.com-20120711101740-8po45qujkny5gk6a --- addons/web/static/src/xml/base.xml | 2 +- doc/list-view.rst | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 1a8c420fa18..8eee2bcc6bb 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -656,7 +656,7 @@ diff --git a/doc/list-view.rst b/doc/list-view.rst index 9e21fa38791..475d5678b79 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -50,6 +50,12 @@ various situations: Readonly field cell + ``.oe_list_field_$type`` + + Additional class for the precise type of the cell, ``$type`` + is the field's @widget if there is one, otherwise it's the + field's type. + ``.oe-record-selector`` Selector cells From 3efc9c033a7f9b2a1d032951785ff5a94ecdbe6c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 13:10:27 +0200 Subject: [PATCH 105/168] [ADD] create new record when clicking on an empty row bzr revid: xmo@openerp.com-20120711111027-6vtyoxx17fw8dmvc --- addons/web/static/src/js/view_list.js | 2 +- addons/web/static/src/js/view_list_editable.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 6a364d65f81..92b633bf54d 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1006,9 +1006,9 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. e.stopPropagation(); }) .delegate('tr', 'click', function (e) { - e.stopPropagation(); var row_id = self.row_id(e.currentTarget); if (row_id !== undefined) { + e.stopPropagation(); if (!self.dataset.select_id(row_id)) { throw "Could not find id in dataset" } diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index b225af4cb0c..cbcd74cc31c 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -104,6 +104,13 @@ openerp.web.list_editable = function (instance) { this.$buttons .off('click', 'button.oe_list_save') .on('click', 'button.oe_list_save', this.proxy('saveEdition')); + this.$element + .off('click', 'tbody tr') + .on('click', 'tbody tr', function () { + if (!self.editor.isEditing()) { + self.startEdition(); + } + }); // Editor is not restartable due to formview not being // restartable this.editor = this.makeEditor(); From cd02216c28a0530f3d56369566645a6dbaefcfe4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 14:24:24 +0200 Subject: [PATCH 106/168] [FIX] selector for edit-on-click-on-empty-row bzr revid: xmo@openerp.com-20120711122424-355c6ed4vnmrr69n --- addons/web/static/src/js/view_list_editable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index cbcd74cc31c..a78b0fbef97 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -105,8 +105,8 @@ openerp.web.list_editable = function (instance) { .off('click', 'button.oe_list_save') .on('click', 'button.oe_list_save', this.proxy('saveEdition')); this.$element - .off('click', 'tbody tr') - .on('click', 'tbody tr', function () { + .off('click', 'tbody td:not(.oe_list_field_cell)') + .on('click', 'tbody td:not(.oe_list_field_cell)', function () { if (!self.editor.isEditing()) { self.startEdition(); } From 9b570343a52669fb5206fdb58051d1f4febc031f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 15:18:04 +0200 Subject: [PATCH 107/168] [FIX] handling of clicking on a row for a record being created (and not existing yet) bzr revid: xmo@openerp.com-20120711131804-u8l2taeq2k1gc5v0 --- addons/web/static/src/js/view_list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 4d2d1b4245f..2bbb9e87866 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1013,10 +1013,10 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. }) .delegate('tr', 'click', function (e) { var row_id = self.row_id(e.currentTarget); - if (row_id !== undefined) { + if (row_id) { e.stopPropagation(); if (!self.dataset.select_id(row_id)) { - throw "Could not find id in dataset" + throw new Error("Could not find id in dataset"); } self.row_clicked(e); } From 6b907bb4d0421bc1c408846dec7c2a57a778cca6 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 16:14:02 +0200 Subject: [PATCH 108/168] [FIX] can't perform action on a o2m record which is not saved in db, so forbid it. Also yet-another-shitty-undoc-change to the way widgets and form view communicate bzr revid: xmo@openerp.com-20120711141402-1x7frd0v3vc3649e --- addons/web/static/src/js/view_form.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 0211b934a4e..e6e78a46ab8 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3196,6 +3196,11 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ })); this.on('edit:before', this, this.proxy('_beforeEdit')); this.on('save:before cancel:before', this, this.proxy('_beforeUnEdit')); + + this.records + .bind('add', this.proxy("changedRecords")) + .bind('edit', this.proxy("changedRecords")) + .bind('remove', this.proxy("changedRecords")); }, start: function () { var ret = this._super(); @@ -3204,6 +3209,9 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ .on('mousedown.handleButtons', 'table button', this.proxy('_buttonDown')); return ret; }, + changedRecords: function () { + this.o2m.trigger_on_change(); + }, is_valid: function () { var form = this.editor.form; @@ -3276,13 +3284,19 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ readonly: self.o2m.get("effective_readonly") }); }, - do_button_action: function () { + do_button_action: function (name, id, callback) { + if (!_.isNumber(id)) { + instance.webclient.notification.warn( + _t("Action Button"), + _t("The o2m record must be saved before an action can be used")); + return; + } var parent_form = this.o2m.view; - var self = this, args = arguments; - return this.ensureSaved().pipe(function () { + var self = this; + this.ensureSaved().pipe(function () { return parent_form.do_save(); }).then(function () { - self.handleButton.apply(self, args); + self.handleButton(name, id, callback); }); }, From 16559cd6aed2867a4d45621e2ccff0644957c06c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 16:20:48 +0200 Subject: [PATCH 109/168] [ADD] discard 'link-ish' to editable list view bzr revid: xmo@openerp.com-20120711142048-covvchmiscjlhji0 --- addons/web/static/src/css/base.css | 7 +++++-- addons/web/static/src/css/base.sass | 6 ++++-- addons/web/static/src/js/view_list_editable.js | 9 +++++++-- addons/web/static/src/xml/base.xml | 3 +++ 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 7ea01bf3bee..6e5c6117023 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -2179,15 +2179,18 @@ .openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page { display: none; } -.openerp .oe_list_buttons .oe_list_save { +.openerp .oe_list_buttons .oe_list_save, .openerp .oe_list_buttons .oe_list_discard { display: none; } -.openerp .oe_list_buttons.oe_editing .oe_list_add, .openerp .oe_list_buttons.oe_editing .oe_alternative { +.openerp .oe_list_buttons.oe_editing .oe_list_add, .openerp .oe_list_buttons.oe_editing .oe_list_button_import { display: none; } .openerp .oe_list_buttons.oe_editing .oe_list_save { display: inline-block; } +.openerp .oe_list_buttons.oe_editing .oe_list_discard { + display: inline; +} .openerp .oe_list { position: relative; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 0472aa34710..83153cc11d5 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1723,13 +1723,15 @@ $sheet-max-width: 860px // }}} // ListView {{{ .oe_list_buttons - .oe_list_save + .oe_list_save, .oe_list_discard display: none &.oe_editing - .oe_list_add, .oe_alternative + .oe_list_add, .oe_list_button_import display: none .oe_list_save display: inline-block + .oe_list_discard + display: inline .oe_list position: relative diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index a78b0fbef97..93b7d38e3bb 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -102,8 +102,13 @@ openerp.web.list_editable = function (instance) { if (this.options.editable) { // FIXME: any hook available to ensure this is only done once? this.$buttons - .off('click', 'button.oe_list_save') - .on('click', 'button.oe_list_save', this.proxy('saveEdition')); + .off('click', '.oe_list_save') + .on('click', '.oe_list_save', this.proxy('saveEdition')) + .off('click', '.oe_list_discard') + .on('click', '.oe_list_discard', function (e) { + e.preventDefault(); + self.cancelEdition(); + }); this.$element .off('click', 'tbody td:not(.oe_list_field_cell)') .on('click', 'tbody td:not(.oe_list_field_cell)', function () { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index a85e8817ad8..a9c8e15bcd7 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -671,6 +671,9 @@ + + discard + From ce11683e9240a56cf1ab3f27bf93c534528db9e6 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 16:26:04 +0200 Subject: [PATCH 110/168] [FIX] re-enable delete button for o2m list items bzr revid: xmo@openerp.com-20120711142604-9jw3kikvqje8reu6 --- addons/web/static/src/js/view_form.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index e6e78a46ab8..be30abe5aba 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2915,6 +2915,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ selectable: self.multi_selection, sortable: false, import_enabled: false, + deletable: true }); if (self.get("effective_readonly")) { _.extend(view.options, { From 8812a84ba825ff09153065cdd7e1a939d57d5f68 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 16:32:13 +0200 Subject: [PATCH 111/168] [FIX] don't let [Return] key hit in a text field bubble, or it validates editable list rows bzr revid: xmo@openerp.com-20120711143213-ug1u98evn6nxhi5r --- addons/web/static/src/js/view_form.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index be30abe5aba..d10990b1717 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2250,6 +2250,11 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we } else { this.$textarea.attr('disabled', 'disabled'); } + this.$element.keyup(function (e) { + if (e.which === $.ui.keyCode.ENTER) { + e.stopPropagation(); + } + }); this.setupFocus(this.$textarea); }, set_value: function(value_) { From 35b5732bba91544b99c63a2ef57c769758cd4f0c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 16:43:27 +0200 Subject: [PATCH 112/168] [IMP] keep 'save row' button hidden in o2m list bzr revid: xmo@openerp.com-20120711144327-gyhad79cmd730tb4 --- addons/web/static/src/css/base.css | 3 +++ addons/web/static/src/css/base.sass | 3 +++ 2 files changed, 6 insertions(+) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 6e5c6117023..2d27b380386 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -2176,6 +2176,9 @@ height: auto; line-height: 16px; } +.openerp .oe_form_field_one2many .oe_list_buttons.oe_editing .oe_list_save { + visibility: hidden; +} .openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page { display: none; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 83153cc11d5..52b28b7da4f 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1715,6 +1715,9 @@ $sheet-max-width: 860px li height: auto line-height: 16px + .oe_list_buttons.oe_editing .oe_list_save + // keep "save row" button hidden in o2m + visibility: hidden // }}} // FormView.many2many {{{ .oe_form .oe_form_field_many2many > .oe_list From 0bccd9be59b3cf258a9a2eea08c01a00992a0564 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 12 Jul 2012 13:55:52 +0200 Subject: [PATCH 113/168] [FIX] tests: update jquery link, fix broken searchview test following merge bzr revid: xmo@openerp.com-20120712115552-7adsu941o3wjtrmr --- addons/web/static/src/js/search.js | 1 + addons/web/static/test/search.js | 12 +++--------- addons/web/static/test/test.html | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index c8b6f797dba..504510ef133 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -1669,6 +1669,7 @@ instance.web.search.AddToDashboard = instance.web.Widget.extend({ return $.when(this.load_data(),this.data_loaded).pipe(this.proxy("render_data")); }, load_data:function(){ + if (!instance.webclient) { return $.Deferred().reject(); } var self = this,dashboard_menu = instance.webclient.menu.data.data.children; var ir_model_data = new instance.web.Model('ir.model.data',{},[['name','=','menu_reporting_dashboard']]).query(['res_id']); var map_data = function(result){ diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index 0b1ef7fa2b6..548eef612b5 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -1061,17 +1061,11 @@ $(document).ready(function () { module('saved_filters', { setup: function () { - instance = window.openerp.init([]); - window.openerp.web.corelib(instance); - window.openerp.web.coresetup(instance); - window.openerp.web.chrome(instance); - window.openerp.web.data(instance); - window.openerp.web.formats(instance); - window.openerp.web.search(instance); + instance = openerp.testing.instanceFor('search'); - instance.web.qweb.add_template(doc); + openerp.testing.loadTemplate(instance); - mockifyRPC(instance.connection); + openerp.testing.mockifyRPC(instance); } }); asyncTest('checkboxing', 6, function () { diff --git a/addons/web/static/test/test.html b/addons/web/static/test/test.html index 520a7106b5b..cab1586f240 100644 --- a/addons/web/static/test/test.html +++ b/addons/web/static/test/test.html @@ -13,7 +13,7 @@ - + From 0c872cf4694c25df89c9f6b24e32a08d475b393f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 12 Jul 2012 14:06:57 +0200 Subject: [PATCH 114/168] [FIX] trailing comma in array literal creates a single undefined element in IE8 bzr revid: xmo@openerp.com-20120712120657-14j2izo6idppq5aq --- addons/web/static/test/list-utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/test/list-utils.js b/addons/web/static/test/list-utils.js index baec728528e..6200ba788ce 100644 --- a/addons/web/static/test/list-utils.js +++ b/addons/web/static/test/list-utils.js @@ -266,7 +266,7 @@ $(document).ready(function () { {id: 2, value: 2}, {id: 3, value: 3}, {id: 4, value: 5}, - {id: 5, value: 8}, + {id: 5, value: 8} ]); deepEqual(root.succ(root.at(2)).attributes, @@ -304,7 +304,7 @@ $(document).ready(function () { {id: 2, value: 2}, {id: 3, value: 3}, {id: 4, value: 5}, - {id: 5, value: 8}, + {id: 5, value: 8} ]); deepEqual(root.pred(root.at(2)).attributes, From ea9963073295e4a752407a7955b5c5487a6f28bb Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Mon, 16 Jul 2012 11:22:20 +0530 Subject: [PATCH 115/168] [IMP] l10n_in: typo bzr revid: mra@tinyerp.com-20120716055220-m732ts6l1549mr5g --- addons/l10n_in/__openerp__.py | 2 +- addons/l10n_in/l10n_in_installer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/l10n_in/__openerp__.py b/addons/l10n_in/__openerp__.py index 526b38318b5..18bc42a80cc 100644 --- a/addons/l10n_in/__openerp__.py +++ b/addons/l10n_in/__openerp__.py @@ -20,7 +20,7 @@ ############################################################################## { - "name": "India - Accounting", + "name": "Indian - Accounting", "version": "1.0", "description": """ Indian Accounting : Chart of Account. diff --git a/addons/l10n_in/l10n_in_installer.py b/addons/l10n_in/l10n_in_installer.py index 0d2b4f665b6..0a15d034605 100644 --- a/addons/l10n_in/l10n_in_installer.py +++ b/addons/l10n_in/l10n_in_installer.py @@ -65,4 +65,4 @@ class l10n_installer(osv.osv_memory): return res -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file From edda972621f98d7f6436ee87101bf3c1fbae5a58 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Mon, 16 Jul 2012 11:38:12 +0530 Subject: [PATCH 116/168] [IMP] l10n_in: typo bzr revid: mra@tinyerp.com-20120716060812-dv6o6l2i3rw0vrmw --- addons/l10n_in/l10n_in_public_tax_template.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index 88f78121b22..55fa139d618 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -232,7 +232,7 @@ - Excise Duty-%2 + Excise Duty-2% 0.02 percent sale From 58ed2b3d3f229e18804154738b3e769d6c738804 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Mon, 16 Jul 2012 12:14:35 +0530 Subject: [PATCH 117/168] [FIX] l10n_in: Fixes for child tax bzr revid: mra@tinyerp.com-20120716064435-n60u5aszetiwa1ui --- .../l10n_in/l10n_in_private_tax_template.xml | 32 ++++++++++++++ .../l10n_in/l10n_in_public_tax_template.xml | 42 +++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index 6cb8933728c..d78dc2cbad4 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -186,6 +186,16 @@ percent sale + + + + 1 + + 1 + + 1 + + 1 @@ -194,6 +204,16 @@ 0.01 percent sale + + + + 1 + + 1 + + 1 + + 1 @@ -221,6 +241,12 @@ 0.02 percent all + + + + + + @@ -230,6 +256,12 @@ 0.01 percent all + + + + + + diff --git a/addons/l10n_in/l10n_in_public_tax_template.xml b/addons/l10n_in/l10n_in_public_tax_template.xml index 55fa139d618..03dbfa7cc75 100644 --- a/addons/l10n_in/l10n_in_public_tax_template.xml +++ b/addons/l10n_in/l10n_in_public_tax_template.xml @@ -193,6 +193,17 @@ Service Tax-%2 + + + + + 1 + + 1 + + 1 + + 1 0.02 percent all @@ -203,6 +214,17 @@ Service Tax-%1 0.01 + + + + + 1 + + 1 + + 1 + + 1 percent all @@ -236,6 +258,16 @@ 0.02 percent sale + + + + 1 + + 1 + + 1 + + 1 @@ -245,6 +277,16 @@ 0.01 percent sale + + + + 1 + + 1 + + 1 + + 1 From 75c2845fb5414a65a7366273eda3c1234d5d43b9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 16 Jul 2012 13:04:30 +0200 Subject: [PATCH 118/168] [ADD] default_get support on new row creation bzr revid: xmo@openerp.com-20120716110430-9uv352m46d3mn1bx --- addons/web/static/src/css/base.css | 13 +++ addons/web/static/src/css/base.sass | 13 +++ addons/web/static/src/js/view_form.js | 21 +++-- .../web/static/src/js/view_list_editable.js | 16 ++-- addons/web/static/test/list-editable.js | 89 +++++++++++++++++-- 5 files changed, 136 insertions(+), 16 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 2d27b380386..97d2fcf57a7 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -2382,6 +2382,19 @@ .kitten-mode-activated > * { opacity: 0.7; } +.kitten-mode-activated .oe_footer a { + background-image: url(http://www.risacher.com/la-rache/zfiles/la-rache.png); + font-size: 1px; + letter-spacing: -1px; + color: transparent; + display: inline-block; + height: 15px; + width: 80px; + vertical-align: top; +} +.kitten-mode-activated .oe_footer a span { + display: none; +} div.ui-widget-overlay { background: black; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 52b28b7da4f..c5197743acd 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1879,6 +1879,19 @@ $sheet-max-width: 860px background-attachment: fixed >* opacity: 0.70 + + .oe_footer a + background-image: url(http://www.risacher.com/la-rache/zfiles/la-rache.png) + font-size: 1px + letter-spacing: -1px + color: transparent + display: inline-block + height: 15px + width: 80px + vertical-align: top + + span + display: none // }}} div.ui-widget-overlay diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index d10990b1717..b090c1c18ec 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -336,6 +336,20 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.$element.add(self.$buttons).removeClass('oe_form_dirty'); }); }, + /** + * Loads and sets up the default values for the model as the current + * record + * + * @return {$.Deferred} + */ + load_defaults: function () { + var keys = _.keys(this.fields_view.fields); + if (keys.length) { + return this.dataset.default_get(keys) + .pipe(this.on_record_loaded); + } + return this.on_record_loaded({}); + }, on_form_changed: function() { this.trigger("view_content_has_changed"); }, @@ -608,12 +622,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.set({mode: "edit"}); return $.when(this.has_been_loaded).pipe(function() { if (self.can_be_discarded()) { - var keys = _.keys(self.fields_view.fields); - if (keys.length) { - return self.dataset.default_get(keys) - .pipe(self.on_record_loaded); - } - return self.on_record_loaded({}); + return self.load_defaults(); } }); }, diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 93b7d38e3bb..bad3f939db2 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -163,7 +163,10 @@ openerp.web.list_editable = function (instance) { */ startEdition: function (record) { var self = this; - if (!record) { + var item = false; + if (record) { + item = record.attributes; + } else { var attrs = {id: false}; _(this.columns).chain() .filter(function (x) { return x.tag === 'field'}) @@ -182,7 +185,7 @@ openerp.web.list_editable = function (instance) { record: record.attributes, cancel: false }, function () { - return self.editor.edit(record.attributes, function (field_name, field) { + return self.editor.edit(item, function (field_name, field) { var cell = cells[field_name]; if (!cell || field.get('effective_readonly')) { // Readonly fields can just remain the list's, form's @@ -466,11 +469,14 @@ openerp.web.list_editable = function (instance) { // TODO: specify sequence of edit calls var self = this; var form = self.form; - record = _.extend({}, record); - return form.on_record_loaded(record).pipe(function () { + var loaded = record + ? form.on_record_loaded(_.extend({}, record)) + : form.load_defaults(); + + return loaded.pipe(function () { return form.do_show({reload: false}); }).pipe(function () { - self.record = record; + self.record = form.datarecord; _(form.fields).each(function (field, name) { configureField(name, field); }); diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js index 5a03f263ffe..5b702c36f96 100644 --- a/addons/web/static/test/list-editable.js +++ b/addons/web/static/test/list-editable.js @@ -108,7 +108,7 @@ $(document).ready(function () { var counter = 0; e.appendTo($fix) .pipe(function () { - return e.edit(null, function () { + return e.edit({}, function () { ++counter; }); }) @@ -138,7 +138,7 @@ $(document).ready(function () { var counter = 0; e.appendTo($fix) .pipe(function () { - return e.edit(null, function () { + return e.edit({}, function () { ++counter; }); }) @@ -171,7 +171,7 @@ $(document).ready(function () { var warnings = 0; e.appendTo($fix) .pipe(function () { - return e.edit(null, function () { + return e.edit({}, function () { ++counter; }); }) @@ -186,6 +186,85 @@ $(document).ready(function () { }) }); + module('list-edition', { + setup: function () { + baseSetup(); + + var records = {}; + _.extend(instance.connection.responses, { + '/web/listview/load': function () { + return {result: { + type: 'tree', + fields: { + a: {type: 'char', string: "A"}, + b: {type: 'char', string: "B"}, + c: {type: 'char', string: "C"} + }, + arch: { + tag: 'tree', + attrs: {}, + children: [ + {tag: 'field', attrs: {name: 'a'}}, + {tag: 'field', attrs: {name: 'b'}}, + {tag: 'field', attrs: {name: 'c'}} + ] + } + }}; + }, + '/web/dataset/call_kw:create': function (params) { + records[42] = _.extend({}, params.params.args[0]); + return {result: 42}; + }, + '/web/dataset/call_kw:read': function (params) { + var id = params.params.args[0][0]; + if (id in records) { + return {result: [records[id]]}; + } + return {result: []}; + } + }) + } + }); + asyncTest('newrecord', 6, function () { + var got_defaults = false; + instance.connection.responses['/web/dataset/call_kw:default_get'] = function (params) { + var fields = params.params.args[0]; + deepEqual( + fields, ['a', 'b', 'c'], + "should ask defaults for all fields"); + got_defaults = true; + return {result: { + a: "qux", + b: "quux" + }}; + }; + + var ds = new instance.web.DataSetStatic(null, 'demo', null, [1]); + var l = new instance.web.ListView({}, ds); + l.set_editable(true); + + l.appendTo($fix) + .pipe(l.proxy('reload_content')) + .pipe(function () { + return l.startEdition(); + }) + .always(start) + .pipe(function () { + ok(got_defaults, "should have fetched default values for form"); + return l.saveEdition(); + }) + .pipe(function (result) { + ok(result.created, "should yield newly created record"); + equal(result.record.get('a'), "qux", + "should have used default values"); + equal(result.record.get('b'), "quux", + "should have used default values"); + ok(!result.record.get('c'), + "should have no value if there was no default"); + }) + .fail(function (e) { ok(false, e && e.message || e); }); + }); + module('list-edition-events', { setup: function () { baseSetup(); @@ -220,7 +299,7 @@ $(document).ready(function () { }); } }); - asyncTest('edition events', function () { + asyncTest('edition events', 4, function () { var ds = new instance.web.DataSetStatic(null, 'demo', null, [1]); var o = { counter: 0, @@ -235,7 +314,7 @@ $(document).ready(function () { .pipe(function () { ok(l.options.editable, "should be editable"); equal(o.counter, 0, "should have seen no event yet"); - return l.startEdition(); + return l.startEdition(l.records.get(1)); }) .pipe(function () { ok(l.editor.isEditing(), "should be editing"); From c3368bf2bbd779b1dd9e2bbc202cf85845803030 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 17 Jul 2012 15:02:51 +0200 Subject: [PATCH 119/168] [FIX] use native DOM methods to programmatically set focus on an element MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jQuery breaks the expected ordering of triggered consequential events to a focusing (a blur event on the source field, a focus event on the destination one), which in turn breaks the expectations of the auto-saving o2m, making the o2m field attempt to auto-save immediately after having saved a row (via the [Return] key) e.g. create a new row in a list o2m, press [Return], the widget creates a new empty row and immediately tries to save it resulting — depending on the view's setup — in either an empty row being saved or a bunch of fields being marked as invalid even though the user hasn't done anything yet. Bypass jquery to avoid this issue. jQuery tracker ref: http://bugs.jquery.com/ticket/12094 bzr revid: xmo@openerp.com-20120717130251-q2cjoj6rkxh0bvdq --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b090c1c18ec..98d50546c52 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1916,7 +1916,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w */ delay_focus: function($elem) { setTimeout(function() { - $elem.focus(); + $elem[0].focus(); }, 50); }, /** From 01e6e3ec079c3221d14903a4a6aa066e0b53dafb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 17 Jul 2012 15:23:08 +0200 Subject: [PATCH 120/168] [IMP] DOWNCASE ALL THE THINGS apparently and contrary to what I remembered, we're still supposed to use underscore_separated method names, not camelCase bzr revid: xmo@openerp.com-20120717132308-wvpldtprt33heee3 --- addons/web/static/src/js/view_form.js | 34 ++--- addons/web/static/src/js/view_list.js | 4 +- .../web/static/src/js/view_list_editable.js | 120 +++++++++--------- addons/web/static/test/list-editable.js | 36 +++--- doc/list-view.rst | 29 ++--- 5 files changed, 110 insertions(+), 113 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 98d50546c52..948b3a73913 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3122,7 +3122,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ } return res; } else if (this.viewmanager.active_view === "list") { - var res = $.when(view.ensureSaved()); + var res = $.when(view.ensure_saved()); if (!res.isResolved() && !res.isRejected()) { console.warn("Asynchronous get_value() is not supported in list view."); } @@ -3209,22 +3209,22 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ this._super(parent, dataset, view_id, _.extend(options || {}, { ListType: instance.web.form.One2ManyList })); - this.on('edit:before', this, this.proxy('_beforeEdit')); - this.on('save:before cancel:before', this, this.proxy('_beforeUnEdit')); + this.on('edit:before', this, this.proxy('_before_edit')); + this.on('save:before cancel:before', this, this.proxy('_before_unedit')); this.records - .bind('add', this.proxy("changedRecords")) - .bind('edit', this.proxy("changedRecords")) - .bind('remove', this.proxy("changedRecords")); + .bind('add', this.proxy("changed_records")) + .bind('edit', this.proxy("changed_records")) + .bind('remove', this.proxy("changed_records")); }, start: function () { var ret = this._super(); this.$element .off('mousedown.handleButtons') - .on('mousedown.handleButtons', 'table button', this.proxy('_buttonDown')); + .on('mousedown.handleButtons', 'table button', this.proxy('_button_down')); return ret; }, - changedRecords: function () { + changed_records: function () { this.o2m.trigger_on_change(); }, is_valid: function () { @@ -3308,21 +3308,21 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ } var parent_form = this.o2m.view; var self = this; - this.ensureSaved().pipe(function () { + this.ensure_saved().pipe(function () { return parent_form.do_save(); }).then(function () { - self.handleButton(name, id, callback); + self.handle_button(name, id, callback); }); }, - _beforeEdit: function () { + _before_edit: function () { this.__ignore_blur = false; - this.editor.form.on('blurred', this, this._onFormBlur); + this.editor.form.on('blurred', this, this._on_form_blur); }, - _beforeUnEdit: function () { - this.editor.form.off('blurred', this, this._onFormBlur); + _before_unedit: function () { + this.editor.form.off('blurred', this, this._on_form_blur); }, - _buttonDown: function () { + _button_down: function () { // If a button is clicked (usually some sort of action button), it's // the button's responsibility to ensure the editable list is in the // correct state -> ignore form blurring @@ -3332,12 +3332,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ * Handles blurring of the nested form (saves the currently edited row), * unless the flag to ignore the event is set to ``true`` */ - _onFormBlur: function () { + _on_form_blur: function () { if (this.__ignore_blur) { this.__ignore_blur = false; return; } - this.saveEdition(); + this.save_edition(); }, keyup_ENTER: function () { // blurring caused by hitting the [Return] key, should skip the diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 2bbb9e87866..82c9d1be12b 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -676,7 +676,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi * @param {Function} callback should be called after the action is executed, if non-null */ do_button_action: function (name, id, callback) { - this.handleButton(name, id, callback); + this.handle_button(name, id, callback); }, /** * Base handling of buttons, can be called when overriding do_button_action @@ -688,7 +688,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi * @param {Object} id id of the record the action should be called on * @param {Function} callback should be called after the action is executed, if non-null */ - handleButton: function (name, id, callback) { + handle_button: function (name, id, callback) { var action = _.detect(this.columns, function (field) { return field.name === name; }); diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index bad3f939db2..fa39329fc81 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -12,11 +12,11 @@ openerp.web.list_editable = function (instance) { var self = this; this._super.apply(this, arguments); - this.editor = this.makeEditor(); + this.editor = this.make_editor(); // Stores records of {field, cell}, allows for re-rendering fields // depending on cell state during and after resize events this.fields_for_resize = []; - instance.web.bus.on('resize', this, this.resizeFields); + instance.web.bus.on('resize', this, this.resize_fields); $(this.groups).bind({ 'edit': function (e, id, dataset) { @@ -39,7 +39,7 @@ openerp.web.list_editable = function (instance) { }); }, destroy: function () { - instance.web.bus.off('resize', this, this.resizeFields); + instance.web.bus.off('resize', this, this.resize_fields); this._super(); }, /** @@ -86,7 +86,7 @@ openerp.web.list_editable = function (instance) { if (this.options.editable) { this.$element.find('table:first').show(); this.$element.find('.oe_view_nocontent').remove(); - this.startEdition(); + this.start_edition(); } else { this._super(); } @@ -103,24 +103,24 @@ openerp.web.list_editable = function (instance) { // FIXME: any hook available to ensure this is only done once? this.$buttons .off('click', '.oe_list_save') - .on('click', '.oe_list_save', this.proxy('saveEdition')) + .on('click', '.oe_list_save', this.proxy('save_edition')) .off('click', '.oe_list_discard') .on('click', '.oe_list_discard', function (e) { e.preventDefault(); - self.cancelEdition(); + self.cancel_edition(); }); this.$element .off('click', 'tbody td:not(.oe_list_field_cell)') .on('click', 'tbody td:not(.oe_list_field_cell)', function () { - if (!self.editor.isEditing()) { - self.startEdition(); + if (!self.editor.is_editing()) { + self.start_edition(); } }); // Editor is not restartable due to formview not being // restartable - this.editor = this.makeEditor(); + this.editor = this.make_editor(); var editor_ready = this.editor.prependTo(this.$element) - .then(this.proxy('setupEvents')); + .then(this.proxy('setup_events')); return $.when(result, editor_ready); } @@ -132,13 +132,13 @@ openerp.web.list_editable = function (instance) { * * @return {instance.web.list.Editor} */ - makeEditor: function () { + make_editor: function () { return new instance.web.list.Editor(this); }, do_button_action: function () { var self = this, args = arguments; - this.ensureSaved().then(function () { - self.handleButton.apply(self, args); + this.ensure_saved().then(function () { + self.handle_button.apply(self, args); }); }, /** @@ -149,11 +149,11 @@ openerp.web.list_editable = function (instance) { * * @returns {$.Deferred} */ - ensureSaved: function () { - if (!this.editor.isEditing()) { + ensure_saved: function () { + if (!this.editor.is_editing()) { return $.when(); } - return this.saveEdition(); + return this.save_edition(); }, /** * Set up the edition of a record of the list view "inline" @@ -161,7 +161,7 @@ openerp.web.list_editable = function (instance) { * @param {instance.web.list.Record} [record] record to edit, leave empty to create a new record * @return {jQuery.Deferred} */ - startEdition: function (record) { + start_edition: function (record) { var self = this; var item = false; if (record) { @@ -174,14 +174,14 @@ openerp.web.list_editable = function (instance) { .each(function (field) { attrs[field] = false; }); record = new instance.web.list.Record(attrs); this.records.add(record, { - at: this.isPrependOnCreate() ? 0 : null}); + at: this.prepends_on_create() ? 0 : null}); } - var $recordRow = this.groups.getRowFor(record); - var cells = this.getCellsFor($recordRow); + var $recordRow = this.groups.get_row_for(record); + var cells = this.get_cells_for($recordRow); - return this.ensureSaved().pipe(function () { + return this.ensure_saved().pipe(function () { self.fields_for_resize.splice(0, self.fields_for_resize.length); - return self.withEvent('edit', { + return self.with_event('edit', { record: record.attributes, cancel: false }, function () { @@ -197,13 +197,13 @@ openerp.web.list_editable = function (instance) { self.fields_for_resize.push({field: field, cell: cell}); }).pipe(function () { $recordRow.addClass('oe_edition'); - self.resizeFields(); + self.resize_fields(); return record.attributes; }); }); }); }, - getCellsFor: function ($row) { + get_cells_for: function ($row) { var cells = {}; $row.children('td').each(function (index, el) { cells[el.getAttribute('data-field')] = el @@ -214,11 +214,11 @@ openerp.web.list_editable = function (instance) { * If currently editing a row, resizes all registered form fields based * on the corresponding row cell */ - resizeFields: function () { - if (!this.editor.isEditing()) { return; } + resize_fields: function () { + if (!this.editor.is_editing()) { return; } for(var i=0, len=this.fields_for_resize.length; i jQuery(tr) | null`` has been + * A new method ``get_row_for(record) -> jQuery(tr) | null`` has been added to both ListView.List and ListView.Group, it can be called from the list view to get the table row matching a record (if such a row exists). -* ``ListView#ensure_saved`` has been re-capitalized to - :js:func:`~openerp.web.ListView.ensureSaved` - * :js:func:`~openerp.web.ListView.do_button_action`'s core behavior has been split away to - :js:func:`~openerp.web.ListView.handleButton`. This allows bypassing + :js:func:`~openerp.web.ListView.handle_button`. This allows bypassing overrides of :js:func:`~openerp.web.ListView.do_button_action` in a parent class. - Ideally, :js:func:`~openerp.web.ListView.handleButton` should not be + Ideally, :js:func:`~openerp.web.ListView.handle_button` should not be overridden. * Modifiers handling has been improved (all modifiers information From 4c82865bfdcaa3d0509f4f393121963fdf309577 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 18 Jul 2012 00:24:57 +0200 Subject: [PATCH 121/168] [IMP] etherpad bzr revid: fp@openerp.com-20120717222457-f652anzrzharlwkn --- addons/pad/static/src/css/etherpad.css | 9 +++------ addons/pad/static/src/js/pad.js | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/addons/pad/static/src/css/etherpad.css b/addons/pad/static/src/css/etherpad.css index fd804c95472..8a867f42402 100644 --- a/addons/pad/static/src/css/etherpad.css +++ b/addons/pad/static/src/css/etherpad.css @@ -1,8 +1,6 @@ .etherpad_head{ - width: 99.7%; + width: 100%; display: block; - border-radius: 3px 3px 0px 0px; - background: -webkit-linear-gradient( #F7F7F7, #F1F1F1 80%); padding-left:3px; cursor:pointer; } @@ -18,7 +16,7 @@ left: 0px; top: 15px; width: 100%; - height: 98% !important; + height: 100% !important; z-index:10001 !important; background-color:white; } @@ -31,9 +29,8 @@ } .etherpad_readonly{ - width: 97.2%; + width: 100%; height: 450px; - padding:7px 7px 10px 10px; overflow:auto; } .etherpad_readonly ul,.etherpad_readonly ol{ diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js index 3f13df45d48..5749f4d7523 100644 --- a/addons/pad/static/src/js/pad.js +++ b/addons/pad/static/src/js/pad.js @@ -4,7 +4,7 @@ instance.web.form.FieldEtherpad = instance.web.form.AbstractField.extend(_.exten template: 'FieldEtherpad', initialize_content: function() { this.$textarea = undefined; - this.$element.find('span').text(this.field.string); + this.$element.find('span').text('Fullscreen'); this.$element.find('span').click(_.bind(function(ev){ this.$element.find('span').toggleClass('etherpad_zoom_head'); var iszoom = this.$element.find('span').hasClass('etherpad_zoom_head'); From d17e291031e2b997b97be30a05df04bb027be92e Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 18 Jul 2012 00:56:36 +0200 Subject: [PATCH 122/168] [IMP] etherpad fullscreen bzr revid: fp@openerp.com-20120717225636-bqudwmo6cve50fjn --- addons/pad/static/src/css/etherpad.css | 26 ++++++++++++++------------ addons/pad/static/src/js/pad.js | 12 ++++-------- addons/pad/static/src/xml/pad.xml | 9 ++++++--- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/addons/pad/static/src/css/etherpad.css b/addons/pad/static/src/css/etherpad.css index 8a867f42402..a0240afcab7 100644 --- a/addons/pad/static/src/css/etherpad.css +++ b/addons/pad/static/src/css/etherpad.css @@ -1,29 +1,32 @@ -.etherpad_head{ +.oe_etherpad_head{ width: 100%; display: block; padding-left:3px; cursor:pointer; } -.etherpad_zoom_head{ - position: fixed; - left: 0px; - top: 0px; - width: 100%; - height: 15px; +.oe_etherpad_fullscreen div.oe_etherpad_head .oe_normal { + display: none; } -.etherpad_zoom{ +.oe_etherpad_normal div.oe_etherpad_head .oe_fullscreen { + display: none; +} +.oe_etherpad_fullscreen { position: fixed; + top: 0px; left: 0px; - top: 15px; width: 100%; - height: 100% !important; + height: 100%; + background-color: white; z-index:10001 !important; - background-color:white; } .etherpad_default{ width: 100%; height: 450px; } +.oe_etherpad_fullscreen .etherpad_default{ + height: 100% +} + .etherpad_body{ overflow:hidden; } @@ -50,7 +53,6 @@ list-style-type: none !important; } - .etherpad_readonly{ font-family: arial, sans-serif; font-size: 13px; diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js index 5749f4d7523..5736d42bbab 100644 --- a/addons/pad/static/src/js/pad.js +++ b/addons/pad/static/src/js/pad.js @@ -4,13 +4,9 @@ instance.web.form.FieldEtherpad = instance.web.form.AbstractField.extend(_.exten template: 'FieldEtherpad', initialize_content: function() { this.$textarea = undefined; - this.$element.find('span').text('Fullscreen'); - this.$element.find('span').click(_.bind(function(ev){ - this.$element.find('span').toggleClass('etherpad_zoom_head'); - var iszoom = this.$element.find('span').hasClass('etherpad_zoom_head'); - this.$element.find('span').text((iszoom?'Back to Task':this.field.string)); - this.$element.find('div').toggleClass('etherpad_zoom'); - $("body").toggleClass('etherpad_body'); + this.$element.find('div.oe_etherpad_head').click(_.bind(function(ev){ + this.$element.toggleClass('oe_etherpad_fullscreen').toggleClass('oe_etherpad_normal'); + },this)); }, set_value: function(value_) { @@ -21,7 +17,7 @@ instance.web.form.FieldEtherpad = instance.web.form.AbstractField.extend(_.exten var show_value = instance.web.format_value(this.get('value'), this, ''); if (!this.get("effective_readonly")) { var pad_username = this.session.username; - this.$element.find('div').html(''); + this.$element.find('div.oe_etherpad_default').html(''); } else { if(this.get('value') != false) { diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml index 334064e88a1..27b210b3cf2 100644 --- a/addons/pad/static/src/xml/pad.xml +++ b/addons/pad/static/src/xml/pad.xml @@ -5,9 +5,12 @@ -
    - -
    +
    +
    + Fullscreen + Return to Record +
    +
    From d708c4ae0cfe7062573d43c74284c1e4a292b325 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 18 Jul 2012 01:00:06 +0200 Subject: [PATCH 123/168] imp bzr revid: fp@openerp.com-20120717230006-dgs6r4f2pm73ancp --- addons/pad_project/project_task.py | 5 ++++- addons/pad_project/project_task.xml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/pad_project/project_task.py b/addons/pad_project/project_task.py index 96e1ef86e4d..1095b753e9f 100644 --- a/addons/pad_project/project_task.py +++ b/addons/pad_project/project_task.py @@ -5,7 +5,10 @@ from osv import fields, osv class task(osv.osv): _name = "project.task" _inherit = ["project.task",'pad.common'] - _pad_url = 'description' + _pad_url = 'description_pad' + _columns = { + 'description_pad': fields.char('PAD Description', size=250) + } _defaults = { _pad_url: lambda self, cr, uid, context: self.pad_generate_url(cr, uid, self._name, context), } diff --git a/addons/pad_project/project_task.xml b/addons/pad_project/project_task.xml index da9a9b2c3a1..122bcc546fa 100644 --- a/addons/pad_project/project_task.xml +++ b/addons/pad_project/project_task.xml @@ -7,7 +7,7 @@ - From 71ede66dce1b89ce3c2c9e1ff93c1e1cae2da397 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 12:17:44 +0200 Subject: [PATCH 124/168] [FIX] handling of @onwrite extraction was broken: using _.bind/3 will partially apply the function (first argument) on top of binding it to a context (second argument), but the partial application will be from the *left* (which is pretty much the only one making sense, short of kwargs). handle_onwrite_record took its arguments the wrong way around: the partially applied one was specified on the right and the "actually applied" one was on the left, so it used the wrong argument and ended up blowing up the rest of the code. bzr revid: xmo@openerp.com-20120718101744-bbbshq60x2kqhob6 --- addons/web/static/src/js/view_list_editable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index fa39329fc81..baff7085e0e 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -352,7 +352,7 @@ openerp.web.list_editable = function (instance) { _.bind(self.handle_onwrite_record, self, source_record))); }); }, - handle_onwrite_record: function (id, source_record) { + handle_onwrite_record: function (source_record, id) { var record = this.records.get(id); if (!record) { // insert after the source record From 0f054b57c18073b396e45dda15cb5f23da3815a3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 14:43:59 +0200 Subject: [PATCH 125/168] [IMP] add ability to change row using up/down key while editing list * Allow asserting state of record being edited (creating or modifying) through Editor#is_editing * Improve setup_events to also dispatch keydown events bzr revid: xmo@openerp.com-20120718124359-q0udajwbuhzpqjmi --- .../web/static/src/js/view_list_editable.js | 77 +++++++++++++++++-- doc/list-view.rst | 13 +++- 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index baff7085e0e..d8a1e26dfa6 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -368,19 +368,19 @@ openerp.web.list_editable = function (instance) { }, setup_events: function () { var self = this; - this.editor.$element.on('keyup', function (e) { + this.editor.$element.on('keyup keydown', function (e) { + if (!self.editor.is_editing()) { return; } var key = _($.ui.keyCode).chain() .map(function (v, k) { return {name: k, code: v}; }) .find(function (o) { return o.code === e.which; }) .value(); if (!key) { return; } - var method = 'keyup_' + key.name; + var method = e.type + '_' + key.name; if (!(method in self)) { return; } self[method](e); }); }, keyup_ENTER: function () { - if (!this.editor.is_editing()) { return; } var self = this; return this.save_edition().pipe(function (saveInfo) { if (saveInfo.created) { @@ -391,8 +391,58 @@ openerp.web.list_editable = function (instance) { }); }, keyup_ESCAPE: function () { - if (!this.editor.is_editing()) { return; } return this.cancel_edition(); + }, + _text_selection_range: function (el) { + if (el.selectionStart !== undefined) { + return { + start: el.selectionStart, + end: el.selectionEnd + }; + } else if(document.body.createTextRange) { + throw new Error("Implement text range handling for MSIE"); + var sel = document.body.createTextRange(); + if (sel.parentElement() === el) { + + } + } + }, + _text_cursor: function (el) { + var selection = this._text_selection_range(el); + if (selection.start !== selection.end) { + return null; + } + return selection.start; + }, + keydown_UP: function (e) { + if (!this.editor.is_editing('edit')) { return; } + // FIXME: assumes editable widgets are input-type elements + var index = this._text_cursor(e.target); + // If selecting or not at the start of the input + if (index === null || index !== 0) { return; } + + var self = this; + e.preventDefault(); + return this.save_edition().pipe(function (saveInfo) { + // Should not happen when creating, ignore saveInfo.created + return self.start_edition( + self.records.pred(saveInfo.record, {wraparound: true})); + }); + }, + keydown_DOWN: function (e) { + if (!this.editor.is_editing('edit')) { return; } + // FIXME: assumes editable widgets are input-type elements + var index = this._text_cursor(e.target); + // If selecting or not at the end of the input + if (index === null || index !== e.target.value.length) { return; } + + var self = this; + e.preventDefault(); + return this.save_edition().pipe(function (saveInfo) { + // Should not happen when creating, ignore saveInfo.created + return self.start_edition( + self.records.succ(saveInfo.record, {wraparound: true})); + }); } }); @@ -462,8 +512,23 @@ openerp.web.list_editable = function (instance) { return edition_view; }, - is_editing: function () { - return !!this.record; + /** + * + * @param {String} [state] either ``new`` or ``edit`` + * @return {Boolean} + */ + is_editing: function (state) { + if (!this.record) { + return false; + } + switch(state) { + case null: case undefined: + return true; + case 'new': return !this.record.id; + case 'edit': return !!this.record.id; + } + throw new Error("is_editing's state filter must be either `new` or" + + " `edit` if provided"); }, edit: function (record, configureField) { // TODO: specify sequence of edit calls diff --git a/doc/list-view.rst b/doc/list-view.rst index 4030df2edd0..ebb5f0ffe4d 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -287,11 +287,20 @@ formview, delegating instead to its :type parent: :js:class:`~openerp.web.Widget` :param EditorOptions options: - .. js:function:: openerp.web.list.Editor.is_editing + .. js:function:: openerp.web.list.Editor.is_editing([record_state]) Indicates whether the editor is currently in the process of - providing edition for a field. + providing edition for a record. + Can be filtered by the state of the record being edited + (whether it's a record being *created* or a record being + *altered*), in which case it asserts both that an edition is + underway and that the record being edited respectively does + not yet exist in the database or already exists there. + + :param record_state: state of the record being edited. + Either ``"new"`` or ``"edit"``. + :type record_state: String :rtype: Boolean .. js:function:: openerp.web.list.Editor.edit(record, configureField) From 65ac59f42a9501b2ba3129e3229e6b46bd1f5596 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 15:07:51 +0200 Subject: [PATCH 126/168] [ADD] when tabbing from the last field in an edition row, go to next edition as if we'd hit [return] extract common code for 'save current edition and move on to next edition' to a private method bzr revid: xmo@openerp.com-20120718130751-g8htb78n54z1b9hv --- .../web/static/src/js/view_list_editable.js | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index d8a1e26dfa6..58925a11ba1 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -380,16 +380,29 @@ openerp.web.list_editable = function (instance) { self[method](e); }); }, - keyup_ENTER: function () { + /** + * Saves the current record, and goes to the next one (creation or + * edition) + * + * @private + * @param {String} [next_record='succ'] method to call on the records collection to get the next record to edit + * @return {*} + */ + _next: function (next_record) { + next_record = next_record || 'succ'; var self = this; return this.save_edition().pipe(function (saveInfo) { if (saveInfo.created) { return self.start_edition(); } return self.start_edition( - self.records.succ(saveInfo.record, {wraparound: true})); + self.records[next_record]( + saveInfo.record, {wraparound: true})); }); }, + keyup_ENTER: function () { + return this._next(); + }, keyup_ESCAPE: function () { return this.cancel_edition(); }, @@ -415,34 +428,38 @@ openerp.web.list_editable = function (instance) { return selection.start; }, keydown_UP: function (e) { - if (!this.editor.is_editing('edit')) { return; } + if (!this.editor.is_editing('edit')) { return $.when(); } // FIXME: assumes editable widgets are input-type elements var index = this._text_cursor(e.target); // If selecting or not at the start of the input - if (index === null || index !== 0) { return; } + if (index === null || index !== 0) { return $.when(); } - var self = this; e.preventDefault(); - return this.save_edition().pipe(function (saveInfo) { - // Should not happen when creating, ignore saveInfo.created - return self.start_edition( - self.records.pred(saveInfo.record, {wraparound: true})); - }); + return this._next('pred'); }, keydown_DOWN: function (e) { - if (!this.editor.is_editing('edit')) { return; } + if (!this.editor.is_editing('edit')) { return $.when(); } // FIXME: assumes editable widgets are input-type elements var index = this._text_cursor(e.target); // If selecting or not at the end of the input - if (index === null || index !== e.target.value.length) { return; } + if (index === null || index !== e.target.value.length) { return $.when(); } - var self = this; e.preventDefault(); - return this.save_edition().pipe(function (saveInfo) { - // Should not happen when creating, ignore saveInfo.created - return self.start_edition( - self.records.succ(saveInfo.record, {wraparound: true})); - }); + return this._next(); + }, + keydown_TAB: function (e) { + var form = this.editor.form; + var last_field = _(form.fields_order).chain() + .map(function (name) { return form.fields[name]; }) + .filter(function (field) { return field.$element.is(':visible'); }) + .last() + .value(); + // tabbed from last field in form + if (last_field && last_field.$element.has(e.target).length) { + e.preventDefault(); + return this._next(); + } + return $.when(); } }); From 85a8641e2c672aa3801e49df39296335b9567368 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 15:31:15 +0200 Subject: [PATCH 127/168] [FIX] cancel edition when deleting a record, so we're not left with a phantom editor for the deleted record on top of an other row bzr revid: xmo@openerp.com-20120718133115-8cn8wqf1ra8pjrnv --- addons/web/static/src/js/view_list_editable.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 58925a11ba1..052a471f0f3 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -31,6 +31,12 @@ openerp.web.list_editable = function (instance) { } }); + this.records.bind('remove', function () { + if (self.editor.is_editing()) { + self.cancel_edition(); + } + }); + this.on('edit:after', this, function () { self.$element.add(self.$buttons).addClass('oe_editing'); }); @@ -282,7 +288,12 @@ openerp.web.list_editable = function (instance) { }, function () { return this.editor.cancel().pipe(function (attrs) { if (attrs.id) { - return self.reload_record(self.records.get(attrs.id)); + var record = self.records.get(attrs.id); + if (!record) { + // Record removed by third party during edition + return + } + return self.reload_record(record); } var to_delete = self.records.find(function (r) { return !r.get('id'); From f19e5ff9bcc8cbee1d8e389c5a59d5e75591730a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 15:37:12 +0200 Subject: [PATCH 128/168] [IMP] don't collapse newlines in list cells bzr revid: xmo@openerp.com-20120718133712-0pbdahv62rf0nslc --- addons/web/static/src/css/base.css | 1 + addons/web/static/src/css/base.sass | 1 + addons/web/static/src/xml/base.xml | 5 ++--- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 97d2fcf57a7..f92d5cbf1c2 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -2256,6 +2256,7 @@ } .openerp .oe_list_content > tbody > tr > td.oe_list_field_cell { padding: 3px 6px; + white-space: pre-line; } .openerp .oe_list_content > tbody > tr > td, .openerp .oe_list_content > tbody > tr > th { line-height: 18px; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index c5197743acd..2ad33c8ca62 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1784,6 +1784,7 @@ $sheet-max-width: 860px border-top: 1px solid #ddd > td.oe_list_field_cell padding: 3px 6px + white-space: pre-line > td, > th line-height: 18px > button diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index a9c8e15bcd7..6d0d4a9ea7d 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -657,9 +657,8 @@
    + t-att-data-field="column.id" + >
    - +
    - -
    @@ -652,10 +653,10 @@ - + + - - From 9096f2c45c3c9c12486eed2dd273aeb03441cb68 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 15:46:07 +0200 Subject: [PATCH 129/168] [ADD] reimplement o2m's cancel-on-blur when no alteration has been done by the user to the row being edited (new or not) bzr revid: xmo@openerp.com-20120718134607-bukj6c5lysmqeer3 --- addons/web/static/src/js/view_form.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 948b3a73913..92faa3d7d15 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3331,13 +3331,20 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ /** * Handles blurring of the nested form (saves the currently edited row), * unless the flag to ignore the event is set to ``true`` + * + * Makes the internal form go away */ _on_form_blur: function () { if (this.__ignore_blur) { this.__ignore_blur = false; return; } - this.save_edition(); + // FIXME: why isn't there an API for this? + if (this.editor.form.$element.hasClass('oe_form_dirty')) { + this.save_edition(); + return; + } + this.cancel_edition(); }, keyup_ENTER: function () { // blurring caused by hitting the [Return] key, should skip the From 03dd20254e2c62b8290f9b329bde256e92fcc3cd Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 16:01:31 +0200 Subject: [PATCH 130/168] [IMP] use 'Save' as label of the button to save an editable list row bzr revid: xmo@openerp.com-20120718140131-eop88n524hwvrguw --- addons/web/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 6d0d4a9ea7d..94b76c170ea 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -668,7 +668,7 @@ + type="button">Save discard From e72f791b1321fb6d4496488ccf062ff92f710010 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Wed, 18 Jul 2012 16:27:08 +0200 Subject: [PATCH 131/168] improved style of kanban vignette dropdown menu bzr revid: mit@openerp.com-20120718142708-5okzuclspou6khot --- addons/web/static/src/css/base.css | 2 +- addons/web/static/src/css/base.sass | 2 +- addons/web_kanban/static/src/css/kanban.css | 19 +++++++------------ addons/web_kanban/static/src/css/kanban.sass | 19 ++++++++----------- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 0a3d24d41f4..8ee9bad823c 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -599,6 +599,7 @@ float: none; display: block; position: relative; + padding: 2px 12px; } .openerp .oe_dropdown_menu > li:hover { background-color: #f0f0fa; @@ -615,7 +616,6 @@ .openerp .oe_dropdown_menu > li > a { white-space: nowrap; display: block; - padding: 4px 15px; color: #4c4c4c; text-decoration: none; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index fb67945a02d..fe1e8cfe8d2 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -483,10 +483,10 @@ $sheet-max-width: 860px float: none display: block position: relative + padding: 2px 12px > a white-space: nowrap display: block - padding: 4px 15px color: #4c4c4c text-decoration: none &:hover diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index 5a7c1b84067..51cdc568a1e 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -359,6 +359,9 @@ .openerp .oe_kanban_view .oe_kanban_card .oe_dropdown_kanban { margin-top: 4px; } +.openerp .oe_kanban_view .oe_kanban_card .oe_dropdown_kanban .oe_kanban_project_times li { + float: left; +} .openerp .oe_kanban_view .oe_kanban_star { float: left; position: inline-block; @@ -401,9 +404,6 @@ position: relative; top: 2px; } -.openerp .oe_kanban_view .oe_kanban_project_times li { - float: left; -} .openerp .oe_kanban_view .oe_kanban_status { position: relative; top: 4px; @@ -471,30 +471,25 @@ visibility: hidden; } .openerp .oe_kanban_view .oe_kanban_colorpicker { - padding: 3px 6px; white-space: nowrap; } .openerp .oe_kanban_view .oe_kanban_colorpicker li { float: left; + margin: 0; + padding: 0; } .openerp .oe_kanban_view .oe_kanban_colorpicker li a { display: inline-block; - width: 18px; - height: 18px; + width: 16px; + height: 16px; border: 1px solid white; } .openerp .oe_kanban_view .oe_kanban_colorpicker li a:hover { border: 1px solid gray !important; } .openerp .oe_kanban_view .oe_kanban_colorpicker li:first-child a { - margin-top: 1px; - height: 16px; border: 1px solid #cccccc; } -.openerp .oe_kanban_view .oe_kanban_colorpicker li:first-child a:hover { - margin-top: 0px; - height: 18px; -} .openerp .oe_kanban_view .oe_kanban_color_0 { background-color: white; } diff --git a/addons/web_kanban/static/src/css/kanban.sass b/addons/web_kanban/static/src/css/kanban.sass index cea95f2ce53..6478ea5b213 100644 --- a/addons/web_kanban/static/src/css/kanban.sass +++ b/addons/web_kanban/static/src/css/kanban.sass @@ -307,6 +307,10 @@ text-decoration: none .oe_dropdown_kanban margin-top: 4px + .oe_kanban_project_times + li + float: left + .oe_kanban_star float: left position: inline-block @@ -337,9 +341,6 @@ position: relative top: 2px - .oe_kanban_project_times li - float: left - .oe_kanban_status position: relative top: 4px @@ -387,24 +388,20 @@ // }}} // KanbanColorPicker {{{ .oe_kanban_colorpicker - padding: 3px 6px white-space: nowrap .oe_kanban_colorpicker li float: left + margin: 0 + padding: 0 a display: inline-block - width: 18px - height: 18px + width: 16px + height: 16px border: 1px solid white a:hover border: 1px solid gray !important .oe_kanban_colorpicker li:first-child a - margin-top: 1px - height: 16px border: 1px solid #ccc - &:hover - margin-top: 0px - height: 18px // }}} // KanbanColors {{{ .oe_kanban_color_0 From 8632675b82ed1b4cc50a3a48b02fb40dd316d3d6 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Wed, 18 Jul 2012 16:35:39 +0200 Subject: [PATCH 132/168] re alignment of dropdown menu bzr revid: mit@openerp.com-20120718143539-0b1abwzq24f66s50 --- addons/web/static/src/css/base.css | 4 ++-- addons/web/static/src/css/base.sass | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 8ee9bad823c..e96bb2666f5 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -584,7 +584,7 @@ z-index: 1; border: 1px solid #afafb6; background: white; - padding: 6px 0; + padding: 4px 0; min-width: 140px; text-align: left; -moz-border-radius: 3px; @@ -599,7 +599,7 @@ float: none; display: block; position: relative; - padding: 2px 12px; + padding: 2px 8px; } .openerp .oe_dropdown_menu > li:hover { background-color: #f0f0fa; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index fe1e8cfe8d2..d860fc69189 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -470,7 +470,7 @@ $sheet-max-width: 860px z-index: 1 border: 1px solid #afafb6 background: white - padding: 6px 0 + padding: 4px 0 min-width: 140px text-align: left @include radius(3px) @@ -483,7 +483,7 @@ $sheet-max-width: 860px float: none display: block position: relative - padding: 2px 12px + padding: 2px 8px > a white-space: nowrap display: block From 06104ba553702b16878d52c5b8ab089355216a5e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 19 Jul 2012 10:23:52 +0200 Subject: [PATCH 133/168] [FIX] shitty undoc flag so saving a form doesn't forget/miss a row being edited bzr revid: xmo@openerp.com-20120719082352-pqq02u03fo09rcwe --- addons/web/static/src/js/view_form.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 92faa3d7d15..9e3db4f1b05 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3236,6 +3236,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ if (!form.$element.is('.oe_form_dirty')) { return true; } + this.o2m._dirty_flag = true; // Otherwise validate internal form return _(form.fields).chain() From ac5dc58367d9bed5a576baaa7b803a67b5d00d07 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 19 Jul 2012 11:57:42 +0200 Subject: [PATCH 134/168] [IMP] focus the clicked field when starting a row edition by clicking on a cell bzr revid: xmo@openerp.com-20120719095742-lps9xjsrvhn5fnlh --- .../web/static/src/js/view_list_editable.js | 54 +++++++++++++------ doc/list-view.rst | 22 +++++++- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 052a471f0f3..56df125c98b 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -165,9 +165,11 @@ openerp.web.list_editable = function (instance) { * Set up the edition of a record of the list view "inline" * * @param {instance.web.list.Record} [record] record to edit, leave empty to create a new record + * @param {Object} [options] + * @param {String} [options.focus_field] field to focus at start of edition * @return {jQuery.Deferred} */ - start_edition: function (record) { + start_edition: function (record, options) { var self = this; var item = false; if (record) { @@ -194,14 +196,14 @@ openerp.web.list_editable = function (instance) { return self.editor.edit(item, function (field_name, field) { var cell = cells[field_name]; if (!cell || field.get('effective_readonly')) { - // Readonly fields can just remain the list's, form's - // usually don't have backgrounds &al + // Readonly fields can just remain the list's, + // form's usually don't have backgrounds &al field.set({invisible: true}); return; } self.fields_for_resize.push({field: field, cell: cell}); - }).pipe(function () { + }, options).pipe(function () { $recordRow.addClass('oe_edition'); self.resize_fields(); return record.attributes; @@ -558,7 +560,33 @@ openerp.web.list_editable = function (instance) { throw new Error("is_editing's state filter must be either `new` or" + " `edit` if provided"); }, - edit: function (record, configureField) { + _focus_setup: function (focus_field) { + var form = this.form; + + var field; + // If a field to focus was specified + if (focus_field + // Is actually in the form + && (field = form.fields[focus_field]) + // And is visible + && field.$element.is(':visible')) { + // focus it + field.focus(); + return; + } + + _(form.fields_order).detect(function (name) { + // look for first visible field in fields_order, focus it + var field = form.fields[name]; + if (!field.$element.is(':visible')) { + return false; + } + field.focus(); + // Stop as soon as a field got focused + return true; + }); + }, + edit: function (record, configureField, options) { // TODO: specify sequence of edit calls var self = this; var form = self.form; @@ -573,16 +601,7 @@ openerp.web.list_editable = function (instance) { _(form.fields).each(function (field, name) { configureField(name, field); }); - // TODO: actually focus clicked field (if editable) - _(form.fields_order).detect(function (name) { - // look for first visible field in fields_order, focus it - var field = form.fields[name]; - if (!field.$element.is(':visible')) { - return false; - } - field.focus(); - return true; - }); + self._focus_setup(options && options.focus_field); return form; }); }, @@ -627,7 +646,10 @@ openerp.web.list_editable = function (instance) { return this._super.apply(this, arguments); } var record_id = $(event.currentTarget).data('id'); - this.view.start_edition(record_id ? this.records.get(record_id) : null); + this.view.start_edition( + record_id ? this.records.get(record_id) : null, { + focus_field: $(event.target).data('field') + }); }, /** * If a row mapping to the record (@data-id matching the record's id or diff --git a/doc/list-view.rst b/doc/list-view.rst index ebb5f0ffe4d..0d67c27f963 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -131,7 +131,7 @@ Interaction Methods rejected if a pending edition could not be saved (e.g. validation failure) -.. js:function:: openerp.web.ListView.start_edition([record]) +.. js:function:: openerp.web.ListView.start_edition([record][, options]) Starts editing the provided record inline, through an overlay form view of editable fields in the record. @@ -142,7 +142,9 @@ Interaction Methods This method resolves any pending edition when invoked, before starting a new edition. + :param record: record to edit, or null to create a new record :type record: :js:class:`~openerp.web.list.Record` + :param EditOptions options: :returns: delegate to the form used for the edition .. js:function:: openerp.web.ListView.save_edition @@ -303,7 +305,7 @@ formview, delegating instead to its :type record_state: String :rtype: Boolean - .. js:function:: openerp.web.list.Editor.edit(record, configureField) + .. js:function:: openerp.web.list.Editor.edit(record, configureField[, options]) Loads the provided record into the internal form view and displays the form view. @@ -320,6 +322,7 @@ formview, delegating instead to its method do some last-minute configuration of form fields. :type configureField: Function + :param EditOptions options: :returns: jQuery delegate to the form object .. js:function:: openerp.web.list.Editor.save @@ -391,6 +394,21 @@ formview, delegating instead to its dataset (instead of appended) :rtype: Boolean + +.. js:class:: EditOptions + + Options object optionally passed into a method starting an edition + to configure its setup and behavior + + .. js:attribute:: focus_field + + Name of the field to set focus on after setting up the edition + of the record. + + If this option is not provided, or the requested field can not + be focused (invisible, readonly or not in the view), the first + visible non-readonly field is focused. + Changes from 6.1 ---------------- From cf6af909fb8f36f0a4ced1a3b61379d9d4899e34 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Thu, 19 Jul 2012 17:28:04 +0200 Subject: [PATCH 135/168] fixed visual glitch in topbar dropdown menu bzr revid: mit@openerp.com-20120719152804-zcxvuaicpzfubdv1 --- addons/web/static/src/css/base.css | 3 ++- addons/web/static/src/css/base.sass | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index e96bb2666f5..12f0de62b8c 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -945,11 +945,12 @@ } .openerp .oe_topbar .oe_dropdown_menu li { float: none; + padding: 3px 12px; } .openerp .oe_topbar .oe_dropdown_menu li a { color: #eeeeee; } -.openerp .oe_topbar .oe_dropdown_menu li a:hover { +.openerp .oe_topbar .oe_dropdown_menu li:hover { background-color: #292929; background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919)); background-image: -webkit-linear-gradient(top, #292929, #191919); diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index d860fc69189..58fd8734fa7 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -735,11 +735,12 @@ $sheet-max-width: 860px @include background-clip() li float: none + padding: 3px 12px a color: #eee - &:hover - @include vertical-gradient(#292929, #191919) - @include box-shadow(none) + &:hover + @include vertical-gradient(#292929, #191919) + @include box-shadow(none) // }}} // Webclient.leftbar {{{ From bd538220f36bd7b4c58c158ed3c831bd6b510af6 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Thu, 19 Jul 2012 17:36:05 +0200 Subject: [PATCH 136/168] fixed offset of topbar dropdown menu bzr revid: mit@openerp.com-20120719153605-ivanvuvl3mv88bl3 --- addons/web/static/src/js/chrome.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 094e2f184e6..2ab4b61d9c0 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -910,7 +910,7 @@ instance.web.WebClient = instance.web.Widget.extend({ var doc_width = $(document).width(); var offset = $menu.offset(); var menu_width = $menu.width(); - var x = doc_width - offset.left - menu_width - 15; + var x = doc_width - offset.left - menu_width - 2; if (x < 0) { $menu.offset({ left: offset.left + x }).width(menu_width); } From 3c1dd6c0c2a985eebbbfb99b18a98f1151cdfd6d Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Thu, 19 Jul 2012 17:58:37 +0200 Subject: [PATCH 137/168] fixed cursor too close to search icon in searchview bzr revid: mit@openerp.com-20120719155837-g64bmhzesl7ode8t --- addons/web/static/src/css/base.css | 2 +- addons/web/static/src/css/base.sass | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 12f0de62b8c..7c8085046fc 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1438,7 +1438,7 @@ outline: none; } .openerp .oe_searchview .oe_searchview_facets .oe_searchview_input { - padding: 0 3px; + padding: 0 0 0 6px; } .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet { position: relative; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 58fd8734fa7..b3ff70b72bd 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1127,7 +1127,7 @@ $sheet-max-width: 860px &:focus outline: none .oe_searchview_input - padding: 0 3px + padding: 0 0 0 6px .oe_searchview_facet position: relative cursor: pointer From bff386ea36d2d24c21b16d4ed17db0c6d039bd3d Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Thu, 19 Jul 2012 18:04:56 +0200 Subject: [PATCH 138/168] fixed alignment of 'add to dashboard' button in searchview bzr revid: mit@openerp.com-20120719160456-vp9hip9f67d1ij84 --- addons/web/static/src/css/base.css | 6 +++--- addons/web/static/src/css/base.sass | 14 +++++++------- addons/web/static/src/xml/base.xml | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 7c8085046fc..eda3a996d23 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1601,14 +1601,14 @@ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li:hover { background-color: #f0f0fa; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section form { +.openerp .oe_searchview .oe_searchview_drawer form { margin-left: 12px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section form p { +.openerp .oe_searchview .oe_searchview_drawer form p { margin: 4px 0; line-height: 18px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section form button { +.openerp .oe_searchview .oe_searchview_drawer form button { margin: 0 0 8px 0; } .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom { diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index b3ff70b72bd..dbd3d30f453 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1249,13 +1249,13 @@ $sheet-max-width: 860px // after oe_selected so background color is not overridden &:hover background-color: $hover-background - form - margin-left: 12px - p - margin: 4px 0 - line-height: 18px - button - margin: 0 0 8px 0 + form + margin-left: 12px + p + margin: 4px 0 + line-height: 18px + button + margin: 0 0 8px 0 .oe_searchview_custom padding: 0 8px 8px 8px form diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 0ade5dd4d89..1bbffe3e2a7 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1392,8 +1392,8 @@

    Add to Dashboard

    - - +

    +
    From a79139048d496d51cdb23f3087252229b099371a Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 21 Jul 2012 21:25:51 +0200 Subject: [PATCH 139/168] [FIX] pad everything, remove unused api bzr revid: al@openerp.com-20120721192551-q6nbqn4xxau0e64x --- addons/pad/LICENSE | 15 -- addons/pad/etherpad.py | 254 ---------------------------- addons/pad/pad.py | 35 +--- addons/pad/res_company.py | 10 +- addons/pad/res_company.xml | 3 +- addons/pad/static/src/js/pad.js | 65 +++---- addons/pad/static/src/xml/pad.xml | 12 +- addons/pad_project/__openerp__.py | 2 +- addons/pad_project/project_task.py | 6 +- addons/pad_project/project_task.xml | 5 +- 10 files changed, 55 insertions(+), 352 deletions(-) delete mode 100644 addons/pad/LICENSE delete mode 100644 addons/pad/etherpad.py diff --git a/addons/pad/LICENSE b/addons/pad/LICENSE deleted file mode 100644 index ff64be448e9..00000000000 --- a/addons/pad/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -OpenERP, Open Source Management Solution -Copyright © 2010-2011 OpenERP SA (). - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public Lice -along with this program. If not, see . diff --git a/addons/pad/etherpad.py b/addons/pad/etherpad.py deleted file mode 100644 index 547720c1cc8..00000000000 --- a/addons/pad/etherpad.py +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/env python -"""Module to talk to EtherpadLite API.""" - -import json -import urllib -import urllib2 - - -class EtherpadLiteClient: - """Client to talk to EtherpadLite API.""" - API_VERSION = 1 # TODO probably 1.1 sometime soon - - CODE_OK = 0 - CODE_INVALID_PARAMETERS = 1 - CODE_INTERNAL_ERROR = 2 - CODE_INVALID_FUNCTION = 3 - CODE_INVALID_API_KEY = 4 - TIMEOUT = 20 - - apiKey = "" - baseUrl = "" - - def __init__(self, apiKey=None, baseUrl=None): - if apiKey: - self.apiKey = apiKey - - if baseUrl: - self.baseUrl = baseUrl - - def call(self, function, arguments=None): - """Create a dictionary of all parameters""" - url = '%s/%d/%s' % (self.baseUrl, self.API_VERSION, function) - - params = arguments or {} - params.update({'apikey': self.apiKey}) - data = urllib.urlencode(params, True) - - try: - opener = urllib2.build_opener() - request = urllib2.Request(url=url, data=data) - response = opener.open(request, timeout=self.TIMEOUT) - result = response.read() - response.close() - except urllib2.HTTPError: - raise - - result = json.loads(result) - if result is None: - raise ValueError("JSON response could not be decoded") - - return self.handleResult(result) - - def handleResult(self, result): - """Handle API call result""" - if 'code' not in result: - raise Exception("API response has no code") - if 'message' not in result: - raise Exception("API response has no message") - - if 'data' not in result: - result['data'] = None - - if result['code'] == self.CODE_OK: - return result['data'] - elif result['code'] == self.CODE_INVALID_PARAMETERS or result['code'] == self.CODE_INVALID_API_KEY: - raise ValueError(result['message']) - elif result['code'] == self.CODE_INTERNAL_ERROR: - raise Exception(result['message']) - elif result['code'] == self.CODE_INVALID_FUNCTION: - raise Exception(result['message']) - else: - raise Exception("An unexpected error occurred whilst handling the response") - - # GROUPS - # Pads can belong to a group. There will always be public pads that do not belong to a group (or we give this group the id 0) - - def createGroup(self): - """creates a new group""" - return self.call("createGroup") - - def createGroupIfNotExistsFor(self, groupMapper): - """this functions helps you to map your application group ids to etherpad lite group ids""" - return self.call("createGroupIfNotExistsFor", { - "groupMapper": groupMapper - }) - - def deleteGroup(self, groupID): - """deletes a group""" - return self.call("deleteGroup", { - "groupID": groupID - }) - - def listPads(self, groupID): - """returns all pads of this group""" - return self.call("listPads", { - "groupID": groupID - }) - - def createGroupPad(self, groupID, padName, text=''): - """creates a new pad in this group""" - params = { - "groupID": groupID, - "padName": padName, - } - if text: - params['text'] = text - return self.call("createGroupPad", params) - - # AUTHORS - # Theses authors are bind to the attributes the users choose (color and name). - - def createAuthor(self, name=''): - """creates a new author""" - params = {} - if name: - params['name'] = name - return self.call("createAuthor", params) - - def createAuthorIfNotExistsFor(self, authorMapper, name=''): - """this functions helps you to map your application author ids to etherpad lite author ids""" - params = { - 'authorMapper': authorMapper - } - if name: - params['name'] = name - return self.call("createAuthorIfNotExistsFor", params) - - # SESSIONS - # Sessions can be created between a group and a author. This allows - # an author to access more than one group. The sessionID will be set as - # a cookie to the client and is valid until a certain date. - - def createSession(self, groupID, authorID, validUntil): - """creates a new session""" - return self.call("createSession", { - "groupID": groupID, - "authorID": authorID, - "validUntil": validUntil - }) - - def deleteSession(self, sessionID): - """deletes a session""" - return self.call("deleteSession", { - "sessionID": sessionID - }) - - def getSessionInfo(self, sessionID): - """returns informations about a session""" - return self.call("getSessionInfo", { - "sessionID": sessionID - }) - - def listSessionsOfGroup(self, groupID): - """returns all sessions of a group""" - return self.call("listSessionsOfGroup", { - "groupID": groupID - }) - - def listSessionsOfAuthor(self, authorID): - """returns all sessions of an author""" - return self.call("listSessionsOfAuthor", { - "authorID": authorID - }) - - # PAD CONTENT - # Pad content can be updated and retrieved through the API - - def getText(self, padID, rev=None): - """returns the text of a pad""" - params = {"padID": padID} - if rev is not None: - params['rev'] = rev - return self.call("getText", params) - - # introduced with pull request merge - def getHtml(self, padID, rev=None): - """returns the html of a pad""" - params = {"padID": padID} - if rev is not None: - params['rev'] = rev - return self.call("getHTML", params) - - def setText(self, padID, text): - """sets the text of a pad""" - return self.call("setText", { - "padID": padID, - "text": text - }) - - def setHtml(self, padID, html): - """sets the text of a pad from html""" - return self.call("setHTML", { - "padID": padID, - "html": html - }) - - # PAD - # Group pads are normal pads, but with the name schema - # GROUPID$PADNAME. A security manager controls access of them and its - # forbidden for normal pads to include a in the name. - - def createPad(self, padID, text=''): - """creates a new pad""" - params = { - "padID": padID, - } - if text: - params['text'] = text - return self.call("createPad", params) - - def getRevisionsCount(self, padID): - """returns the number of revisions of this pad""" - return self.call("getRevisionsCount", { - "padID": padID - }) - - def deletePad(self, padID): - """deletes a pad""" - return self.call("deletePad", { - "padID": padID - }) - - def getReadOnlyID(self, padID): - """returns the read only link of a pad""" - return self.call("getReadOnlyID", { - "padID": padID - }) - - def setPublicStatus(self, padID, publicStatus): - """sets a boolean for the public status of a pad""" - return self.call("setPublicStatus", { - "padID": padID, - "publicStatus": publicStatus - }) - - def getPublicStatus(self, padID): - """return true of false""" - return self.call("getPublicStatus", { - "padID": padID - }) - - def setPassword(self, padID, password): - """returns ok or a error message""" - return self.call("setPassword", { - "padID": padID, - "password": password - }) - - def isPasswordProtected(self, padID): - """returns true or false""" - return self.call("isPasswordProtected", { - "padID": padID - }) - diff --git a/addons/pad/pad.py b/addons/pad/pad.py index c7e448767bc..40569fcd589 100644 --- a/addons/pad/pad.py +++ b/addons/pad/pad.py @@ -2,52 +2,29 @@ from osv import fields, osv import random import string -from etherpad import EtherpadLiteClient import urllib2 from tools.translate import _ - class pad_common(osv.osv_memory): _name = 'pad.common' - _pad_url = None # name of the field for the etherpad - def pad_generate_url(self, cr, uid, model, context=None): - pad_url_template = self._pad_url_template(cr, uid, context) + _pad_fields = [] + def pad_generate_url(self, cr, uid, context=None): + pad_url_template = self.pool.get('res.users').browse(cr,uid, uid, context).company_id.pad_url_template s = string.ascii_uppercase + string.digits salt = ''.join([s[random.randint(0, len(s) - 1)] for i in range(8)]) template_vars = { 'db' : cr.dbname, - 'model' : model, + 'model' : self._name, 'salt' : salt, } url = pad_url_template % template_vars - api_key = self._pad_api_key(cr, uid, context) - if api_key: - urls = url.split('/') - api_url = '/'.join(urls[:3]) + "/api" - pad_id = urls[-1] - ep_client = EtherpadLiteClient(api_key, api_url) - try: - ep_client.createPad(pad_id," ") - except ValueError as strerror: - raise osv.except_osv(_('Configuration Error !'),_("Etherpad Have Wrong API Key.")) - except urllib2.HTTPError as e: - raise osv.except_osv(_('Configuration Error !'),_("Etherpad Have Wrong API URL.")) - except urllib2.URLError as e: - raise osv.except_osv(_('Configuration Error !'),_("Etherpad Have Wrong Pad URL Template.")) return url - def _pad_api_key(self, cr, uid, context=None): - return self.pool.get('res.users').browse(cr,uid, uid, context).company_id.etherpad_api_key - - def _pad_url_template(self, cr, uid, context=None): - return self.pool.get('res.users').browse(cr,uid, uid, context).company_id.pad_url_template - def copy(self, cr, uid, id, default=None, context=None): if not default: default = {} - default.update({ - self._pad_url:self.pad_generate_url(cr, uid, self._name), - }) + update = [(field,self.pad_generate_url(cr, uid, context)) for field in self._pad_fields] + default.update(update) return super(pad_common, self).copy(cr, uid, id, default, context) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/pad/res_company.py b/addons/pad/res_company.py index 4ce27fd4d22..bd955cd0481 100644 --- a/addons/pad/res_company.py +++ b/addons/pad/res_company.py @@ -1,19 +1,15 @@ # -*- coding: utf-8 -*- from osv import fields, osv -PAD_TEMPLATE = 'http://beta.etherpad.org/p/%(db).10s-%(model)s-%(salt)s' -PAD_API_KEY = 'EtherpadFTW' +DEFAULT_PAD_TEMPLATE = 'http://beta.etherpad.org/p/%(db)s-%(model)s-%(salt)s' class company_pad(osv.osv): _inherit = 'res.company' _columns = { - 'pad_url_template': fields.char('Pad URL Template', size=128, required=True, - help="Template used to generate pad URL."), - 'etherpad_api_key': fields.char('Pad API Key', size=128), + 'pad_url_template': fields.char('Pad URL Template', size=128, required=True, help="Template used to generate pad URL."), } _defaults = { - 'pad_url_template': PAD_TEMPLATE, - 'etherpad_api_key': PAD_API_KEY, + 'pad_url_template': DEFAULT_PAD_TEMPLATE, } diff --git a/addons/pad/res_company.xml b/addons/pad/res_company.xml index 96c3c004bef..12f14b0f5bd 100644 --- a/addons/pad/res_company.xml +++ b/addons/pad/res_company.xml @@ -8,8 +8,7 @@ - - + diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js index 5736d42bbab..6384eb72da8 100644 --- a/addons/pad/static/src/js/pad.js +++ b/addons/pad/static/src/js/pad.js @@ -1,37 +1,40 @@ openerp.pad = function(instance) { -instance.web.form.FieldEtherpad = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { - template: 'FieldEtherpad', +instance.web.form.FieldPad = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, { + template: 'FieldPad', initialize_content: function() { - this.$textarea = undefined; - this.$element.find('div.oe_etherpad_head').click(_.bind(function(ev){ - this.$element.toggleClass('oe_etherpad_fullscreen').toggleClass('oe_etherpad_normal'); - - },this)); - }, - set_value: function(value_) { - this._super(value_); - this.render_value(); - }, - render_value: function() { - var show_value = instance.web.format_value(this.get('value'), this, ''); - if (!this.get("effective_readonly")) { + var self = this; + this.$textarea = undefined; + this.$element.find('div.oe_etherpad_head').click(function(ev) { + self.$element.toggleClass('oe_etherpad_fullscreen').toggleClass('oe_etherpad_normal'); + }); + }, + set_value: function(value_) { + this._super(value_); + this.render_value(); + }, + render_value: function() { + var self = this; + var value = this.get('value'); + if(value !== false) { + var url = value.split('\n')[0]; + if (!this.get("effective_readonly")) { var pad_username = this.session.username; - this.$element.find('div.oe_etherpad_default').html(''); + var code = ''; + this.$element.find('div.oe_etherpad_default').html(code); } else { - if(this.get('value') != false) - { - var self = this; - if(show_value.split('\n')[0] != '') - $.get(show_value.split('\n')[0]+'/export/html') - .success(function(data) { self.$element.html('
    '+data+'
    '); }) - .error(function() { self.$element.text('Unable to load pad'); }); - } + $.get(url+'/export/html').success(function(data) { + self.$element.html('
    '+data+'
    '); + }).error(function() { + self.$element.text('Unable to load pad'); + }); } - }, - })); - - instance.web.form.widgets = instance.web.form.widgets.extend({ - 'etherpad': 'instance.web.form.FieldEtherpad', - }); -}; + } + }, +}); + +instance.web.form.widgets = instance.web.form.widgets.extend({ + 'pad': 'instance.web.form.FieldPad', +}); + +}; diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml index 27b210b3cf2..e128fb183fb 100644 --- a/addons/pad/static/src/xml/pad.xml +++ b/addons/pad/static/src/xml/pad.xml @@ -3,14 +3,14 @@ --> - +
    -
    - Fullscreen - Return to Record -
    -
    +
    + Fullscreen + Return to Record +
    +
    diff --git a/addons/pad_project/__openerp__.py b/addons/pad_project/__openerp__.py index 61ebfa8f17f..18c7d3191d3 100644 --- a/addons/pad_project/__openerp__.py +++ b/addons/pad_project/__openerp__.py @@ -20,7 +20,7 @@ ############################################################################## { - 'name': 'Specifications on PADs', + 'name': 'Pad on tasks', 'version': '1.0', "category": "Project Management", 'description': """ diff --git a/addons/pad_project/project_task.py b/addons/pad_project/project_task.py index 1095b753e9f..46c2c54cd46 100644 --- a/addons/pad_project/project_task.py +++ b/addons/pad_project/project_task.py @@ -5,10 +5,10 @@ from osv import fields, osv class task(osv.osv): _name = "project.task" _inherit = ["project.task",'pad.common'] - _pad_url = 'description_pad' + _pad_fields = ['description_pad'] _columns = { - 'description_pad': fields.char('PAD Description', size=250) + 'description_pad': fields.char('Description PAD', size=250) } _defaults = { - _pad_url: lambda self, cr, uid, context: self.pad_generate_url(cr, uid, self._name, context), + 'description_pad': lambda self, cr, uid, context: self.pad_generate_url(cr, uid, context), } diff --git a/addons/pad_project/project_task.xml b/addons/pad_project/project_task.xml index 122bcc546fa..d18f43a92f4 100644 --- a/addons/pad_project/project_task.xml +++ b/addons/pad_project/project_task.xml @@ -7,10 +7,7 @@ - + From ad4b42d6e099cf5557f39facf4e37cb883d26da3 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 21 Jul 2012 21:34:59 +0200 Subject: [PATCH 140/168] [FIX] pad fix bzr ignore bzr revid: al@openerp.com-20120721193459-gxs3fs21nfel9enr --- addons/.bzrignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/addons/.bzrignore b/addons/.bzrignore index 5fee3e96f5d..8d98f9debde 100644 --- a/addons/.bzrignore +++ b/addons/.bzrignore @@ -1,5 +1 @@ .* -pad/__init__.pyc -pad/ir_attachment.pyc -pad/res_company.pyc -web_etherpad From c53deab9878bfa5e5e44dc1165f7982a5b8f6e55 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Mon, 23 Jul 2012 05:21:34 +0000 Subject: [PATCH 141/168] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120723052134-owmld5p3oqmn3nol --- addons/web_dashboard/i18n/uk.po | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 addons/web_dashboard/i18n/uk.po diff --git a/addons/web_dashboard/i18n/uk.po b/addons/web_dashboard/i18n/uk.po new file mode 100644 index 00000000000..fd4df4a2141 --- /dev/null +++ b/addons/web_dashboard/i18n/uk.po @@ -0,0 +1,63 @@ +# Ukrainian translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-07-02 09:06+0200\n" +"PO-Revision-Date: 2012-07-22 09:32+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-23 05:21+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:60 +msgid "Edit Layout" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:106 +msgid "Are you sure you want to remove this item ?" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:4 +msgid "Reset Layout.." +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:6 +msgid "Reset" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:8 +msgid "Change Layout.." +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:10 +msgid "Change Layout" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:27 +msgid " " +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:28 +msgid "Create" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:39 +msgid "Choose dashboard layout" +msgstr "" From 071dce2cb94536c408b94f57967d223f94eb776c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 23 Jul 2012 15:49:14 +0200 Subject: [PATCH 142/168] [FIX] problem with wizards bzr revid: nicolas.vanhoren@openerp.com-20120723134914-4rrmeysncsancwfq --- addons/web/static/src/js/chrome.js | 9 +++++++++ addons/web/static/src/js/view_form.js | 6 +----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 40cff06e66a..38bcfef3e05 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -135,8 +135,12 @@ instance.web.Dialog = instance.web.Widget.extend({ this.$element.dialog('close'); }, on_close: function() { + if (this.__tmp_dialog_destroying) + return; if (this.dialog_options.destroy_on_close) { + this.__tmp_dialog_closing = true; this.destroy(); + this.__tmp_dialog_closing = undefined; } }, on_resized: function() { @@ -145,6 +149,11 @@ instance.web.Dialog = instance.web.Widget.extend({ _.each(this.getChildren(), function(el) { el.destroy(); }); + if (! this.__tmp_dialog_closing) { + this.__tmp_dialog_destroying = true; + this.close(); + this.__tmp_dialog_destroying = undefined; + } if (! this.isDestroyed()) { this.$element.dialog('destroy'); } diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index d6ed85fedad..b75d0886387 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1682,11 +1682,7 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({ on_confirmed: function() { var self = this; - var context = this.node.attrs.context; - if (context && context.__ref) { - context = new instance.web.CompoundContext(context); - context.set_eval_context(this._build_eval_context()); - } + var context = this.build_context(); return this.view.do_execute_action( _.extend({}, this.node.attrs, {context: context}), From c5db4ca91d34b9fb222785eda0b407eaf00cefce Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 23 Jul 2012 15:49:31 +0200 Subject: [PATCH 143/168] [IMP] field.char: make string and size optional * Increases coherence with other fields (default string is 'unknown') * Char fields defaut to unbounded, bounds are optional bzr revid: xmo@openerp.com-20120723134931-b5moeenk0db5m2ss --- openerp/osv/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 2a6d0d6e3eb..3117793dcab 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -181,7 +181,7 @@ class reference(_column): class char(_column): _type = 'char' - def __init__(self, string, size, **args): + def __init__(self, string="unknown", size=None, **args): _column.__init__(self, string=string, size=size, **args) self._symbol_set = (self._symbol_c, self._symbol_set_char) From 8bdd7300905341957579bea7c0557dbff99a051d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 23 Jul 2012 15:50:22 +0200 Subject: [PATCH 144/168] [REM] orm: pointless character replacement of quotes by spaces in field strings bzr revid: xmo@openerp.com-20120723135022-9lh5yyk0au5xag3l --- openerp/osv/orm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 78487e7641c..18a8ec59982 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -758,7 +758,7 @@ class BaseModel(object): 'model_id': model_id, 'model': self._name, 'name': k, - 'field_description': f.string.replace("'", " "), + 'field_description': f.string, 'ttype': f._type, 'relation': f._obj or '', 'view_load': (f.view_load and 1) or 0, From 3b5890d79b8286f564b5cf3dd8166efaa7a5f3b3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 23 Jul 2012 15:51:13 +0200 Subject: [PATCH 145/168] [REM] redundant code: a field of type one2many will always have _type one2many bzr revid: xmo@openerp.com-20120723135113-6x3s5lmljk8cdpf0 --- openerp/osv/orm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 18a8ec59982..a62561fc95d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -767,7 +767,7 @@ class BaseModel(object): 'required': (f.required and 1) or 0, 'selectable': (f.selectable and 1) or 0, 'translate': (f.translate and 1) or 0, - 'relation_field': (f._type=='one2many' and isinstance(f, fields.one2many)) and f._fields_id or '', + 'relation_field': f._fields_id if isinstance(f, fields.one2many) else '', 'serialization_field_id': None, } if getattr(f, 'serialization_field', None): From 8b0f8a09927254e0cb7e7e1ae1deb83ff2d78b34 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 23 Jul 2012 15:52:15 +0200 Subject: [PATCH 146/168] [IMP] replace equality None test by identity test bzr revid: xmo@openerp.com-20120723135215-7n63uh4ikulsdc6r --- openerp/osv/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 3117793dcab..6c74c05bd5a 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -49,7 +49,7 @@ import simplejson _logger = logging.getLogger(__name__) def _symbol_set(symb): - if symb == None or symb == False: + if symb is None or symb == False: return None elif isinstance(symb, unicode): return symb.encode('utf-8') @@ -191,7 +191,7 @@ class char(_column): # * we need to remove the "symb==False" from the next line BUT # for now too many things rely on this broken behavior # * the symb==None test should be common to all data types - if symb == None or symb == False: + if symb is None or symb == False: return None # we need to convert the string to a unicode object to be able From bef7ef96200769e8700aa969b097f05cce02d191 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 23 Jul 2012 15:59:37 +0200 Subject: [PATCH 147/168] [IMP] Modified loading message bzr revid: nicolas.vanhoren@openerp.com-20120723135937-3tuwpzdhn3311mg1 --- addons/web/static/src/js/chrome.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 38bcfef3e05..047a4a80e0d 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -263,7 +263,11 @@ instance.web.Loading = instance.web.Widget.extend({ this.count += increment; if (this.count > 0) { - this.$element.text(_.str.sprintf( _t("Loading (%d)"), this.count)); + if (instance.connection.debug) { + this.$element.text(_.str.sprintf( _t("Loading (%d)"), this.count)); + } else { + this.$element.text(_t("Loading")); + } this.$element.show(); this.getParent().$element.addClass('oe_wait'); } else { From ce02c0887a836897d190519c7b8e5330af16ecc4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 23 Jul 2012 16:05:02 +0200 Subject: [PATCH 148/168] [IMP] coerce 'falsy' char sizes to None Otherwise users using fields.char(size=False) will see their content disappear without warning, not cool bzr revid: xmo@openerp.com-20120723140502-nrtgw0o47ewj25qa --- openerp/osv/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 6c74c05bd5a..b7f47fe6549 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -182,7 +182,7 @@ class char(_column): _type = 'char' def __init__(self, string="unknown", size=None, **args): - _column.__init__(self, string=string, size=size, **args) + _column.__init__(self, string=string, size=size or None, **args) self._symbol_set = (self._symbol_c, self._symbol_set_char) # takes a string (encoded in utf8) and returns a string (encoded in utf8) From 50a5ccebe700abc0d58b20b10ac3edbbb873dd53 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 23 Jul 2012 17:11:13 +0200 Subject: [PATCH 149/168] [FIX] problem with translate dialog bzr revid: nicolas.vanhoren@openerp.com-20120723151113-nvh8l72duewcotvx --- addons/web/static/src/js/view_form.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b75d0886387..3f12bac7843 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -945,6 +945,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM is_create_mode: function() { return !this.datarecord.id; }, + open_translate_dialog: function(field) { + return this._super(field); + }, }); /** From 8218e1cc8051f38ef8d38d73b74f536a9c59dbb2 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 23 Jul 2012 17:22:24 +0200 Subject: [PATCH 150/168] [FIX] another problem with translation wizard bzr revid: nicolas.vanhoren@openerp.com-20120723152224-pmll06c6j3hk1hjd --- addons/web/static/src/js/views.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index bd102d867de..319dfc9ca6d 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -1074,11 +1074,13 @@ instance.web.TranslateDialog = instance.web.Dialog.extend({ if (self.view.translatable_fields && self.view.translatable_fields.length) { self.do_load_fields_values(function() { sup.call(self); + // desactivated because it created an exception, plus it does not seem very useful + /* if (field) { var $field_input = self.$element.find('tr[data-field="' + field.name + '"] td:nth-child(2) *:first-child'); self.$element.scrollTo($field_input); $field_input.focus(); - } + }*/ }); } else { sup.call(self); From ce7580492bcb63b6782677d7dff96f6bd0d9d8b6 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 23 Jul 2012 17:30:39 +0200 Subject: [PATCH 151/168] [IMP] m2o no tabindex=-! for open button will be handled by a keyboard shortcut bzr revid: al@openerp.com-20120723153039-3xstwq2a1pcc67gh --- addons/web/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 55280f6badb..54bf221fc26 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -956,7 +956,7 @@
    - / + /
    Date: Mon, 23 Jul 2012 18:22:23 +0200 Subject: [PATCH 152/168] [FIX] hide topbar on login page bzr revid: chs@openerp.com-20120723162223-amclassz6dzneayq --- addons/web/static/src/js/chrome.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 047a4a80e0d..71010ef6d74 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -970,10 +970,12 @@ instance.web.WebClient = instance.web.Client.extend({ }, show_login: function() { var self = this; + self.$('.oe_topbar').hide(); self.login.appendTo(self.$element); }, show_application: function() { var self = this; + self.$('.oe_topbar').show(); self.login.$element.hide(); self.menu = new instance.web.Menu(self); self.menu.replace(this.$element.find('.oe_menu_placeholder')); From 61f361bfee1ae021aedef0ebbf3c91d15083cf1a Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Tue, 24 Jul 2012 04:52:30 +0000 Subject: [PATCH 153/168] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120722044557-vi2dy3u2aq5y09v7 bzr revid: launchpad_translations_on_behalf_of_openerp-20120723051751-qjxz39bz1gs3fi6f bzr revid: launchpad_translations_on_behalf_of_openerp-20120724045230-9oi8x0xfvobpqjab --- addons/import_google/i18n/es.po | 217 +++ addons/knowledge/i18n/nb.po | 33 + addons/mrp/i18n/mn.po | 2231 ++++++++++++++++++++++++ addons/product_manufacturer/i18n/nb.po | 77 + addons/purchase_requisition/i18n/nb.po | 444 +++++ addons/sale_analytic_plans/i18n/nb.po | 28 + addons/sale_margin/i18n/nb.po | 52 + addons/sale_mrp/i18n/nb.po | 53 + addons/sale_order_dates/i18n/nb.po | 58 + addons/stock_location/i18n/nb.po | 400 +++++ addons/stock_planning/i18n/nb.po | 1178 +++++++++++++ 11 files changed, 4771 insertions(+) create mode 100644 addons/import_google/i18n/es.po create mode 100644 addons/knowledge/i18n/nb.po create mode 100644 addons/mrp/i18n/mn.po create mode 100644 addons/product_manufacturer/i18n/nb.po create mode 100644 addons/purchase_requisition/i18n/nb.po create mode 100644 addons/sale_analytic_plans/i18n/nb.po create mode 100644 addons/sale_margin/i18n/nb.po create mode 100644 addons/sale_mrp/i18n/nb.po create mode 100644 addons/sale_order_dates/i18n/nb.po create mode 100644 addons/stock_location/i18n/nb.po create mode 100644 addons/stock_planning/i18n/nb.po diff --git a/addons/import_google/i18n/es.po b/addons/import_google/i18n/es.po new file mode 100644 index 00000000000..325df15688c --- /dev/null +++ b/addons/import_google/i18n/es.po @@ -0,0 +1,217 @@ +# Spanish translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-07-21 21:08+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-22 04:45+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: import_google +#: help:synchronize.google.import,group_name:0 +msgid "Choose which group to import, By default it takes all." +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Import Google Calendar Events" +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "_Import Events" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:71 +#, python-format +msgid "" +"No Google Username or password Defined for user.\n" +"Please define in user view" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:127 +#, python-format +msgid "" +"Invalid login detail !\n" +" Specify Username/Password." +msgstr "" + +#. module: import_google +#: field:synchronize.google.import,supplier:0 +msgid "Supplier" +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Import Options" +msgstr "" + +#. module: import_google +#: field:synchronize.google.import,group_name:0 +msgid "Group Name" +msgstr "" + +#. module: import_google +#: model:ir.model,name:import_google.model_crm_case_categ +msgid "Category of Case" +msgstr "" + +#. module: import_google +#: model:ir.actions.act_window,name:import_google.act_google_login_contact_form +#: model:ir.ui.menu,name:import_google.menu_sync_contact +msgid "Import Google Contacts" +msgstr "" + +#. module: import_google +#: view:google.import.message:0 +msgid "Import Google Data" +msgstr "" + +#. module: import_google +#: view:crm.meeting:0 +msgid "Meeting Type" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google.py:38 +#: code:addons/import_google/wizard/import_google_data.py:28 +#, python-format +msgid "" +"Please install gdata-python-client from http://code.google.com/p/gdata-" +"python-client/downloads/list" +msgstr "" + +#. module: import_google +#: model:ir.model,name:import_google.model_google_login +msgid "Google Contact" +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Import contacts from a google account" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:133 +#, python-format +msgid "Please specify correct user and password !" +msgstr "" + +#. module: import_google +#: field:synchronize.google.import,customer:0 +msgid "Customer" +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "_Cancel" +msgstr "" + +#. module: import_google +#: model:ir.model,name:import_google.model_synchronize_google_import +msgid "synchronize.google.import" +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "_Import Contacts" +msgstr "" + +#. module: import_google +#: model:ir.actions.act_window,name:import_google.act_google_login_form +#: model:ir.ui.menu,name:import_google.menu_sync_calendar +msgid "Import Google Calendar" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:50 +#, python-format +msgid "Import google" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:127 +#: code:addons/import_google/wizard/import_google_data.py:133 +#, python-format +msgid "Error" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:71 +#, python-format +msgid "Warning !" +msgstr "" + +#. module: import_google +#: field:synchronize.google.import,create_partner:0 +msgid "Options" +msgstr "" + +#. module: import_google +#: view:google.import.message:0 +msgid "_Ok" +msgstr "" + +#. module: import_google +#: code:addons/import_google/wizard/import_google.py:38 +#: code:addons/import_google/wizard/import_google_data.py:28 +#, python-format +msgid "Google Contacts Import Error!" +msgstr "" + +#. module: import_google +#: model:ir.model,name:import_google.model_google_import_message +msgid "Import Message" +msgstr "" + +#. module: import_google +#: field:synchronize.google.import,calendar_name:0 +msgid "Calendar Name" +msgstr "" + +#. module: import_google +#: help:synchronize.google.import,supplier:0 +msgid "Check this box to set newly created partner as Supplier." +msgstr "" + +#. module: import_google +#: selection:synchronize.google.import,create_partner:0 +msgid "Import only address" +msgstr "" + +#. module: import_google +#: field:crm.case.categ,user_id:0 +msgid "User" +msgstr "" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Partner Status for this Group:" +msgstr "" + +#. module: import_google +#: field:google.import.message,name:0 +msgid "Message" +msgstr "" + +#. module: import_google +#: selection:synchronize.google.import,create_partner:0 +msgid "Create partner for each contact" +msgstr "" + +#. module: import_google +#: help:synchronize.google.import,customer:0 +msgid "Check this box to set newly created partner as Customer." +msgstr "" diff --git a/addons/knowledge/i18n/nb.po b/addons/knowledge/i18n/nb.po new file mode 100644 index 00000000000..6f721f133bb --- /dev/null +++ b/addons/knowledge/i18n/nb.po @@ -0,0 +1,33 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-07-23 10:30+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-24 04:52+0000\n" +"X-Generator: Launchpad (build 15668)\n" + +#. module: knowledge +#: model:ir.ui.menu,name:knowledge.menu_document2 +msgid "Collaborative Content" +msgstr "" + +#. module: knowledge +#: model:ir.ui.menu,name:knowledge.menu_document_configuration +msgid "Configuration" +msgstr "Konfigurasjon" + +#. module: knowledge +#: model:ir.ui.menu,name:knowledge.menu_document +msgid "Knowledge" +msgstr "Kunnskap" diff --git a/addons/mrp/i18n/mn.po b/addons/mrp/i18n/mn.po new file mode 100644 index 00000000000..7c97b68cc46 --- /dev/null +++ b/addons/mrp/i18n/mn.po @@ -0,0 +1,2231 @@ +# Mongolian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:49+0000\n" +"PO-Revision-Date: 2012-07-21 12:33+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Mongolian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-22 04:45+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: mrp +#: view:mrp.routing.workcenter:0 +msgid "Routing Work Centers" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_production_action +msgid "" +"Manufacturing Orders are usually proposed automatically by OpenERP based on " +"the bill of materials and the procurement rules, but you can also create " +"manufacturing orders manually. OpenERP will handle the consumption of the " +"raw materials (stock decrease) and the production of the finished products " +"(stock increase) when the order is processed." +msgstr "" + +#. module: mrp +#: help:mrp.production,location_src_id:0 +msgid "Location where the system will look for components." +msgstr "" + +#. module: mrp +#: field:mrp.production,workcenter_lines:0 +msgid "Work Centers Utilisation" +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_sugar_product_template +msgid "Sugar" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "No. Of Cycles" +msgstr "" + +#. module: mrp +#: field:mrp.routing.workcenter,cycle_nbr:0 +msgid "Number of Cycles" +msgstr "" + +#. module: mrp +#: model:product.uom.categ,name:mrp.product_uom_categ_fluid +msgid "Fluid" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_minimumstockprocure0 +msgid "" +"The 'Minimum stock rule' allows the system to create procurement orders " +"automatically as soon as the minimum stock is reached." +msgstr "" + +#. module: mrp +#: field:mrp.production,picking_id:0 +msgid "Picking list" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:130 +#, python-format +msgid "Hourly Cost" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:139 +#, python-format +msgid "Cost Price per Uom" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Scrap Products" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_routing_action +#: model:ir.ui.menu,name:mrp.menu_mrp_routing_action +msgid "Routings" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,product_id:0 +msgid "Work Center Product" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Search Bill Of Material" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_stockproduct1 +msgid "For stockable products and consumables" +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_stockproduction0 +msgid "To Produce" +msgstr "" + +#. module: mrp +#: help:mrp.routing.workcenter,cycle_nbr:0 +msgid "" +"Number of iterations this work center has to do in the specified operation " +"of the routing." +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +#: field:mrp.bom,code:0 +#: view:mrp.production:0 +#: field:mrp.production,name:0 +msgid "Reference" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Finished Products" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Manufacturing Orders which are currently in production." +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_servicerfq0 +#: model:process.transition,name:mrp.process_transition_stockrfq0 +msgid "To Buy" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_purchaseprocure0 +msgid "The system launches automatically a RFQ to the preferred supplier." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Products to Finish" +msgstr "" + +#. module: mrp +#: selection:mrp.bom,method:0 +msgid "Set / Pack" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,state:0 +msgid "State" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_hour:0 +msgid "Cost per hour" +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_orange_product_template +msgid "Orange" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_servicemts0 +msgid "" +"This is used in case of a service without any impact in the system, a " +"training session for instance." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "UOM" +msgstr "" + +#. module: mrp +#: field:change.production.qty,product_qty:0 +#: field:mrp.bom,product_qty:0 +#: field:mrp.production,product_qty:0 +#: field:mrp.production.product.line,product_qty:0 +msgid "Product Qty" +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,product_id:0 +msgid "" +"Fill this product to track easily your production costs in the analytic " +"accounting." +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_purchaseprocure0 +msgid "For purchased material" +msgstr "" + +#. module: mrp +#: field:mrp.bom.revision,indice:0 +msgid "Revision" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.product_form_config_action +msgid "" +"Create a product form for everything you buy or sell. Specify a supplier if " +"the product can be purchased." +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.next_id_77 +msgid "Reporting" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_cycle_account_id:0 +msgid "Cycle Account" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:130 +#, python-format +msgid "Work Cost" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "[" +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_procureserviceproduct0 +msgid "Procurement of services" +msgstr "" + +#. module: mrp +#: view:mrp.workcenter:0 +msgid "Capacity Information" +msgstr "" + +#. module: mrp +#: field:mrp.production,move_created_ids2:0 +msgid "Produced Products" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Destination Location" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_mrp_bom +msgid "Master Data" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_stockmts0 +msgid "" +"The system waits for the products to be available in the stock. These " +"products are typically procured manually or through a minimum stock rule." +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Partner Ref" +msgstr "" + +#. module: mrp +#: field:mrp.production,origin:0 +#: report:mrp.production.order:0 +msgid "Source Document" +msgstr "" + +#. module: mrp +#: field:mrp.production,product_lines:0 +msgid "Scheduled goods" +msgstr "" + +#. module: mrp +#: selection:mrp.bom,type:0 +msgid "Sets / Phantom" +msgstr "" + +#. module: mrp +#: help:mrp.bom,position:0 +msgid "Reference to a position in an external plan." +msgstr "" + +#. module: mrp +#: constraint:stock.move:0 +msgid "You try to assign a lot which is not from the same product" +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_cloth_product_template +msgid "Cloth" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_product_produce +msgid "Product Produce" +msgstr "" + +#. module: mrp +#: constraint:mrp.bom:0 +msgid "Error ! You cannot create recursive BoM." +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_routing_workcenter +msgid "Work Center Usage" +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_procurestockableproduct0 +msgid "Procurement of stockable Product" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Default UOM" +msgstr "" + +#. module: mrp +#: sql_constraint:mrp.production:0 +#: sql_constraint:stock.picking:0 +msgid "Reference must be unique per Company!" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:139 +#: report:bom.structure:0 +#: field:mrp.product_price,number:0 +#: report:mrp.production.order:0 +#, python-format +msgid "Quantity" +msgstr "" + +#. module: mrp +#: field:mrp.production.workcenter.line,hour:0 +msgid "Nbr of hours" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Confirm Production" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_stockproduct0 +msgid "" +"The system creates an order (production or purchased) depending on the sold " +"quantity and the products parameters." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_stockproduction0 +msgid "" +"In case the Supply method of the product is Produce, the system creates a " +"production order." +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_property_action +msgid "" +"The Properties in OpenERP are used to select the right bill of materials for " +"manufacturing a product when you have different ways of building the same " +"product. You can assign several properties to each Bill of Materials. When a " +"sales person creates a sales order, he can relate it to several properties " +"and OpenERP will automatically select the BoM to use according the needs." +msgstr "" + +#. module: mrp +#: help:mrp.production,picking_id:0 +msgid "" +"This is the Internal Picking List that brings the finished product to the " +"production plan" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_search_mrp +msgid "Working Time" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action_report_in_out_picking_tree +msgid "Weekly Stock Value Variation" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,date_planned_date:0 +#: report:mrp.production.order:0 +msgid "Scheduled Date" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Component Product" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Bill Of Material" +msgstr "" + +#. module: mrp +#: help:mrp.routing,location_id:0 +msgid "" +"Keep empty if you produce at the location where the finished products are " +"needed.Set a location if you produce at a fixed location. This can be a " +"partner location if you subcontract the manufacturing operations." +msgstr "" + +#. module: mrp +#: view:board.board:0 +msgid "Stock Value Variation" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action2 +msgid "Bill of Materials Structure" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_serviceproduct0 +msgid "Product type is service" +msgstr "" + +#. module: mrp +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_property_group_action +msgid "" +"Define specific property groups that can be assigned to the properties of " +"your bill of materials." +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,costs_cycle:0 +msgid "Specify Cost of Work Center per cycle." +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_bom0 +msgid "Manufacturing decomposition" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_serviceproduct1 +msgid "For Services." +msgstr "" + +#. module: mrp +#: field:mrp.bom.revision,date:0 +msgid "Modification Date" +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,costs_cycle_account_id:0 +#: help:mrp.workcenter,costs_hour_account_id:0 +msgid "" +"Complete this only if you want automatic analytic accounting entries on " +"production orders." +msgstr "" + +#. module: mrp +#: field:mrp.production.workcenter.line,cycle:0 +msgid "Nbr of cycles" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_orderrfq0 +#: model:process.node,note:mrp.process_node_rfq0 +msgid "Request for Quotation." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_billofmaterialrouting0 +msgid "" +"The Bill of Material is linked to a routing, i.e. the succession of work " +"centers." +msgstr "" + +#. module: mrp +#: constraint:product.product:0 +msgid "Error: Invalid ean code" +msgstr "" + +#. module: mrp +#: field:mrp.production,move_created_ids:0 +msgid "Products to Produce" +msgstr "" + +#. module: mrp +#: view:mrp.routing:0 +#: field:mrp.routing,location_id:0 +msgid "Production Location" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Change Qty" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action_configure_workcenter +msgid "Configure your work centers" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Force Reservation" +msgstr "" + +#. module: mrp +#: field:mrp.bom.revision,author_id:0 +msgid "Author" +msgstr "" + +#. module: mrp +#: field:report.mrp.inout,value:0 +msgid "Stock value" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action_product_bom_structure +msgid "Product BoM Structure" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Search Production" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:139 +#, python-format +msgid "Supplier Price per Uom" +msgstr "" + +#. module: mrp +#: help:mrp.routing.workcenter,sequence:0 +msgid "" +"Gives the sequence order when displaying a list of routing Work Centers." +msgstr "" + +#. module: mrp +#: constraint:stock.move:0 +msgid "You can not move products from or to a location of the type view." +msgstr "" + +#. module: mrp +#: field:mrp.bom,child_complete_ids:0 +msgid "BoM Hierarchy" +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_uom:0 +#: field:mrp.production,product_uom:0 +#: field:mrp.production.product.line,product_uom:0 +msgid "Product UOM" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Picking Exception" +msgstr "" + +#. module: mrp +#: field:mrp.bom,bom_lines:0 +msgid "BoM Lines" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,time_start:0 +msgid "Time before prod." +msgstr "" + +#. module: mrp +#: help:mrp.routing,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the routing " +"without removing it." +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_billofmaterialrouting0 +msgid "Material Routing" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,move_lines2:0 +#: report:mrp.production.order:0 +msgid "Consumed Products" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action_mrp_workcenter_load_wizard +#: model:ir.model,name:mrp.model_mrp_workcenter_load +#: model:ir.model,name:mrp.model_report_workcenter_load +msgid "Work Center Load" +msgstr "" + +#. module: mrp +#: code:addons/mrp/procurement.py:43 +#, python-format +msgid "No BoM defined for this product !" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action2 +#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action2 +msgid "Bill of Material Components" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_mrp_planning +msgid "Planning" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Ready" +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_buttons_product_template +msgid "Shirt Buttons" +msgstr "" + +#. module: mrp +#: help:mrp.production,routing_id:0 +msgid "" +"The list of operations (list of work centers) to produce the finished " +"product. The routing is mainly used to compute work center costs during " +"operations and to plan future loads on work centers based on production " +"plannification." +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,time_cycle:0 +msgid "Time in hours for doing one cycle." +msgstr "" + +#. module: mrp +#: constraint:mrp.bom:0 +msgid "BoM line product should not be same as BoM product." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "In Production" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_mrp_property +msgid "Master Bill of Materials" +msgstr "" + +#. module: mrp +#: help:mrp.bom,product_uos:0 +msgid "" +"Product UOS (Unit of Sale) is the unit of measurement for the invoicing and " +"promotion of stock." +msgstr "" + +#. module: mrp +#: view:mrp.product_price:0 +#: view:mrp.workcenter.load:0 +msgid "Print" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +#: view:mrp.workcenter:0 +msgid "Type" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_minimumstockrule0 +msgid "Linked to the 'Minimum stock rule' supplying method." +msgstr "" + +#. module: mrp +#: selection:mrp.workcenter.load,time_unit:0 +msgid "Per month" +msgstr "" + +#. module: mrp +#: code:addons/mrp/wizard/change_production_qty.py:78 +#: code:addons/mrp/wizard/change_production_qty.py:83 +#, python-format +msgid "Couldn't find bill of material for product" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "Product Name" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:503 +#, python-format +msgid "Invalid action !" +msgstr "" + +#. module: mrp +#: help:mrp.bom,product_efficiency:0 +msgid "A factor of 0.9 means a loss of 10% within the production process." +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:734 +#: code:addons/mrp/mrp.py:762 +#, python-format +msgid "Warning!" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Printing date" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_orderrfq0 +#: model:process.node,name:mrp.process_node_rfq0 +msgid "RFQ" +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_producttostockrules0 +msgid "Procurement rule" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Partial" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "WorkCenter" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_procureserviceproduct0 +msgid "" +"Depending on the chosen method to 'supply' the service, the procurement " +"order creates a RFQ for a subcontracting purchase order or waits until the " +"service is done (= the delivery of the products)." +msgstr "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "Urgent" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Manufacturing Orders which are waiting for raw materials." +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_workcenter_action +msgid "" +"Work Centers allow you to create and manage manufacturing units. They " +"consist of workers and/or machines, which are considered as units for " +"capacity and planning forecast. Keep in mind that the working time and " +"resource leave are not taken into account in the time computation of the " +"work center." +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_production +msgid "Manufacturing Order" +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_productionprocureproducts0 +msgid "Procurement of raw material" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,cycle_total:0 +msgid "Total Cycles" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Ready to Produce" +msgstr "" + +#. module: mrp +#: field:mrp.bom.revision,name:0 +msgid "Modification name" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +#: view:mrp.production:0 +msgid "Date" +msgstr "" + +#. module: mrp +#: field:mrp.bom,type:0 +msgid "BoM Type" +msgstr "" + +#. module: mrp +#: code:addons/mrp/procurement.py:45 +#, python-format +msgid "" +"Procurement '%s' has an exception: 'No BoM defined for this product !'" +msgstr "" + +#. module: mrp +#: view:mrp.property:0 +msgid "Search" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:626 +#, python-format +msgid "Could not cancel manufacturing order !" +msgstr "" + +#. module: mrp +#: field:report.workcenter.load,cycle:0 +msgid "Nbr of cycle" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_res_company +msgid "Companies" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:627 +#, python-format +msgid "" +"You must first cancel related internal picking attached to this " +"manufacturing order." +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_minimumstockrule0 +#: model:process.node,name:mrp.process_node_productminimumstockrule0 +msgid "Minimum Stock" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:503 +#, python-format +msgid "Cannot delete a manufacturing order in state '%s'" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menus_dash_mrp +msgid "Dashboard" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:160 +#: code:addons/mrp/report/price.py:211 +#, python-format +msgid "Total Cost of %s %s" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_stockproduct0 +#: model:process.node,name:mrp.process_node_stockproduct1 +#: model:process.process,name:mrp.process_process_stockableproductprocess0 +msgid "Stockable Product" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:130 +#, python-format +msgid "Work Center name" +msgstr "" + +#. module: mrp +#: field:mrp.routing,code:0 +msgid "Code" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "No. Of Hours" +msgstr "" + +#. module: mrp +#: view:mrp.property:0 +#: view:mrp.property.group:0 +msgid "Property Group" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Qty" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_production0 +msgid "Manufacturing Plan." +msgstr "" + +#. module: mrp +#: view:mrp.routing:0 +#: view:mrp.workcenter:0 +msgid "Inactive" +msgstr "" + +#. module: mrp +#: view:change.production.qty:0 +#: view:mrp.product.produce:0 +#: view:mrp.product_price:0 +#: view:mrp.production:0 +#: view:mrp.workcenter.load:0 +msgid "Cancel" +msgstr "" + +#. module: mrp +#: code:addons/mrp/wizard/change_production_qty.py:63 +#, python-format +msgid "Active Id is not found" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_servicerfq0 +msgid "" +"If the service has a 'Buy' supply method, this creates a RFQ, a " +"subcontracting demand for instance." +msgstr "" + +#. module: mrp +#: field:mrp.production,move_prod_id:0 +msgid "Move product" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Late" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_servicemts0 +msgid "Make to stock" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "BOM Name" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Start Production" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.open_board_manufacturing +#: model:ir.ui.menu,name:mrp.menu_board_manufacturing +msgid "Production Dashboard" +msgstr "" + +#. module: mrp +#: model:res.groups,name:mrp.group_mrp_manager +msgid "Manager" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Source Loc." +msgstr "" + +#. module: mrp +#: field:mrp.bom,position:0 +msgid "Internal Reference" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_billofmaterial0 +msgid "Product's structure" +msgstr "" + +#. module: mrp +#: field:mrp.bom,name:0 +#: report:mrp.production.order:0 +#: field:mrp.production.product.line,name:0 +#: field:mrp.routing,name:0 +#: field:mrp.routing.workcenter,name:0 +msgid "Name" +msgstr "" + +#. module: mrp +#: field:mrp.product.produce,mode:0 +msgid "Mode" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "]" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter.load,measure_unit:0 +msgid "Amount measuring unit" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning +msgid "" +"Manufacturing Orders describe the operations that need to be carried out and " +"the raw materials usage for each production stage. You use specifications " +"(bills of materials or BoM) to work out the raw material requirements and " +"the manufacturing orders needed for the finished products. Once the bills of " +"materials have been defined, OpenERP is capable of automatically deciding on " +"the manufacturing route depending on the needs of the company." +msgstr "" + +#. module: mrp +#: model:ir.actions.todo.category,name:mrp.category_mrp_config +msgid "MRP Management" +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,costs_hour:0 +msgid "Specify Cost of Work Center per hour." +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,capacity_per_cycle:0 +msgid "" +"Number of operations this Work Center can do in parallel. If this Work " +"Center represents a team of 5 workers, the capacity per cycle is 5." +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_production_action3 +msgid "Manufacturing Orders in Progress" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +#: view:mrp.production:0 +#: view:mrp.property:0 +#: view:mrp.routing:0 +#: view:mrp.workcenter:0 +msgid "Group By..." +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:130 +#, python-format +msgid "Cycles Cost" +msgstr "" + +#. module: mrp +#: selection:mrp.workcenter.load,measure_unit:0 +msgid "Amount in cycles" +msgstr "" + +#. module: mrp +#: field:mrp.production,location_dest_id:0 +msgid "Finished Products Location" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_pm_resources_config +msgid "Resources" +msgstr "" + +#. module: mrp +#: help:mrp.routing.workcenter,hour_nbr:0 +msgid "" +"Time in hours for this Work Center to achieve the operation of the specified " +"routing." +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_journal_id:0 +msgid "Analytic Journal" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_workcenter_action +#: model:ir.ui.menu,name:mrp.menu_view_resource_search_mrp +#: field:mrp.routing,workcenter_lines:0 +msgid "Work Centers" +msgstr "" + +#. module: mrp +#: selection:mrp.workcenter.load,time_unit:0 +msgid "Per week" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_routing_action +msgid "" +"Routings allow you to create and manage the manufacturing operations that " +"should be followed within your work centers in order to produce a product. " +"They are attached to bills of materials that will define the required raw " +"materials." +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.product_form_config_action +msgid "Create or Import Products" +msgstr "" + +#. module: mrp +#: field:report.workcenter.load,hour:0 +msgid "Nbr of hour" +msgstr "" + +#. module: mrp +#: view:mrp.routing:0 +msgid "Work Center Operations" +msgstr "" + +#. module: mrp +#: view:mrp.routing:0 +msgid "Notes" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Manufacturing Orders which are ready to start production." +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_bom +#: view:mrp.bom:0 +#: field:mrp.production,bom_id:0 +#: model:process.node,name:mrp.process_node_billofmaterial0 +msgid "Bill of Material" +msgstr "" + +#. module: mrp +#: view:mrp.workcenter.load:0 +msgid "Select time unit" +msgstr "" + +#. module: mrp +#: view:report.workcenter.load:0 +msgid "Work Center load" +msgstr "" + +#. module: mrp +#: help:mrp.production,location_dest_id:0 +msgid "Location where the system will stock the finished products." +msgstr "" + +#. module: mrp +#: help:mrp.routing.workcenter,routing_id:0 +msgid "" +"Routing indicates all the Work Centers used, for how long and/or cycles.If " +"Routing is indicated then,the third tab of a production order (Work Centers) " +"will be automatically pre-completed." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_producttostockrules0 +msgid "" +"The Minimum Stock Rule is an automatic procurement rule based on a mini and " +"maxi quantity. It's available in the Inventory management menu and " +"configured by product." +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:187 +#, python-format +msgid "Components Cost of %s %s" +msgstr "" + +#. module: mrp +#: selection:mrp.workcenter.load,time_unit:0 +msgid "Day by day" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Revisions" +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_shirt_product_template +msgid "Shirt" +msgstr "" + +#. module: mrp +#: field:mrp.production,priority:0 +msgid "Priority" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_stock_picking +msgid "Picking List" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:1000 +#, python-format +msgid "Manufacturing order '%s' is scheduled for the %s." +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Production Order N° :" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:647 +#, python-format +msgid "Manufacturing order '%s' is ready to produce." +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:204 +#, python-format +msgid "Work Cost of %s %s" +msgstr "" + +#. module: mrp +#: help:res.company,manufacturing_lead:0 +msgid "Security days for each manufacturing operation." +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_water_product_template +msgid "Water" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Component Name" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_mts0 +#: model:process.transition,name:mrp.process_transition_servicemts0 +#: model:process.transition,name:mrp.process_transition_stockmts0 +msgid "Make to Stock" +msgstr "" + +#. module: mrp +#: constraint:mrp.production:0 +msgid "Order quantity cannot be negative or zero!" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action +msgid "" +"Master Bills of Materials allow you to create and manage the list of " +"necessary raw materials used to make a finished product. OpenERP will use " +"these BoMs to automatically propose manufacturing orders according to " +"product needs. You can either create a bill of materials to define specific " +"production steps or define a single multi-level bill of materials." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_stockrfq0 +msgid "" +"In case the Supply method of the product is Buy, the system creates a " +"purchase order." +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_procurement_order +msgid "Procurement" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action_view_mrp_product_price_wizard +#: view:mrp.product_price:0 +msgid "Product Cost Structure" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:139 +#, python-format +msgid "Components suppliers" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Production Work Centers" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Split in production lots" +msgstr "" + +#. module: mrp +#: view:mrp.workcenter:0 +msgid "Search for mrp workcenter" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "BoM Structure" +msgstr "" + +#. module: mrp +#: field:mrp.production,date_start:0 +msgid "Start Date" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_hour_account_id:0 +msgid "Hour Account" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Destination Loc." +msgstr "" + +#. module: mrp +#: field:mrp.bom,method:0 +msgid "Method" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Pending" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:603 +#, python-format +msgid "Couldn't find a bill of material for this product." +msgstr "" + +#. module: mrp +#: field:mrp.bom,active:0 +#: field:mrp.routing,active:0 +msgid "Active" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_procureproducts0 +msgid "Procure Products" +msgstr "" + +#. module: mrp +#: view:report.workcenter.load:0 +msgid "Work Center Loads" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_bom_revision +msgid "Bill of Material Revision" +msgstr "" + +#. module: mrp +#: help:mrp.production,origin:0 +msgid "" +"Reference of the document that generated this production order request." +msgstr "" + +#. module: mrp +#: sql_constraint:mrp.bom:0 +msgid "" +"All product quantities must be greater than 0.\n" +"You should install the mrp_subproduct module if you want to manage extra " +"products on BoMs !" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Extra Information" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_change_production_qty +msgid "Change Quantity of Products" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_productionorder0 +msgid "Drives the procurement orders for raw material." +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_general_account_id:0 +msgid "General Account" +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "SO Number" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Done" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_production_action4 +msgid "Manufacturing Orders Waiting Products" +msgstr "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "Not urgent" +msgstr "" + +#. module: mrp +#: field:mrp.production,user_id:0 +msgid "Responsible" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_production_action2 +msgid "Manufacturing Orders To Start" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_workcenter +#: field:mrp.production.workcenter.line,workcenter_id:0 +#: field:mrp.routing.workcenter,workcenter_id:0 +#: view:mrp.workcenter:0 +#: field:report.workcenter.load,workcenter_id:0 +msgid "Work Center" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,capacity_per_cycle:0 +msgid "Capacity per Cycle" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_product_product +#: view:mrp.bom:0 +#: field:mrp.bom,product_id:0 +#: view:mrp.production:0 +#: field:mrp.production,product_id:0 +#: report:mrp.production.order:0 +#: field:mrp.production.product.line,product_id:0 +msgid "Product" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,hour_total:0 +msgid "Total Hours" +msgstr "" + +#. module: mrp +#: field:mrp.production,location_src_id:0 +msgid "Raw Materials Location" +msgstr "" + +#. module: mrp +#: view:mrp.product_price:0 +msgid "Print Cost Structure of Product." +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_uos:0 +#: field:mrp.production.product.line,product_uos:0 +msgid "Product UOS" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Consume Products" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.act_mrp_product_produce +#: view:mrp.product.produce:0 +#: view:mrp.production:0 +msgid "Produce" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_stock0 +#: model:process.transition,name:mrp.process_transition_servicemto0 +#: model:process.transition,name:mrp.process_transition_stockproduct0 +msgid "Make to Order" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:358 +#, python-format +msgid "Copy" +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,note:0 +msgid "" +"Description of the Work Center. Explain here what's a cycle according to " +"this Work Center." +msgstr "" + +#. module: mrp +#: view:mrp.production.lot.line:0 +msgid "Production Products" +msgstr "" + +#. module: mrp +#: field:mrp.production,date_finished:0 +msgid "End Date" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,resource_id:0 +msgid "Resource" +msgstr "" + +#. module: mrp +#: help:mrp.bom,date_start:0 +#: help:mrp.bom,date_stop:0 +msgid "Validity of this BoM or component. Keep empty if it's always valid." +msgstr "" + +#. module: mrp +#: field:mrp.production,product_uos:0 +msgid "Product UoS" +msgstr "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "Very Urgent" +msgstr "" + +#. module: mrp +#: help:mrp.bom,routing_id:0 +msgid "" +"The list of operations (list of work centers) to produce the finished " +"product. The routing is mainly used to compute work center costs during " +"operations and to plan future loads on work centers based on production " +"planning." +msgstr "" + +#. module: mrp +#: view:change.production.qty:0 +msgid "Approve" +msgstr "" + +#. module: mrp +#: view:mrp.property.group:0 +msgid "Properties categories" +msgstr "" + +#. module: mrp +#: help:mrp.production.workcenter.line,sequence:0 +msgid "Gives the sequence order when displaying a list of work orders." +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Source Location" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: view:mrp.production.product.line:0 +msgid "Scheduled Products" +msgstr "" + +#. module: mrp +#: view:mrp.production.lot.line:0 +msgid "Production Products Consommation" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.act_product_manufacturing_open +#: model:ir.actions.act_window,name:mrp.mrp_production_action +#: model:ir.actions.act_window,name:mrp.mrp_production_action_planning +#: model:ir.ui.menu,name:mrp.menu_mrp_production_action +#: model:ir.ui.menu,name:mrp.menu_mrp_production_order_action +#: view:mrp.production:0 +msgid "Manufacturing Orders" +msgstr "" + +#. module: mrp +#: help:mrp.product.produce,mode:0 +msgid "" +"'Consume only' mode will only consume the products with the quantity " +"selected.\n" +"'Consume & Produce' mode will consume as well as produce the products with " +"the quantity selected and it will finish the production order when total " +"ordered quantities are produced." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: report:mrp.production.order:0 +msgid "Work Orders" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_cycle:0 +msgid "Cost per cycle" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_serviceproduct0 +#: model:process.node,name:mrp.process_node_serviceproduct1 +msgid "Service" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Cancelled" +msgstr "" + +#. module: mrp +#: help:mrp.bom,product_uom:0 +msgid "" +"UoM (Unit of Measure) is the unit of measurement for the inventory control" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:734 +#, python-format +msgid "" +"You are going to consume total %s quantities of \"%s\".\n" +"But you can only consume up to total %s quantities." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_bom0 +msgid "" +"The Bill of Material is the product's decomposition. The components (that " +"are products themselves) can also have their own Bill of Material (multi-" +"level)." +msgstr "" + +#. module: mrp +#: field:mrp.bom,company_id:0 +#: field:mrp.production,company_id:0 +#: field:mrp.routing,company_id:0 +#: field:mrp.routing.workcenter,company_id:0 +#: view:mrp.workcenter:0 +msgid "Company" +msgstr "" + +#. module: mrp +#: selection:mrp.workcenter.load,measure_unit:0 +msgid "Amount in hours" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,time_cycle:0 +msgid "Time for 1 cycle (hour)" +msgstr "" + +#. module: mrp +#: model:ir.actions.report.xml,name:mrp.report_mrp_production_report +#: field:mrp.production.product.line,production_id:0 +#: field:mrp.production.workcenter.line,production_id:0 +#: model:process.node,name:mrp.process_node_production0 +#: model:process.node,name:mrp.process_node_productionorder0 +msgid "Production Order" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_productminimumstockrule0 +msgid "Automatic procurement rule" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Compute Data" +msgstr "" + +#. module: mrp +#: field:mrp.production,product_uos_qty:0 +msgid "Product UoS Qty" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:139 +#: view:mrp.bom:0 +#, python-format +msgid "Components" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +#: model:ir.actions.report.xml,name:mrp.report_bom_structure +msgid "BOM Structure" +msgstr "" + +#. module: mrp +#: field:mrp.bom,date_stop:0 +msgid "Valid Until" +msgstr "" + +#. module: mrp +#: field:mrp.bom,date_start:0 +msgid "Valid From" +msgstr "" + +#. module: mrp +#: selection:mrp.bom,type:0 +msgid "Normal BoM" +msgstr "" + +#. module: mrp +#: field:res.company,manufacturing_lead:0 +msgid "Manufacturing Lead Time" +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_uos_qty:0 +#: field:mrp.production.product.line,product_uos_qty:0 +msgid "Product UOS Qty" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.action_report_in_out_picking_tree +msgid "" +"Weekly Stock Value Variation enables you to track the stock value evolution " +"linked to manufacturing activities, receptions of products and delivery " +"orders." +msgstr "" + +#. module: mrp +#: view:mrp.product.produce:0 +msgid "Confirm" +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_efficiency:0 +msgid "Manufacturing Efficiency" +msgstr "" + +#. module: mrp +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: mrp +#: help:mrp.bom,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the bills of " +"material without removing it." +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_rounding:0 +msgid "Product Rounding" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "New" +msgstr "" + +#. module: mrp +#: selection:mrp.product.produce,mode:0 +msgid "Consume Only" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Recreate Picking" +msgstr "" + +#. module: mrp +#: help:mrp.bom,type:0 +msgid "" +"If a sub-product is used in several products, it can be useful to create its " +"own BoM. Though if you don't want separated production orders for this sub-" +"product, select Set/Phantom as BoM type. If a Phantom BoM is used for a root " +"product, it will be sold and shipped as a set of components, instead of " +"being produced." +msgstr "" + +#. module: mrp +#: help:mrp.production,state:0 +msgid "" +"When the production order is created the state is set to 'Draft'.\n" +" If the order is confirmed the state is set to 'Waiting Goods'.\n" +" If any exceptions are there, the state is set to 'Picking Exception'. " +" \n" +"If the stock is available then the state is set to 'Ready to Produce'.\n" +" When the production gets started then the state is set to 'In Production'.\n" +" When the production is over, the state is set to 'Done'." +msgstr "" + +#. module: mrp +#: selection:mrp.bom,method:0 +msgid "On Order" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_mrp_configuration +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Starting Date" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,time_stop:0 +msgid "Time after prod." +msgstr "" + +#. module: mrp +#: field:mrp.workcenter.load,time_unit:0 +msgid "Type of period" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Total Qty" +msgstr "" + +#. module: mrp +#: field:mrp.routing.workcenter,hour_nbr:0 +msgid "Number of Hours" +msgstr "" + +#. module: mrp +#: view:mrp.workcenter:0 +msgid "Costing Information" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_purchaseprocure0 +msgid "Procurement Orders" +msgstr "" + +#. module: mrp +#: help:mrp.bom,product_rounding:0 +msgid "Rounding applied on the product quantity." +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_stock0 +msgid "Assignment from Production or Purchase Order." +msgstr "" + +#. module: mrp +#: field:mrp.routing.workcenter,routing_id:0 +msgid "Parent Routing" +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,time_start:0 +msgid "Time in hours for the setup." +msgstr "" + +#. module: mrp +#: model:product.template,name:mrp.product_orangejuice_product_template +msgid "Orange Juice" +msgstr "" + +#. module: mrp +#: field:mrp.bom.revision,bom_id:0 +#: field:procurement.order,bom_id:0 +msgid "BoM" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_report_mrp_inout +#: view:report.mrp.inout:0 +msgid "Stock value variation" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_mts0 +#: model:process.node,note:mrp.process_node_servicemts0 +msgid "Assignment from stock." +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Waiting Goods" +msgstr "" + +#. module: mrp +#: field:mrp.bom.revision,last_indice:0 +msgid "last indice" +msgstr "" + +#. module: mrp +#: field:mrp.bom,revision_ids:0 +#: view:mrp.bom.revision:0 +msgid "BoM Revisions" +msgstr "" + +#. module: mrp +#: field:report.mrp.inout,date:0 +#: field:report.workcenter.load,name:0 +msgid "Week" +msgstr "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "Normal" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Production started late" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_routing0 +msgid "Manufacturing Steps." +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:146 +#: model:ir.actions.report.xml,name:mrp.report_cost_structure +#, python-format +msgid "Cost Structure" +msgstr "" + +#. module: mrp +#: model:res.groups,name:mrp.group_mrp_user +msgid "User" +msgstr "" + +#. module: mrp +#: selection:mrp.product.produce,mode:0 +msgid "Consume & Produce" +msgstr "" + +#. module: mrp +#: field:mrp.bom,bom_id:0 +msgid "Parent BoM" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "BOM Ref" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action2 +msgid "" +"Bills of materials components are components and sub-products used to create " +"master bills of materials. Use this menu to search in which BoM a specific " +"component is used." +msgstr "" + +#. module: mrp +#: model:product.uom,name:mrp.product_uom_litre +msgid "Litre" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:762 +#, python-format +msgid "" +"You are going to produce total %s quantities of \"%s\".\n" +"But you can only produce up to total %s quantities." +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_stockproduct0 +msgid "Product type is Stockable or Consumable." +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:603 +#: code:addons/mrp/wizard/change_production_qty.py:78 +#: code:addons/mrp/wizard/change_production_qty.py:83 +#, python-format +msgid "Error" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Production Started" +msgstr "" + +#. module: mrp +#: field:mrp.product.produce,product_qty:0 +msgid "Select Quantity" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.act_product_product_2_mrp_bom +#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action +#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action +#: field:product.product,bom_ids:0 +msgid "Bill of Materials" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_property_action +#: model:ir.ui.menu,name:mrp.menu_mrp_property_action +#: view:mrp.bom:0 +#: field:mrp.bom,property_ids:0 +#: view:mrp.property:0 +#: view:procurement.order:0 +#: field:procurement.order,property_ids:0 +msgid "Properties" +msgstr "" + +#. module: mrp +#: view:mrp.routing.workcenter:0 +#: view:mrp.workcenter:0 +msgid "General Information" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Productions" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_routing +#: view:mrp.bom:0 +#: field:mrp.bom,routing_id:0 +#: view:mrp.production:0 +#: field:mrp.production,routing_id:0 +#: view:mrp.routing:0 +#: model:process.node,name:mrp.process_node_routing0 +msgid "Routing" +msgstr "" + +#. module: mrp +#: field:mrp.production,date_planned:0 +msgid "Scheduled date" +msgstr "" + +#. module: mrp +#: constraint:stock.move:0 +msgid "You must assign a production lot for this product" +msgstr "" + +#. module: mrp +#: field:stock.move,production_id:0 +msgid "Production" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_production_workcenter_line +#: field:mrp.production.workcenter.line,name:0 +msgid "Work Order" +msgstr "" + +#. module: mrp +#: view:board.board:0 +msgid "Procurements in Exception" +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_minimumstockprocure0 +msgid "'Minimum stock rule' material" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_product_price +msgid "Product Price" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_stock_move_split +msgid "Split in Production lots" +msgstr "" + +#. module: mrp +#: view:change.production.qty:0 +msgid "Change Quantity" +msgstr "" + +#. module: mrp +#: view:change.production.qty:0 +#: model:ir.actions.act_window,name:mrp.action_change_production_qty +msgid "Change Product Qty" +msgstr "" + +#. module: mrp +#: view:mrp.bom.revision:0 +#: field:mrp.bom.revision,description:0 +#: view:mrp.property:0 +#: view:mrp.property.group:0 +#: field:mrp.routing,note:0 +#: view:mrp.routing.workcenter:0 +#: field:mrp.routing.workcenter,note:0 +#: view:mrp.workcenter:0 +#: field:mrp.workcenter,note:0 +msgid "Description" +msgstr "" + +#. module: mrp +#: view:board.board:0 +msgid "Manufacturing board" +msgstr "" + +#. module: mrp +#: field:mrp.production,date_planned_end:0 +msgid "Scheduled End Date" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_procureproducts0 +msgid "The way to procurement depends on the product type." +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_mrp_manufacturing +msgid "Manufacturing" +msgstr "" + +#. module: mrp +#: view:board.board:0 +msgid "Next Production Orders" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_property_group_action +#: model:ir.ui.menu,name:mrp.menu_mrp_property_group_action +msgid "Property Groups" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_procurestockableproduct0 +msgid "" +"Depending on the chosen method to supply the stockable products, the " +"procurement order creates a RFQ, a production order, ... " +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:874 +#: code:addons/mrp/mrp.py:929 +#: code:addons/mrp/mrp.py:954 +#, python-format +msgid "PROD: %s" +msgstr "" + +#. module: mrp +#: help:mrp.workcenter,time_stop:0 +msgid "Time in hours for the cleaning." +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_purchaseprocure0 +msgid "Automatic RFQ" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_servicemto0 +msgid "" +"If the service has a 'Produce' supply method, this creates a task in the " +"project management module of OpenERP." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_productionprocureproducts0 +msgid "" +"In order to supply raw material (to be purchased or produced), the " +"production order creates as much procurement orders as components listed in " +"the BOM, through a run of the schedulers (MRP)." +msgstr "" + +#. module: mrp +#: help:mrp.product_price,number:0 +msgid "" +"Specify quantity of products to produce or buy. Report of Cost structure " +"will be displayed base on this quantity." +msgstr "" + +#. module: mrp +#: selection:mrp.bom,method:0 +msgid "On Stock" +msgstr "" + +#. module: mrp +#: field:mrp.bom,sequence:0 +#: report:mrp.production.order:0 +#: field:mrp.production.workcenter.line,sequence:0 +#: field:mrp.routing.workcenter,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_leaves_search_mrp +msgid "Resource Leaves" +msgstr "" + +#. module: mrp +#: help:mrp.bom,sequence:0 +msgid "Gives the sequence order when displaying a list of bills of material." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,move_lines:0 +#: report:mrp.production.order:0 +msgid "Products to Consume" +msgstr "" diff --git a/addons/product_manufacturer/i18n/nb.po b/addons/product_manufacturer/i18n/nb.po new file mode 100644 index 00000000000..8646155eb4a --- /dev/null +++ b/addons/product_manufacturer/i18n/nb.po @@ -0,0 +1,77 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-22 21:31+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-23 05:17+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: product_manufacturer +#: field:product.product,manufacturer_pref:0 +msgid "Manufacturer Product Code" +msgstr "" + +#. module: product_manufacturer +#: model:ir.model,name:product_manufacturer.model_product_product +#: field:product.manufacturer.attribute,product_id:0 +msgid "Product" +msgstr "Produkt" + +#. module: product_manufacturer +#: view:product.manufacturer.attribute:0 +msgid "Product Template Name" +msgstr "Produkt template navn" + +#. module: product_manufacturer +#: model:ir.model,name:product_manufacturer.model_product_manufacturer_attribute +msgid "Product attributes" +msgstr "Produkt attributter" + +#. module: product_manufacturer +#: view:product.manufacturer.attribute:0 +#: view:product.product:0 +msgid "Product Attributes" +msgstr "" + +#. module: product_manufacturer +#: field:product.manufacturer.attribute,name:0 +msgid "Attribute" +msgstr "Attributt" + +#. module: product_manufacturer +#: field:product.manufacturer.attribute,value:0 +msgid "Value" +msgstr "Verdi" + +#. module: product_manufacturer +#: constraint:product.product:0 +msgid "Error: Invalid ean code" +msgstr "Feil: Ugyldig ean kode" + +#. module: product_manufacturer +#: view:product.product:0 +#: field:product.product,attribute_ids:0 +msgid "Attributes" +msgstr "Attributter" + +#. module: product_manufacturer +#: field:product.product,manufacturer_pname:0 +msgid "Manufacturer Product Name" +msgstr "Produsents produktnavn" + +#. module: product_manufacturer +#: view:product.product:0 +#: field:product.product,manufacturer:0 +msgid "Manufacturer" +msgstr "Produsent" diff --git a/addons/purchase_requisition/i18n/nb.po b/addons/purchase_requisition/i18n/nb.po new file mode 100644 index 00000000000..aba3b5d4984 --- /dev/null +++ b/addons/purchase_requisition/i18n/nb.po @@ -0,0 +1,444 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-23 10:33+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-24 04:52+0000\n" +"X-Generator: Launchpad (build 15668)\n" + +#. module: purchase_requisition +#: sql_constraint:purchase.order:0 +msgid "Order Reference must be unique per Company!" +msgstr "Ordrereferanse må være unik pr. firma!" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +#: selection:purchase.requisition,state:0 +msgid "In Progress" +msgstr "I arbeid" + +#. module: purchase_requisition +#: code:addons/purchase_requisition/wizard/purchase_requisition_partner.py:42 +#, python-format +msgid "No Product in Tender" +msgstr "Ikke noe produkt i tilbudet" + +#. module: purchase_requisition +#: view:purchase.order:0 +msgid "Requisition" +msgstr "Rekvisisjon" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +#: field:purchase.requisition,user_id:0 +msgid "Responsible" +msgstr "Ansvarlig" + +#. module: purchase_requisition +#: view:purchase.requisition.partner:0 +msgid "Create Quotation" +msgstr "Lag tilbud" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Group By..." +msgstr "Grupper etter..." + +#. module: purchase_requisition +#: view:purchase.requisition:0 +#: field:purchase.requisition,state:0 +msgid "State" +msgstr "Status" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Purchase Requisition in negociation" +msgstr "Innkjøpsrekvisisjon i forhandling" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Supplier" +msgstr "Leverandør" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +#: selection:purchase.requisition,state:0 +msgid "New" +msgstr "Ny" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Product Detail" +msgstr "produktdetaljer" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +#: field:purchase.requisition,date_start:0 +msgid "Requisition Date" +msgstr "Rekvisisjonsdato" + +#. module: purchase_requisition +#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition_partner +#: model:ir.actions.report.xml,name:purchase_requisition.report_purchase_requisition +#: model:ir.model,name:purchase_requisition.model_purchase_requisition +#: model:ir.module.category,name:purchase_requisition.module_category_purchase_requisition +#: field:product.product,purchase_requisition:0 +#: field:purchase.order,requisition_id:0 +#: view:purchase.requisition:0 +#: field:purchase.requisition.line,requisition_id:0 +#: view:purchase.requisition.partner:0 +msgid "Purchase Requisition" +msgstr "Innkjøpsrekvisisjon" + +#. module: purchase_requisition +#: model:ir.model,name:purchase_requisition.model_purchase_requisition_line +msgid "Purchase Requisition Line" +msgstr "Innkjøpsrekvisisjonslinje" + +#. module: purchase_requisition +#: view:purchase.order:0 +msgid "Purchase Orders with requisition" +msgstr "Innkjøpsordre med rekvisisjon" + +#. module: purchase_requisition +#: model:ir.model,name:purchase_requisition.model_product_product +#: field:purchase.requisition.line,product_id:0 +msgid "Product" +msgstr "Produkt" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Quotations" +msgstr "Tilbud" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +#: field:purchase.requisition,description:0 +msgid "Description" +msgstr "Beskrivelse" + +#. module: purchase_requisition +#: help:product.product,purchase_requisition:0 +msgid "" +"Check this box so that requisitions generates purchase requisitions instead " +"of directly requests for quotations." +msgstr "" + +#. module: purchase_requisition +#: code:addons/purchase_requisition/purchase_requisition.py:136 +#, python-format +msgid "Warning" +msgstr "Advarsel" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Type" +msgstr "Type" + +#. module: purchase_requisition +#: field:purchase.requisition,company_id:0 +#: field:purchase.requisition.line,company_id:0 +msgid "Company" +msgstr "Firma" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Request a Quotation" +msgstr "Be om tilbud" + +#. module: purchase_requisition +#: selection:purchase.requisition,exclusive:0 +msgid "Multiple Requisitions" +msgstr "" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +#: field:purchase.requisition.line,product_uom_id:0 +msgid "Product UoM" +msgstr "Produkt måleenhet" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Approved by Supplier" +msgstr "Godkjent av leverandør" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Reset to Draft" +msgstr "Sett tilbake til utkast" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Current Purchase Requisition" +msgstr "Gjeldende innkjøpsrekvisisjon" + +#. module: purchase_requisition +#: model:res.groups,name:purchase_requisition.group_purchase_requisition_user +msgid "User" +msgstr "Bruker" + +#. module: purchase_requisition +#: field:purchase.requisition.partner,partner_address_id:0 +msgid "Address" +msgstr "Adresse" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Order Reference" +msgstr "Ordrereferanse" + +#. module: purchase_requisition +#: model:ir.actions.act_window,help:purchase_requisition.action_purchase_requisition +msgid "" +"A purchase requisition is the step before a request for quotation. In a " +"purchase requisition (or purchase tender), you can record the products you " +"need to buy and trigger the creation of RfQs to suppliers. After the " +"negotiation, once you have reviewed all the supplier's offers, you can " +"validate some and cancel others." +msgstr "" + +#. module: purchase_requisition +#: field:purchase.requisition.line,product_qty:0 +msgid "Quantity" +msgstr "Kvantum" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Unassigned Requisition" +msgstr "" + +#. module: purchase_requisition +#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition +#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition_pro_mgt +msgid "Purchase Requisitions" +msgstr "Innkjøpsrekvisisjoner" + +#. module: purchase_requisition +#: code:addons/purchase_requisition/purchase_requisition.py:136 +#, python-format +msgid "" +"You have already one %s purchase order for this partner, you must cancel " +"this purchase order to create a new quotation." +msgstr "" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "End Date" +msgstr "Sluttdato" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +#: field:purchase.requisition,name:0 +msgid "Requisition Reference" +msgstr "Rekvisisjonsreferanse" + +#. module: purchase_requisition +#: field:purchase.requisition,line_ids:0 +msgid "Products to Purchase" +msgstr "" + +#. module: purchase_requisition +#: field:purchase.requisition,date_end:0 +msgid "Requisition Deadline" +msgstr "" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Search Purchase Requisition" +msgstr "Søk innkjøpsrekvisisjon" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Notes" +msgstr "Notater" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Date Ordered" +msgstr "Ordredato" + +#. module: purchase_requisition +#: help:purchase.requisition,exclusive:0 +msgid "" +"Purchase Requisition (exclusive): On the confirmation of a purchase order, " +"it cancels the remaining purchase order.\n" +"Purchase Requisition(Multiple): It allows to have multiple purchase " +"orders.On confirmation of a purchase order it does not cancel the remaining " +"orders" +msgstr "" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Cancel Purchase Order" +msgstr "Annuller innkjøpsordre" + +#. module: purchase_requisition +#: model:ir.model,name:purchase_requisition.model_purchase_order +#: view:purchase.requisition:0 +msgid "Purchase Order" +msgstr "Innkjøpsordre" + +#. module: purchase_requisition +#: code:addons/purchase_requisition/wizard/purchase_requisition_partner.py:42 +#, python-format +msgid "Error!" +msgstr "Feil!" + +#. module: purchase_requisition +#: field:purchase.requisition,exclusive:0 +msgid "Requisition Type" +msgstr "Rekvisisjonstype" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "New Purchase Requisition" +msgstr "Ny innkjøpsrekvisisjon" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Products" +msgstr "Produkter" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Order Date" +msgstr "Ordredato" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "]" +msgstr "]" + +#. module: purchase_requisition +#: selection:purchase.requisition,state:0 +msgid "Cancelled" +msgstr "Kansellert" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "[" +msgstr "[" + +#. module: purchase_requisition +#: model:ir.model,name:purchase_requisition.model_purchase_requisition_partner +msgid "Purchase Requisition Partner" +msgstr "Innkjøpsrekvisisjons partner" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Start" +msgstr "Start" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Quotation Detail" +msgstr "Tilbudsdetaljer" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Purchase for Requisitions" +msgstr "" + +#. module: purchase_requisition +#: model:ir.actions.act_window,name:purchase_requisition.act_res_partner_2_purchase_order +msgid "Purchase orders" +msgstr "Innkjøpsordre" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +#: view:purchase.requisition:0 +#: field:purchase.requisition,origin:0 +msgid "Origin" +msgstr "Opprinnelse" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Reference" +msgstr "Referanse" + +#. module: purchase_requisition +#: model:ir.model,name:purchase_requisition.model_procurement_order +msgid "Procurement" +msgstr "Innkjøp" + +#. module: purchase_requisition +#: field:purchase.requisition,warehouse_id:0 +msgid "Warehouse" +msgstr "Lager" + +#. module: purchase_requisition +#: field:procurement.order,requisition_id:0 +msgid "Latest Requisition" +msgstr "Siste rekvisisjon" + +#. module: purchase_requisition +#: report:purchase.requisition:0 +msgid "Qty" +msgstr "Ant" + +#. module: purchase_requisition +#: selection:purchase.requisition,exclusive:0 +msgid "Purchase Requisition (exclusive)" +msgstr "Innkjøpsrekvisisjon (eksklusiv)" + +#. module: purchase_requisition +#: model:res.groups,name:purchase_requisition.group_purchase_requisition_manager +msgid "Manager" +msgstr "Manager" + +#. module: purchase_requisition +#: constraint:product.product:0 +msgid "Error: Invalid ean code" +msgstr "Feil: Ugyldig ean kode" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +#: selection:purchase.requisition,state:0 +msgid "Done" +msgstr "Fullført" + +#. module: purchase_requisition +#: view:purchase.requisition.partner:0 +msgid "_Cancel" +msgstr "_Avbryt" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Confirm Purchase Order" +msgstr "Bekreft innkjøpsordre" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Cancel" +msgstr "Kanseller" + +#. module: purchase_requisition +#: field:purchase.requisition.partner,partner_id:0 +msgid "Partner" +msgstr "Partner" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Start Date" +msgstr "Startdato" + +#. module: purchase_requisition +#: view:purchase.requisition:0 +msgid "Unassigned" +msgstr "Ikke tildelt" + +#. module: purchase_requisition +#: field:purchase.requisition,purchase_ids:0 +msgid "Purchase Orders" +msgstr "Innkjøpsordre" diff --git a/addons/sale_analytic_plans/i18n/nb.po b/addons/sale_analytic_plans/i18n/nb.po new file mode 100644 index 00000000000..c234f234d72 --- /dev/null +++ b/addons/sale_analytic_plans/i18n/nb.po @@ -0,0 +1,28 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-22 21:14+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-23 05:17+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: sale_analytic_plans +#: field:sale.order.line,analytics_id:0 +msgid "Analytic Distribution" +msgstr "Analytisk Distribusjon" + +#. module: sale_analytic_plans +#: model:ir.model,name:sale_analytic_plans.model_sale_order_line +msgid "Sales Order Line" +msgstr "Salgsordrelinje" diff --git a/addons/sale_margin/i18n/nb.po b/addons/sale_margin/i18n/nb.po new file mode 100644 index 00000000000..7db7e12a698 --- /dev/null +++ b/addons/sale_margin/i18n/nb.po @@ -0,0 +1,52 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-22 21:27+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-23 05:17+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: sale_margin +#: sql_constraint:sale.order:0 +msgid "Order Reference must be unique per Company!" +msgstr "Ordrereferanse må være unik pr. firma!" + +#. module: sale_margin +#: field:sale.order.line,purchase_price:0 +msgid "Cost Price" +msgstr "Kostpris" + +#. module: sale_margin +#: model:ir.model,name:sale_margin.model_sale_order +msgid "Sales Order" +msgstr "Salgsordre" + +#. module: sale_margin +#: help:sale.order,margin:0 +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and Cost Price." +msgstr "" +"Fortjeneste oppnås ved å beregne differansen mellom enhetspris og kostpris" + +#. module: sale_margin +#: field:sale.order,margin:0 +#: field:sale.order.line,margin:0 +msgid "Margin" +msgstr "Margin" + +#. module: sale_margin +#: model:ir.model,name:sale_margin.model_sale_order_line +msgid "Sales Order Line" +msgstr "Salgsordrelinje" diff --git a/addons/sale_mrp/i18n/nb.po b/addons/sale_mrp/i18n/nb.po new file mode 100644 index 00000000000..4b6589b24cc --- /dev/null +++ b/addons/sale_mrp/i18n/nb.po @@ -0,0 +1,53 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-22 20:19+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-23 05:17+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: sale_mrp +#: help:mrp.production,sale_ref:0 +msgid "Indicate the Customer Reference from sales order." +msgstr "Viser kundereferansen fra salgsordren" + +#. module: sale_mrp +#: field:mrp.production,sale_ref:0 +msgid "Sales Reference" +msgstr "Salgsreferanse" + +#. module: sale_mrp +#: model:ir.model,name:sale_mrp.model_mrp_production +msgid "Manufacturing Order" +msgstr "Produksjonsordre" + +#. module: sale_mrp +#: field:mrp.production,sale_name:0 +msgid "Sales Name" +msgstr "Salgsnavn" + +#. module: sale_mrp +#: sql_constraint:mrp.production:0 +msgid "Reference must be unique per Company!" +msgstr "Referanse må være unik pr firma!" + +#. module: sale_mrp +#: constraint:mrp.production:0 +msgid "Order quantity cannot be negative or zero!" +msgstr "Ordrekvantum kan ikke være negativt eller null!" + +#. module: sale_mrp +#: help:mrp.production,sale_name:0 +msgid "Indicate the name of sales order." +msgstr "Angi navnet på salgsordren." diff --git a/addons/sale_order_dates/i18n/nb.po b/addons/sale_order_dates/i18n/nb.po new file mode 100644 index 00000000000..9d4322c8535 --- /dev/null +++ b/addons/sale_order_dates/i18n/nb.po @@ -0,0 +1,58 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-23 10:58+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-24 04:52+0000\n" +"X-Generator: Launchpad (build 15668)\n" + +#. module: sale_order_dates +#: sql_constraint:sale.order:0 +msgid "Order Reference must be unique per Company!" +msgstr "Ordrereferanse må være unik pr. firma!" + +#. module: sale_order_dates +#: help:sale.order,requested_date:0 +msgid "Date on which customer has requested for sales." +msgstr "Dato som kunden har ønsket for salg." + +#. module: sale_order_dates +#: field:sale.order,commitment_date:0 +msgid "Commitment Date" +msgstr "Bekreftet dato" + +#. module: sale_order_dates +#: field:sale.order,effective_date:0 +msgid "Effective Date" +msgstr "Behandlingsdato" + +#. module: sale_order_dates +#: help:sale.order,effective_date:0 +msgid "Date on which picking is created." +msgstr "Dato hvor plukkingen er gjort." + +#. module: sale_order_dates +#: field:sale.order,requested_date:0 +msgid "Requested Date" +msgstr "Ønsket dato" + +#. module: sale_order_dates +#: model:ir.model,name:sale_order_dates.model_sale_order +msgid "Sales Order" +msgstr "Salgsordre" + +#. module: sale_order_dates +#: help:sale.order,commitment_date:0 +msgid "Date on which delivery of products is to be made." +msgstr "Dato hvor levering av varer skal skje" diff --git a/addons/stock_location/i18n/nb.po b/addons/stock_location/i18n/nb.po new file mode 100644 index 00000000000..9ee7cc50fd3 --- /dev/null +++ b/addons/stock_location/i18n/nb.po @@ -0,0 +1,400 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-22 21:37+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-23 05:17+0000\n" +"X-Generator: Launchpad (build 15654)\n" + +#. module: stock_location +#: selection:product.pulled.flow,picking_type:0 +#: selection:stock.location.path,picking_type:0 +msgid "Sending Goods" +msgstr "Vareforsendelse" + +#. module: stock_location +#: view:product.product:0 +msgid "Pulled Paths" +msgstr "" + +#. module: stock_location +#: selection:product.pulled.flow,type_proc:0 +msgid "Move" +msgstr "Bevegelse" + +#. module: stock_location +#: model:ir.model,name:stock_location.model_stock_location_path +msgid "Pushed Flows" +msgstr "" + +#. module: stock_location +#: selection:stock.location.path,auto:0 +msgid "Automatic No Step Added" +msgstr "" + +#. module: stock_location +#: view:product.product:0 +msgid "Parameters" +msgstr "Parametere" + +#. module: stock_location +#: field:product.pulled.flow,location_src_id:0 +#: field:stock.location.path,location_from_id:0 +msgid "Source Location" +msgstr "Kildelokasjon" + +#. module: stock_location +#: help:product.pulled.flow,cancel_cascade:0 +msgid "Allow you to cancel moves related to the product pull flow" +msgstr "" + +#. module: stock_location +#: model:ir.model,name:stock_location.model_product_pulled_flow +#: field:product.product,flow_pull_ids:0 +msgid "Pulled Flows" +msgstr "" + +#. module: stock_location +#: constraint:stock.move:0 +msgid "You must assign a production lot for this product" +msgstr "Du må velge en produksjonslot/batch for dette produktet" + +#. module: stock_location +#: help:product.pulled.flow,location_src_id:0 +msgid "Location used by Destination Location to supply" +msgstr "" + +#. module: stock_location +#: selection:product.pulled.flow,picking_type:0 +#: selection:stock.location.path,picking_type:0 +msgid "Internal" +msgstr "Intern" + +#. module: stock_location +#: code:addons/stock_location/procurement_pull.py:98 +#, python-format +msgid "" +"Pulled procurement coming from original location %s, pull rule %s, via " +"original Procurement %s (#%d)" +msgstr "" + +#. module: stock_location +#: model:ir.model,name:stock_location.model_stock_location +msgid "Location" +msgstr "Lokasjon" + +#. module: stock_location +#: field:product.pulled.flow,invoice_state:0 +#: field:stock.location.path,invoice_state:0 +msgid "Invoice Status" +msgstr "Fakturastatus" + +#. module: stock_location +#: help:stock.location.path,auto:0 +msgid "" +"This is used to define paths the product has to follow within the location " +"tree.\n" +"The 'Automatic Move' value will create a stock move after the current one " +"that will be validated automatically. With 'Manual Operation', the stock " +"move has to be validated by a worker. With 'Automatic No Step Added', the " +"location is replaced in the original move." +msgstr "" + +#. module: stock_location +#: view:product.product:0 +msgid "Conditions" +msgstr "Vilkår" + +#. module: stock_location +#: model:stock.location,name:stock_location.location_pack_zone +msgid "Pack Zone" +msgstr "" + +#. module: stock_location +#: model:stock.location,name:stock_location.location_gate_b +msgid "Gate B" +msgstr "Gate B" + +#. module: stock_location +#: model:stock.location,name:stock_location.location_gate_a +msgid "Gate A" +msgstr "Gate A" + +#. module: stock_location +#: selection:product.pulled.flow,type_proc:0 +msgid "Buy" +msgstr "Kjøp" + +#. module: stock_location +#: view:product.product:0 +msgid "Pushed flows" +msgstr "" + +#. module: stock_location +#: model:stock.location,name:stock_location.location_dispatch_zone +msgid "Dispatch Zone" +msgstr "" + +#. module: stock_location +#: model:ir.model,name:stock_location.model_stock_move +msgid "Stock Move" +msgstr "Lagerbevegelse" + +#. module: stock_location +#: view:product.product:0 +msgid "Pulled flows" +msgstr "" + +#. module: stock_location +#: field:product.pulled.flow,company_id:0 +#: field:stock.location.path,company_id:0 +msgid "Company" +msgstr "Firma" + +#. module: stock_location +#: view:product.product:0 +msgid "Logistics Flows" +msgstr "" + +#. module: stock_location +#: help:stock.move,cancel_cascade:0 +msgid "If checked, when this move is cancelled, cancel the linked move too" +msgstr "" + +#. module: stock_location +#: selection:product.pulled.flow,type_proc:0 +msgid "Produce" +msgstr "Produser" + +#. module: stock_location +#: selection:product.pulled.flow,procure_method:0 +msgid "Make to Order" +msgstr "Produser på bestilling(Make to order)" + +#. module: stock_location +#: selection:product.pulled.flow,procure_method:0 +msgid "Make to Stock" +msgstr "Produser til lager" + +#. module: stock_location +#: field:product.pulled.flow,partner_address_id:0 +msgid "Partner Address" +msgstr "Partneradresse" + +#. module: stock_location +#: selection:product.pulled.flow,invoice_state:0 +#: selection:stock.location.path,invoice_state:0 +msgid "To Be Invoiced" +msgstr "Klare til fakturering" + +#. module: stock_location +#: help:stock.location.path,delay:0 +msgid "Number of days to do this transition" +msgstr "" + +#. module: stock_location +#: help:product.pulled.flow,name:0 +msgid "This field will fill the packing Origin and the name of its moves" +msgstr "" + +#. module: stock_location +#: field:product.pulled.flow,type_proc:0 +msgid "Type of Procurement" +msgstr "" + +#. module: stock_location +#: help:product.pulled.flow,company_id:0 +msgid "Is used to know to which company belong packings and moves" +msgstr "" + +#. module: stock_location +#: field:product.pulled.flow,name:0 +msgid "Name" +msgstr "Navn" + +#. module: stock_location +#: help:product.product,path_ids:0 +msgid "" +"These rules set the right path of the product in the whole location tree." +msgstr "" + +#. module: stock_location +#: constraint:stock.move:0 +msgid "You can not move products from or to a location of the type view." +msgstr "Kan ikke flytte produkter til eller fra en lokasjon av typen view." + +#. module: stock_location +#: selection:stock.location.path,auto:0 +msgid "Manual Operation" +msgstr "Manuell operasjon" + +#. module: stock_location +#: model:ir.model,name:stock_location.model_product_product +#: field:product.pulled.flow,product_id:0 +msgid "Product" +msgstr "Produkt" + +#. module: stock_location +#: field:product.pulled.flow,procure_method:0 +msgid "Procure Method" +msgstr "Innkjøpsmetode" + +#. module: stock_location +#: field:product.pulled.flow,picking_type:0 +#: field:stock.location.path,picking_type:0 +msgid "Shipping Type" +msgstr "Forsendelestype" + +#. module: stock_location +#: help:product.pulled.flow,procure_method:0 +msgid "" +"'Make to Stock': When needed, take from the stock or wait until re-" +"supplying. 'Make to Order': When needed, purchase or produce for the " +"procurement request." +msgstr "" +"'Make to Stock': When needed, take from the stock or wait until re-" +"supplying. 'Make to Order': When needed, purchase or produce for the " +"procurement request." + +#. module: stock_location +#: help:product.pulled.flow,location_id:0 +msgid "Is the destination location that needs supplying" +msgstr "" + +#. module: stock_location +#: field:stock.location.path,product_id:0 +msgid "Products" +msgstr "Produkter" + +#. module: stock_location +#: code:addons/stock_location/procurement_pull.py:118 +#, python-format +msgid "Pulled from another location via procurement %d" +msgstr "" + +#. module: stock_location +#: model:stock.location,name:stock_location.stock_location_qualitytest0 +msgid "Quality Control" +msgstr "Kvalitetskontroll" + +#. module: stock_location +#: selection:product.pulled.flow,invoice_state:0 +#: selection:stock.location.path,invoice_state:0 +msgid "Not Applicable" +msgstr "Ikke tilgjengelig" + +#. module: stock_location +#: field:stock.location.path,delay:0 +msgid "Delay (days)" +msgstr "Forsinkelse (dager)" + +#. module: stock_location +#: code:addons/stock_location/procurement_pull.py:67 +#, python-format +msgid "" +"Picking for pulled procurement coming from original location %s, pull rule " +"%s, via original Procurement %s (#%d)" +msgstr "" + +#. module: stock_location +#: field:product.product,path_ids:0 +msgid "Pushed Flow" +msgstr "" + +#. module: stock_location +#: code:addons/stock_location/procurement_pull.py:89 +#, python-format +msgid "" +"Move for pulled procurement coming from original location %s, pull rule %s, " +"via original Procurement %s (#%d)" +msgstr "" + +#. module: stock_location +#: constraint:stock.move:0 +msgid "You try to assign a lot which is not from the same product" +msgstr "Du forsøker å angi en lot som ikke tilhører samme produkt" + +#. module: stock_location +#: model:ir.model,name:stock_location.model_procurement_order +msgid "Procurement" +msgstr "Innkjøp" + +#. module: stock_location +#: field:product.pulled.flow,location_id:0 +#: field:stock.location.path,location_dest_id:0 +msgid "Destination Location" +msgstr "Destinasjons Lokasjon" + +#. module: stock_location +#: field:stock.location.path,auto:0 +#: selection:stock.location.path,auto:0 +msgid "Automatic Move" +msgstr "Automatisk bevegelse" + +#. module: stock_location +#: selection:product.pulled.flow,picking_type:0 +#: selection:stock.location.path,picking_type:0 +msgid "Getting Goods" +msgstr "" + +#. module: stock_location +#: view:product.product:0 +msgid "Action Type" +msgstr "Handlingstype" + +#. module: stock_location +#: constraint:product.product:0 +msgid "Error: Invalid ean code" +msgstr "Feil: Ugyldig ean kode" + +#. module: stock_location +#: help:product.pulled.flow,picking_type:0 +#: help:stock.location.path,picking_type:0 +msgid "" +"Depending on the company, choose whatever you want to receive or send " +"products" +msgstr "" + +#. module: stock_location +#: model:stock.location,name:stock_location.location_order +msgid "Order Processing" +msgstr "" + +#. module: stock_location +#: field:stock.location.path,name:0 +msgid "Operation" +msgstr "Handling" + +#. module: stock_location +#: view:stock.location.path:0 +msgid "Location Paths" +msgstr "" + +#. module: stock_location +#: field:product.pulled.flow,journal_id:0 +#: field:stock.location.path,journal_id:0 +msgid "Journal" +msgstr "Journal" + +#. module: stock_location +#: field:product.pulled.flow,cancel_cascade:0 +#: field:stock.move,cancel_cascade:0 +msgid "Cancel Cascade" +msgstr "" + +#. module: stock_location +#: selection:product.pulled.flow,invoice_state:0 +#: selection:stock.location.path,invoice_state:0 +msgid "Invoiced" +msgstr "Fakturert" diff --git a/addons/stock_planning/i18n/nb.po b/addons/stock_planning/i18n/nb.po new file mode 100644 index 00000000000..4ad1ab6f30c --- /dev/null +++ b/addons/stock_planning/i18n/nb.po @@ -0,0 +1,1178 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-23 11:05+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-24 04:52+0000\n" +"X-Generator: Launchpad (build 15668)\n" + +#. module: stock_planning +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73 +#, python-format +msgid "" +"No forecasts for selected period or no products in selected category !" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,stock_only:0 +msgid "" +"Check to calculate stock location of selected warehouse only. If not " +"selected calculation is made for input, stock and output location of " +"warehouse." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,maximum_op:0 +msgid "Maximum Rule" +msgstr "Maksimumsregel" + +#. module: stock_planning +#: view:stock.planning:0 +#: view:stock.sale.forecast:0 +msgid "Group By..." +msgstr "Grupper etter..." + +#. module: stock_planning +#: help:stock.sale.forecast,product_amt:0 +msgid "" +"Forecast value which will be converted to Product Quantity according to " +"prices." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:626 +#: code:addons/stock_planning/stock_planning.py:670 +#, python-format +msgid "Incoming Left must be greater than 0 !" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,outgoing_before:0 +msgid "" +"Planned Out in periods before calculated. Between start date of current " +"period and one day before start of calculated period." +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,warehouse_id:0 +msgid "" +"Warehouse which forecasts will concern. If during stock planning you will " +"need sales forecast for all warehouses choose any warehouse now." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,outgoing_left:0 +msgid "Expected Out" +msgstr "Forventet ut" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid " " +msgstr " " + +#. module: stock_planning +#: field:stock.planning,incoming_left:0 +msgid "Incoming Left" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast.createlines:0 +msgid "Create Forecasts Lines" +msgstr "Lag prognoselinjer" + +#. module: stock_planning +#: help:stock.planning,outgoing:0 +msgid "Quantity of all confirmed outgoing moves in calculated Period." +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Create Daily Periods" +msgstr "Lag perioder pr dag" + +#. module: stock_planning +#: view:stock.planning:0 +#: field:stock.planning,company_id:0 +#: field:stock.planning.createlines,company_id:0 +#: view:stock.sale.forecast:0 +#: field:stock.sale.forecast,company_id:0 +#: field:stock.sale.forecast.createlines,company_id:0 +msgid "Company" +msgstr "Firma" + +#. module: stock_planning +#: help:stock.planning,warehouse_forecast:0 +msgid "" +"All sales forecasts for selected Warehouse of selected Product during " +"selected Period." +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Minimum Stock Rule Indicators" +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,period_id:0 +msgid "Period which forecasts will concern." +msgstr "Perioder som forslaget vil omhandle" + +#. module: stock_planning +#: field:stock.planning,stock_only:0 +msgid "Stock Location Only" +msgstr "Bare algerlokasjon" + +#. module: stock_planning +#: help:stock.planning,already_out:0 +msgid "" +"Quantity which is already dispatched out of this warehouse in current period." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,incoming:0 +msgid "Confirmed In" +msgstr "Bekreftet inn" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Current Period Situation" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_period_createlines_form +msgid "" +"This wizard helps with the creation of stock planning periods. These periods " +"are independent of financial periods. If you need periods other than day-, " +"week- or month-based, you may also add then manually." +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Create Monthly Periods" +msgstr "Opprett månedlige perioder" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_period_createlines +msgid "stock.period.createlines" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,outgoing_before:0 +msgid "Planned Out Before" +msgstr "Planlagt ut før" + +#. module: stock_planning +#: field:stock.planning.createlines,forecasted_products:0 +msgid "All Products with Forecast" +msgstr "Alle produkter med forslag" + +#. module: stock_planning +#: help:stock.planning,maximum_op:0 +msgid "Maximum quantity set in Minimum Stock Rules for this Warehouse" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Periods :" +msgstr "Perioder :" + +#. module: stock_planning +#: help:stock.planning,procure_to_stock:0 +msgid "" +"Check to make procurement to stock location of selected warehouse. If not " +"selected procurement will be made into input location of warehouse." +msgstr "" + +#. module: stock_planning +#: help:stock.planning,already_in:0 +msgid "" +"Quantity which is already picked up to this warehouse in current period." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60 +#, python-format +msgid "No products in selected category !" +msgstr "Ingen produkter i valgt kategori!" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Stock and Sales Forecast" +msgstr "" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_sale_forecast +msgid "stock.sale.forecast" +msgstr "stock.sale.forecast" + +#. module: stock_planning +#: field:stock.planning,to_procure:0 +msgid "Planned In" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,stock_simulation:0 +msgid "Stock Simulation" +msgstr "Lagersimulering" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_planning_createlines +msgid "stock.planning.createlines" +msgstr "stock.planning.createlines" + +#. module: stock_planning +#: help:stock.planning,incoming_before:0 +msgid "" +"Confirmed incoming in periods before calculated (Including Already In). " +"Between start date of current period and one day before start of calculated " +"period." +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Search Sales Forecast" +msgstr "Søk salgsprognose" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_user:0 +msgid "This User Period5" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,history:0 +msgid "History of procurement or internal supply of this planning line." +msgstr "" + +#. module: stock_planning +#: help:stock.planning,company_forecast:0 +msgid "" +"All sales forecasts for whole company (for all Warehouses) of selected " +"Product during selected Period." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_user:0 +msgid "This User Period1" +msgstr "Denne brukerperiode1" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_user:0 +msgid "This User Period3" +msgstr "Denne brukerperiode3" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Stock Planning" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,minimum_op:0 +msgid "Minimum Rule" +msgstr "Minimumsregel" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Procure Incoming Left" +msgstr "" + +#. module: stock_planning +#: view:stock.planning.createlines:0 +#: view:stock.sale.forecast.createlines:0 +msgid "Create" +msgstr "Opprett" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_planning_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_manual +#: view:stock.planning:0 +msgid "Master Procurement Schedule" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,line_time:0 +msgid "Past/Future" +msgstr "Tidligere/framtidig" + +#. module: stock_planning +#: view:stock.period:0 +#: field:stock.period,state:0 +#: field:stock.planning,state:0 +#: field:stock.sale.forecast,state:0 +msgid "State" +msgstr "Status" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,product_categ_id:0 +msgid "Product Category of products which created forecasts will concern." +msgstr "" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_period +msgid "stock period" +msgstr "lagerperiode" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_sale_forecast_createlines +msgid "stock.sale.forecast.createlines" +msgstr "stock.sale.forecast.createlines" + +#. module: stock_planning +#: field:stock.planning,warehouse_id:0 +#: field:stock.planning.createlines,warehouse_id:0 +#: field:stock.sale.forecast,warehouse_id:0 +#: field:stock.sale.forecast.createlines,warehouse_id:0 +msgid "Warehouse" +msgstr "Lager" + +#. module: stock_planning +#: help:stock.planning,stock_simulation:0 +msgid "" +"Stock simulation at the end of selected Period.\n" +" For current period it is: \n" +"Initial Stock - Already Out + Already In - Expected Out + Incoming Left.\n" +"For periods ahead it is: \n" +"Initial Stock - Planned Out Before + Incoming Before - Planned Out + Planned " +"In." +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,analyze_company:0 +msgid "Check this box to see the sales for whole company." +msgstr "Kryss her for å se salget for hele firmaet" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Per Department :" +msgstr "Pr. avdeling :" + +#. module: stock_planning +#: field:stock.planning,incoming_before:0 +msgid "Incoming Before" +msgstr "Inngående før" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:641 +#, python-format +msgid "" +" Procurement created by MPS for user: %s Creation Date: %s " +" \n" +" For period: %s \n" +" according to state: \n" +" Warehouse Forecast: %s \n" +" Initial Stock: %s \n" +" Planned Out: %s Planned In: %s \n" +" Already Out: %s Already In: %s \n" +" Confirmed Out: %s Confirmed In: %s " +" \n" +" Planned Out Before: %s Confirmed In Before: %s " +" \n" +" Expected Out: %s Incoming Left: %s " +" \n" +" Stock Simulation: %s Minimum stock: %s" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:626 +#: code:addons/stock_planning/stock_planning.py:670 +#: code:addons/stock_planning/stock_planning.py:672 +#: code:addons/stock_planning/stock_planning.py:674 +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73 +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60 +#, python-format +msgid "Error !" +msgstr "Feil!" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_user_id:0 +msgid "This User" +msgstr "Denne bruker" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Forecasts" +msgstr "Prognose" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Supply from Another Warehouse" +msgstr "Levering fra annet lager" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Calculate Planning" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:146 +#, python-format +msgid "Invalid action !" +msgstr "Ugyldig aksjon!" + +#. module: stock_planning +#: help:stock.planning,stock_start:0 +msgid "Stock quantity one day before current period." +msgstr "Lagerbeholdning en dag før gjeldende periode" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Procurement history" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,product_uom:0 +msgid "" +"Unit of Measure used to show the quantities of stock calculation.You can use " +"units from default category or from second category (UoS category)." +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Create Weekly Periods" +msgstr "Lag ukentlige perioder" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_period_form +msgid "" +"Stock periods are used for stock planning. Stock periods are independent of " +"account periods. You can use wizard for creating periods and review them " +"here." +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Calculated Period Simulation" +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Cancel" +msgstr "Kanseller" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_user:0 +msgid "This User Period4" +msgstr "Denne brukerperiode4" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Stock and Sales Period" +msgstr "Lager og salgsperiode" + +#. module: stock_planning +#: field:stock.planning,company_forecast:0 +msgid "Company Forecast" +msgstr "Firmaprognose" + +#. module: stock_planning +#: help:stock.planning,minimum_op:0 +msgid "Minimum quantity set in Minimum Stock Rules for this Warehouse" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Per User :" +msgstr "Pr. bruker :" + +#. module: stock_planning +#: help:stock.planning.createlines,warehouse_id:0 +msgid "Warehouse which planning will concern." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,user_id:0 +msgid "Created/Validated by" +msgstr "Laget/godkjent av" + +#. module: stock_planning +#: field:stock.planning,warehouse_forecast:0 +msgid "Warehouse Forecast" +msgstr "Lagerprognose" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:674 +#, python-format +msgid "" +"You must specify a Source Warehouse different than calculated (destination) " +"Warehouse !" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:146 +#, python-format +msgid "Cannot delete a validated sales forecast!" +msgstr "Kan ikke slette en godkjent salgsprognose!" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_company:0 +msgid "This Company Period5" +msgstr "Dette firmaet periode5" + +#. module: stock_planning +#: field:stock.sale.forecast,product_uom:0 +msgid "Product UoM" +msgstr "Produkt måleenhet" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_company:0 +msgid "This Company Period1" +msgstr "Dette firmaet periode1" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_company:0 +msgid "This Company Period2" +msgstr "Dette firmaet periode2" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_company:0 +msgid "This Company Period3" +msgstr "Dette firmaet periode3" + +#. module: stock_planning +#: field:stock.period,date_start:0 +#: field:stock.period.createlines,date_start:0 +msgid "Start Date" +msgstr "Startdato" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_user:0 +msgid "This User Period2" +msgstr "Denne brukerperiode2" + +#. module: stock_planning +#: field:stock.planning,confirmed_forecasts_only:0 +msgid "Validated Forecasts" +msgstr "Godkjente prognoser" + +#. module: stock_planning +#: help:stock.planning.createlines,product_categ_id:0 +msgid "" +"Planning will be created for products from Product Category selected by this " +"field. This field is ignored when you check \"All Forecasted Product\" box." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,planned_outgoing:0 +msgid "Planned Out" +msgstr "Planlagt ut" + +#. module: stock_planning +#: field:stock.sale.forecast,product_qty:0 +msgid "Forecast Quantity" +msgstr "Prognose kvantum" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Forecast" +msgstr "Prognose" + +#. module: stock_planning +#: selection:stock.period,state:0 +#: selection:stock.planning,state:0 +#: selection:stock.sale.forecast,state:0 +msgid "Draft" +msgstr "Utkast" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Closed" +msgstr "Lukket" + +#. module: stock_planning +#: view:stock.planning:0 +#: view:stock.sale.forecast:0 +msgid "Warehouse " +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,product_uom:0 +msgid "" +"Unit of Measure used to show the quantities of stock calculation.You can use " +"units form default category or from second category (UoS category)." +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Planning and Situation for Calculated Period" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,planned_outgoing:0 +msgid "" +"Enter planned outgoing quantity from selected Warehouse during the selected " +"Period of selected Product. To plan this value look at Confirmed Out or " +"Sales Forecasts. This value should be equal or greater than Confirmed Out." +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Current Periods" +msgstr "Gjeldende perioder" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Internal Supply" +msgstr "Intern levering" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:724 +#, python-format +msgid "%s Pick List %s (%s, %s) %s %s \n" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_stock_sale_forecast_createlines_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_createlines +msgid "Create Sales Forecasts" +msgstr "Lag salgsprognoser" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_id:0 +msgid "Period4" +msgstr "Periode4" + +#. module: stock_planning +#: field:stock.period,name:0 +#: field:stock.period.createlines,name:0 +msgid "Period Name" +msgstr "Periodenavn" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_id:0 +msgid "Period2" +msgstr "Periode2" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_id:0 +msgid "Period3" +msgstr "Periode3" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_id:0 +msgid "Period1" +msgstr "Periode1" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_planning_createlines_form +msgid "" +"This wizard helps create MPS planning lines for a given selected period and " +"warehouse, so you don't have to create them one by one. The wizard doesn't " +"duplicate lines if they already exist for this selection." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,outgoing:0 +msgid "Confirmed Out" +msgstr "Bekreftet ut" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_stock_planning_createlines_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_createlines +#: view:stock.planning.createlines:0 +msgid "Create Stock Planning Lines" +msgstr "Lag lagerprognose linjer" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "General Info" +msgstr "Generell informasjon" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_sale_forecast_form +msgid "Sales Forecast" +msgstr "Salgsprognose" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_warehouse:0 +msgid "This Warehouse Period1" +msgstr "Dette lager periode1" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Sales History" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,supply_warehouse_id:0 +msgid "Source Warehouse" +msgstr "Kilde lager" + +#. module: stock_planning +#: help:stock.sale.forecast,product_qty:0 +msgid "Forecast Product quantity." +msgstr "Prognose prduktkvantum" + +#. module: stock_planning +#: field:stock.planning,stock_supply_location:0 +msgid "Stock Supply Location" +msgstr "" + +#. module: stock_planning +#: help:stock.period.createlines,date_stop:0 +msgid "Ending date for planning period." +msgstr "Sluttdato for planleggingsperiode" + +#. module: stock_planning +#: help:stock.planning.createlines,forecasted_products:0 +msgid "" +"Check this box to create planning for all products having any forecast for " +"selected Warehouse and Period. Product Category field will be ignored." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:632 +#: code:addons/stock_planning/stock_planning.py:678 +#: code:addons/stock_planning/stock_planning.py:702 +#, python-format +msgid "MPS(%s) %s" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,already_in:0 +msgid "Already In" +msgstr "Allerede inne" + +#. module: stock_planning +#: field:stock.planning,product_uom_categ:0 +#: field:stock.planning,product_uos_categ:0 +#: field:stock.sale.forecast,product_uom_categ:0 +msgid "Product UoM Category" +msgstr "Produktenhetskategori" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_view_stock_sale_forecast_form +msgid "" +"This quantity sales forecast is an indication for Stock Planner to make " +"procurement manually or to complement automatic procurement. You can use " +"manual procurement with this forecast when some periods are exceptional for " +"usual minimum stock rules." +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_view_stock_planning_form +msgid "" +"The Master Procurement Schedule can be the main driver for warehouse " +"replenishment, or can complement the automatic MRP scheduling (minimum stock " +"rules, etc.).\n" +"Each MPS line gives you a pre-computed overview of the incoming and outgoing " +"quantities of a given product for a given Stock Period in a given Warehouse, " +"based on the current and future stock levels,\n" +"as well as the planned stock moves. The forecast quantities can be altered " +"manually, and when satisfied with resulting (simulated) Stock quantity, you " +"can trigger the procurement of what is missing to reach your desired " +"quantities" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:685 +#, python-format +msgid "" +"Pick created from MPS by user: %s Creation Date: %s " +" \n" +"For period: %s according to state: \n" +" Warehouse Forecast: %s \n" +" Initial Stock: %s \n" +" Planned Out: %s Planned In: %s \n" +" Already Out: %s Already In: %s \n" +" Confirmed Out: %s Confirmed In: %s \n" +" Planned Out Before: %s Confirmed In Before: %s " +" \n" +" Expected Out: %s Incoming Left: %s \n" +" Stock Simulation: %s Minimum stock: %s " +msgstr "" + +#. module: stock_planning +#: field:stock.planning,period_id:0 +#: field:stock.planning.createlines,period_id:0 +#: field:stock.sale.forecast,period_id:0 +#: field:stock.sale.forecast.createlines,period_id:0 +msgid "Period" +msgstr "Periode" + +#. module: stock_planning +#: field:stock.sale.forecast,product_uos_categ:0 +msgid "Product UoS Category" +msgstr "Produkt salgsenhetskategori" + +#. module: stock_planning +#: field:stock.planning,active_uom:0 +#: field:stock.sale.forecast,active_uom:0 +msgid "Active UoM" +msgstr "Aktiv enhet" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Search Stock Planning" +msgstr "Søk lagerplanlegging" + +#. module: stock_planning +#: field:stock.sale.forecast.createlines,copy_forecast:0 +msgid "Copy Last Forecast" +msgstr "Kopier siste prognose" + +#. module: stock_planning +#: help:stock.sale.forecast,product_id:0 +msgid "Shows which product this forecast concerns." +msgstr "Viser hvilke produkter som denne pronosen omhandler" + +#. module: stock_planning +#: selection:stock.planning,state:0 +msgid "Done" +msgstr "Utført" + +#. module: stock_planning +#: field:stock.period.createlines,period_ids:0 +msgid "Periods" +msgstr "Perioder" + +#. module: stock_planning +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_creatlines +msgid "Create Stock Periods" +msgstr "Lag lagerperioder" + +#. module: stock_planning +#: view:stock.period:0 +#: selection:stock.period,state:0 +#: view:stock.planning.createlines:0 +#: view:stock.sale.forecast.createlines:0 +msgid "Close" +msgstr "Lukk" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +#: selection:stock.sale.forecast,state:0 +msgid "Validated" +msgstr "Validert" + +#. module: stock_planning +#: view:stock.period:0 +#: selection:stock.period,state:0 +msgid "Open" +msgstr "Åpen" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,copy_forecast:0 +msgid "Copy quantities from last Stock and Sale Forecast." +msgstr "Kopier kvantum fra siste lager og salgsprognose" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_dept:0 +msgid "This Dept Period1" +msgstr "Denne avdelingsperiode1" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_dept:0 +msgid "This Dept Period3" +msgstr "Denne avdelingsperiode3" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_dept:0 +msgid "This Dept Period2" +msgstr "Denne avdelingsperiode2" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_dept:0 +msgid "This Dept Period5" +msgstr "Denne avdelingsperiode5" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_dept:0 +msgid "This Dept Period4" +msgstr "Denne avdelingsperiode4" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_warehouse:0 +msgid "This Warehouse Period2" +msgstr "Dette lagers periode2" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_warehouse:0 +msgid "This Warehouse Period3" +msgstr "Dette lagers periode3" + +#. module: stock_planning +#: help:stock.planning,stock_supply_location:0 +msgid "" +"Check to supply from Stock location of Supply Warehouse. If not checked " +"supply will be made from Output location of Supply Warehouse. Used in " +"'Supply from Another Warehouse' with Supply Warehouse." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,create_uid:0 +msgid "Responsible" +msgstr "Ansvarlig" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Default UOM" +msgstr "Standard måleenhet" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_warehouse:0 +msgid "This Warehouse Period4" +msgstr "Dette lagers periode4" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_warehouse:0 +msgid "This Warehouse Period5" +msgstr "Dette lagers periode5" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Current" +msgstr "Gjeldende" + +#. module: stock_planning +#: help:stock.planning,supply_warehouse_id:0 +msgid "" +"Warehouse used as source in supply pick move created by 'Supply from Another " +"Warehouse'." +msgstr "" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_planning +msgid "stock.planning" +msgstr "stock.planning" + +#. module: stock_planning +#: help:stock.sale.forecast,warehouse_id:0 +msgid "" +"Shows which warehouse this forecast concerns. If during stock planning you " +"will need sales forecast for all warehouses choose any warehouse now." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:661 +#, python-format +msgid "%s Procurement (%s, %s) %s %s \n" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyze_company:0 +msgid "Per Company" +msgstr "Pr. firma" + +#. module: stock_planning +#: help:stock.planning,to_procure:0 +msgid "" +"Enter quantity which (by your plan) should come in. Change this value and " +"observe Stock simulation. This value should be equal or greater than " +"Confirmed In." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_company:0 +msgid "This Company Period4" +msgstr "Dette firmaets periode4" + +#. module: stock_planning +#: help:stock.planning.createlines,period_id:0 +msgid "Period which planning will concern." +msgstr "Periode som planleggingen omhandler" + +#. module: stock_planning +#: field:stock.planning,already_out:0 +msgid "Already Out" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,product_id:0 +msgid "Product which this planning is created for." +msgstr "Allerede ute" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Per Warehouse :" +msgstr "Pr. lager :" + +#. module: stock_planning +#: field:stock.planning,history:0 +msgid "Procurement History" +msgstr "Innkjøpshistorikk" + +#. module: stock_planning +#: help:stock.period.createlines,date_start:0 +msgid "Starting date for planning period." +msgstr "Startdato for planleggingsperioden." + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_createlines_form +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_period +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_main +#: view:stock.period:0 +#: view:stock.period.createlines:0 +msgid "Stock Periods" +msgstr "Lagerperioder" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Stock" +msgstr "Lager" + +#. module: stock_planning +#: help:stock.planning,incoming:0 +msgid "Quantity of all confirmed incoming moves in calculated Period." +msgstr "" + +#. module: stock_planning +#: field:stock.period,date_stop:0 +#: field:stock.period.createlines,date_stop:0 +msgid "End Date" +msgstr "Sluttdato" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "No Requisition" +msgstr "Ingen rekvisisjon" + +#. module: stock_planning +#: field:stock.sale.forecast,name:0 +msgid "Name" +msgstr "Navn" + +#. module: stock_planning +#: help:stock.sale.forecast,period_id:0 +msgid "Shows which period this forecast concerns." +msgstr "Viser hvilken periode prognosen omhandler." + +#. module: stock_planning +#: field:stock.planning,product_uom:0 +msgid "UoM" +msgstr "Måleenhet" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Closed Periods" +msgstr "Lukkede perioder" + +#. module: stock_planning +#: view:stock.planning:0 +#: field:stock.planning,product_id:0 +#: view:stock.sale.forecast:0 +#: field:stock.sale.forecast,product_id:0 +msgid "Product" +msgstr "Produkt" + +#. module: stock_planning +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_all +#: view:stock.sale.forecast:0 +msgid "Sales Forecasts" +msgstr "" + +#. module: stock_planning +#: field:stock.planning.createlines,product_categ_id:0 +#: field:stock.sale.forecast.createlines,product_categ_id:0 +msgid "Product Category" +msgstr "Produktkategori" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:672 +#, python-format +msgid "You must specify a Source Warehouse !" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,procure_to_stock:0 +msgid "Procure To Stock Location" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Approve" +msgstr "Godkjenne" + +#. module: stock_planning +#: help:stock.planning,period_id:0 +msgid "" +"Period for this planning. Requisition will be created for beginning of the " +"period." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:631 +#, python-format +msgid "MPS planning for %s" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,stock_start:0 +msgid "Initial Stock" +msgstr "Inngående lager" + +#. module: stock_planning +#: field:stock.sale.forecast,product_amt:0 +msgid "Product Amount" +msgstr "Produktbeløp" + +#. module: stock_planning +#: help:stock.planning,confirmed_forecasts_only:0 +msgid "" +"Check to take validated forecasts only. If not checked system takes " +"validated and draft forecasts." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_id:0 +msgid "Period5" +msgstr "Periode5" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_warehouse_id:0 +msgid "This Warehouse" +msgstr "Dette lager" + +#. module: stock_planning +#: help:stock.sale.forecast,user_id:0 +msgid "Shows who created this forecast, or who validated." +msgstr "Viser hvem som laget prognosen, eller godkjente." + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_team_id:0 +msgid "Sales Team" +msgstr "Salgsteam" + +#. module: stock_planning +#: help:stock.planning,incoming_left:0 +msgid "" +"Quantity left to Planned incoming quantity. This is calculated difference " +"between Planned In and Confirmed In. For current period Already In is also " +"calculated. This value is used to create procurement for lacking quantity." +msgstr "" + +#. module: stock_planning +#: help:stock.planning,outgoing_left:0 +msgid "" +"Quantity expected to go out in selected period besides Confirmed Out. As a " +"difference between Planned Out and Confirmed Out. For current period Already " +"Out is also calculated" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Calculate Sales History" +msgstr "Kalkuler salgshistorikk" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_sale_forecast_createlines_form +msgid "" +"This wizard helps create many forecast lines at once. After creating them " +"you only have to fill in the forecast quantities. The wizard doesn't " +"duplicate the line when another one exist for the same selection." +msgstr "" + +#~ msgid "Sales history" +#~ msgstr "Salgshistorikk" From 9876216c8e54dc7f3805fd74133cbec84a491eb0 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Tue, 24 Jul 2012 15:40:05 +0530 Subject: [PATCH 154/168] [IMP] l10n_in: now template will be installed for public and private once module installed bzr revid: mra@tinyerp.com-20120724101005-4y0175vnla1bxtza --- addons/l10n_in/__init__.py | 2 - addons/l10n_in/__openerp__.py | 5 +- addons/l10n_in/l10n_in_installer.py | 68 ----------------------- addons/l10n_in/l10n_in_installer_view.xml | 17 ------ 4 files changed, 4 insertions(+), 88 deletions(-) delete mode 100644 addons/l10n_in/l10n_in_installer.py delete mode 100644 addons/l10n_in/l10n_in_installer_view.xml diff --git a/addons/l10n_in/__init__.py b/addons/l10n_in/__init__.py index 4217c02d152..49a09e5570e 100644 --- a/addons/l10n_in/__init__.py +++ b/addons/l10n_in/__init__.py @@ -19,7 +19,5 @@ # ############################################################################## - -import l10n_in_installer # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_in/__openerp__.py b/addons/l10n_in/__openerp__.py index 18bc42a80cc..a6786b79b8f 100644 --- a/addons/l10n_in/__openerp__.py +++ b/addons/l10n_in/__openerp__.py @@ -37,8 +37,11 @@ Indian accounting chart and localization. "demo_xml": [], "update_xml": [ "l10n_in_tax_code_template.xml", + "l10n_in_public_chart.xml", + "l10n_in_public_tax_template.xml", + "l10n_in_private_chart.xml", + "l10n_in_private_tax_template.xml", "l10n_in_wizard.xml", - "l10n_in_installer_view.xml", ], "auto_install": False, "installable": True, diff --git a/addons/l10n_in/l10n_in_installer.py b/addons/l10n_in/l10n_in_installer.py deleted file mode 100644 index 0a15d034605..00000000000 --- a/addons/l10n_in/l10n_in_installer.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import fields, osv -from os.path import join as opj -import tools - -class l10n_installer(osv.osv_memory): - _inherit = 'account.installer' - _columns = { - 'company_type': fields.selection([('public_company', 'Public Ltd'), - ('partnership_private_company', 'Private Ltd/Partnership') - ], 'Company Type', required=True, - help='Company Type is used to install Indian chart of accounts as per need of business.'), - } - _defaults = { - 'company_type': 'public_company', - } - - def execute_simple(self, cr, uid, ids, context=None): - if context is None: - context = {} - - res = super(l10n_installer, self).execute_simple(cr, uid, ids, context=context) - - for chart in self.read(cr, uid, ids, context=context): - - if chart['charts'] =='l10n_in' and chart['company_type']=='public_company': - acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_chart.xml')) - - tools.convert_xml_import(cr, 'l10n_in', acc_file_path, {}, 'init', True, None) - acc_file_path.close() - - tax_file_path = tools.file_open(opj('l10n_in', 'l10n_in_public_tax_template.xml')) - tools.convert_xml_import(cr, 'l10n_in', tax_file_path, {}, 'init', True, None) - tax_file_path.close() - - elif chart['charts'] =='l10n_in' and chart['company_type']=='partnership_private_company': - acc_file_path = tools.file_open(opj('l10n_in', 'l10n_in_private_chart.xml')) - - tools.convert_xml_import(cr, 'l10n_in', acc_file_path, {}, 'init', True, None) - acc_file_path.close() - - tax_file_path = tools.file_open(opj('l10n_in', 'l10n_in_private_tax_template.xml')) - tools.convert_xml_import(cr, 'l10n_in', tax_file_path, {}, 'init', True, None) - tax_file_path.close() - - return res - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/l10n_in/l10n_in_installer_view.xml b/addons/l10n_in/l10n_in_installer_view.xml deleted file mode 100644 index 63dbe44eabd..00000000000 --- a/addons/l10n_in/l10n_in_installer_view.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - account.installer.form - account.installer - form - - - - - - - - - - From ab9071e4775f9f513e3739d0bed16b20f2baceda Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Tue, 24 Jul 2012 15:54:49 +0530 Subject: [PATCH 155/168] [FIX] Small fix bzr revid: mra@tinyerp.com-20120724102449-3g1b2glwmw0thir7 --- addons/l10n_in/l10n_in_private_tax_template.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/l10n_in/l10n_in_private_tax_template.xml b/addons/l10n_in/l10n_in_private_tax_template.xml index d78dc2cbad4..7aec30f0575 100644 --- a/addons/l10n_in/l10n_in_private_tax_template.xml +++ b/addons/l10n_in/l10n_in_private_tax_template.xml @@ -53,7 +53,7 @@ - + Purchase Tax-15% From 2f10bc40713f3cffddf6d7ad11182bcf08b35642 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 24 Jul 2012 13:56:59 +0200 Subject: [PATCH 156/168] [IMP] validation of search_default values for m2o fields Just because the search_default is an array does not mean it's a name_get apparently: there are many cases of a single id wrapped in an array (``[id]``). So ensure that the search_default is an array *of length 2 whose second element is a string* before considering it a name_get and using it as-is (without resolving the label via an explicit name_get). Also, error out for any m2o search_default which is an array of length > 1 (unless the second element is a string as per description above). bzr revid: xmo@openerp.com-20120724115659-l0n0gjr91bcop13z --- addons/web/static/src/js/search.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 504510ef133..8de2562a798 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -1475,7 +1475,17 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ facet_for: function (value) { var self = this; if (value instanceof Array) { - return $.when(facet_from(this, value)); + if (value.length === 2 && _.isString(value[1])) { + return $.when(facet_from(this, value)); + } + if (value.length > 1) { + // more than one search_default m2o id? Should we OR them? + throw new Error( + _("M2O search fields do not currently handle multiple default values")); + } + // there are many cases of {search_default_$m2ofield: [id]}, need + // to handle this as if it were a single value. + value = value[0]; } return this.model.call('name_get', [value], {}).pipe(function (names) { if (_(names).isEmpty()) { return null; } From 6b719b708f18a18543368b18031643f98b00910b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 24 Jul 2012 14:46:07 +0200 Subject: [PATCH 157/168] [IMP] trigger a new search when clicking on the searchview's spyglass Required reifying the purely decorative spyglass (created via :before) into an actual button and moving that button to the right place (after removing all decorations set by default on buttons e.g. shadows &al). apr request. bzr revid: xmo@openerp.com-20120724124607-bc1nsywtth7cn11i --- addons/web/static/src/css/base.css | 55 +++++++++++++---------------- addons/web/static/src/css/base.sass | 23 ++++++------ addons/web/static/src/js/search.js | 6 ++++ addons/web/static/src/xml/base.xml | 2 ++ 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 2e26de30d5f..2be11ff020d 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1,4 +1,4 @@ -@charset "UTF-8"; +@charset "utf-8"; @font-face { font-family: "mnmliconsRegular"; src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot"); @@ -1408,20 +1408,31 @@ filter: alpha(opacity=50); opacity: 0.5; } +.openerp .oe_searchview .oe_searchview_search { + font-size: 1px; + letter-spacing: -1px; + color: transparent; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + position: absolute; + left: 3px; + top: 1px; + padding: 0; + border: none; + background: transparent; +} +.openerp .oe_searchview .oe_searchview_search:before { + font: 21px "mnmliconsRegular"; + content: "r"; + color: #a3a3a3; +} .openerp .oe_searchview .oe_searchview_facets { min-height: 22px; -} -.openerp .oe_searchview .oe_searchview_facets:before { - color: #cccccc; - font-family: "mnmliconsRegular"; - content: "r"; - font-size: 130%; - display: inline; - position: relative; - left: 6px; - top: 2px; - color: #a3a3a3; - padding-right: 4px; + margin-left: 15px; } .openerp .oe_searchview .oe_searchview_facets * { vertical-align: top; @@ -2180,7 +2191,7 @@ height: auto; line-height: 16px; } -.openerp .oe_form_field_one2many .oe_list_buttons.oe_editing .oe_list_save { +.openerp .oe_form_field_one2many .oe_list_buttons.oe_editing .oe_list_save, .openerp .oe_form_field_many2many .oe_list_buttons.oe_editing .oe_list_save { visibility: hidden; } .openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page { @@ -2266,9 +2277,6 @@ padding: 3px 6px; white-space: pre-line; } -.openerp .oe_list_content > tbody > tr > td.oe_list_field_cell progress { - width: 100%; -} .openerp .oe_list_content > tbody > tr > td > button, .openerp .oe_list_content > tbody > tr > th > button { border: none; background: transparent; @@ -2441,19 +2449,6 @@ .kitten-mode-activated > * { opacity: 0.7; } -.kitten-mode-activated .oe_footer a { - background-image: url(http://www.risacher.com/la-rache/zfiles/la-rache.png); - font-size: 1px; - letter-spacing: -1px; - color: transparent; - display: inline-block; - height: 15px; - width: 80px; - vertical-align: top; -} -.kitten-mode-activated .oe_footer a span { - display: none; -} div.ui-widget-overlay { background: black; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index c4314923867..aef356d3ab6 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1101,19 +1101,20 @@ $sheet-max-width: 860px border-right: 5px solid transparent @include opacity() + .oe_searchview_search + @include text-to-icon("r", #a3a3a3) + @include box-shadow(none) + @include radius(0) + position: absolute + left: 3px + top: 1px + padding: 0 + border: none + background: transparent + .oe_searchview_facets min-height: 22px - &:before - color: #ccc - font-family: "mnmliconsRegular" - content: "r" - font-size: 130% - display: inline - position: relative - left: 6px - top: 2px - color: #a3a3a3 - padding-right: 4px + margin-left: 15px * vertical-align: top display: inline-block diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 8de2562a798..8ffd672c143 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -330,6 +330,12 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea }); } + // Launch a search on clicking the oe_searchview_search button + this.$element.on('click', 'button.oe_searchview_search', function (e) { + e.stopImmediatePropagation(); + self.do_search(); + }); + this.$element.on('keydown', '.oe_searchview_input, .oe_searchview_facet', function (e) { switch(e.which) { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index ed63b5fbfbe..e4aa6797ba6 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1220,6 +1220,8 @@
    +
    Date: Tue, 24 Jul 2012 15:23:09 +0200 Subject: [PATCH 158/168] [FIX] sale: add field state in the lines of sale order form, for the web client to process modifiers correctly bzr revid: rco@openerp.com-20120724132309-myn4wcezcqmu40zt --- addons/sale/sale_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 3f7f7efa43b..111eee54c28 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -256,6 +256,7 @@
    + From d6ef80f21ec65edb9586b2d76f3c8a90b9353548 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 24 Jul 2012 15:24:14 +0200 Subject: [PATCH 159/168] [IMP] Changed throbber bzr revid: nicolas.vanhoren@openerp.com-20120724132414-27ylo4ls48agwnel --- addons/web/static/src/img/throbber2.gif | Bin 7195 -> 404 bytes addons/web/static/src/js/coresetup.js | 2 ++ 2 files changed, 2 insertions(+) diff --git a/addons/web/static/src/img/throbber2.gif b/addons/web/static/src/img/throbber2.gif index 5d2057ae0e77ab9a76037202ea66827d66b8cd3f..2fd8e0737ed41ba0a01b98f40688c325d5574762 100644 GIT binary patch literal 404 zcmZ?wbhEHb)Mnsj_{hNU|Nnmm28O1lCLpQ!pWDwhB-q(8z|~04fSC~_^iRsUC^fMp zHASI3vm`?yF)OhmCqFSoFEcMKpF!~_3nv#)l@1UyfDB|{GHU7LI6dv=jpolsxuoxf zeLmg#z^pAIa$%Z!?Y&w1mh+_RdR}iorT6Q|=AU*u7AP3`hypFaG{*J_&=>{&#N>^$ zT8^)&`8*@>-uIrA88haeTIl8MRiLwjJ^Sp&wJ%lpHZi7(NaaU-s_i@FclpsQour`S z>#>^%a+m?o#FewMqVMEC;^z|HUiq-HXUUZXD|YcM<39A-C)up?`N?xHe+JE(vBva_ zL67^Xm!D<=OgMMMm%sE9!U5m6(8B5vIg5Ks|uVUfY8 zfQZW=qJxOqK@bHObaaMso9L*6jB_Tg<8qYS=gh6SRkv={J^lILRoz|PZ~fk({T}zkmPf)2AYthl&X ztJQAYxUs&zzP7e@_3G7?m6Zhr1vxo6%af$XK{=VMn!Y?|+^9 zuiFH$QKD9(^tRq{r6K2PcF_L8=3Hw55BUDr-Z35$lLSYn*0HnD1iijO!p-FLYO_y_ zLvakIqFqcfIeZM{uHF)Xv(Rl^7-n&J5X3Vu%Jv}sVuW0|R*gM!McNE7W$en?PoKSeeP>@Hpr7KZ!>@Xouc!m^yCrFyK-JEJ zo0UJbvH>pHSN7* zedai=eLJP=;29;%(Rc-Vxa`&YUs|(7N@n#sFG#Z8DyvYXYKvH_p8IGflEE^Ukne_J`vs0pfEMLQoDlI+jj{<5T8lLmj+>Vy#*a&u zu=Q@*@}Ze=AGSYMgq=J!nl(i0&{m;sli|WtXfjbv?6|?S`-e)fAN1`P_GQoo?ly-d61Z#aE7$JIdPU3+BUG>%!#xF@A?F&LZ4_Be8iMMBpjAu*XgRuhI93L9`?Fi2E=tf!1 zO?^izBO~WS&Uf#Pap#p}jp|W5xsgJCR2(F0S(-t4fqgz9Z)oY6tH+&7R7Yo~OxlVg z=1InRncSW~uYeBOfdpcM*su$1@(G=NpM?&jt13xqJ?d3aXJ-}+EZ8Wz`PKzB4OX1Q z%e@Ib7JoqbGI!p5YX#<#Hh2UPMydUAe)TN?5v!ISM1LHwYC3S9HwaLoD^K*us_}qB zK$^_be~z+uj681_)vCuGB;nq$z-4j|e0`ZZ@K)HY ziq%%^d4uz7rDW^u1^$pgS3!bch=9AN zXh)wRFS}0~aK}OdV$X4#;UknvZcv!iC0hR^R9~+U2Ue(5%gzrAaCty}t~UaGkKI=n zwWzz!u&AFmtcc&LE`)GgfedliSqG*zJGI)60e*#*-f_FqGW9_GC8fG5OXSV<|x&>G=nYRx?snw&^@hA6ZA#q9VUr4N-l!K zY^7y~+B>mk#|;-Loa0T!^3=YKxW_K4hQKzy-{)>{FYR0@TH;HNGhI&uJBAi``N^S4 zO@`-c>bdV&LRw;iHQjoJ$g%foDdNl~PM#(uzG=-Bo)CZ7TxK;oi zb;ltqRrSQ1Mu1xL9rFkjC0 z&=r|h$YA9@PJThJg|!QL`gr4#^j#H{q(_Z?*9fq3&rv%qPP;+A^{QVI5LPw0#*u7^ z-+8uB&~8|4l{C5|?{^g#m@eHON(1@hjrTMUJjN?p$@AfNdVarU0N?Dn9-kmAPkGP? zIJH`$WhWz38ePGQuF~fX{lGoGwkw)4o*&8^yXK7fs@=!`NJ}QQqOY%{Y8m9bsKJfCp(~GEA z`x5_H3z+ryKBy>7PUZJBf@2T97WjXd@~U|Gz|potSV{#X+cM{x^n=|z$5*6ay|m{S z*H+K=$a%7|8Z2j{r;A9SoxZ$eZ>4eWQ=ec^G}UlZF-V9n&LENws^O0+k{xK+hUpBb zxEgJkx79daSbgR881*pdHmEgI(o6Thr{g8EESF^Bj4%mi$*d{P&DBTQy1e7t1-DAO zkAm(U$FT0lpasI~yVRsdCsaUY*`2Lb$A4QqBK+N*(7~?Hi)sr*$bWmo?|-~e#Bhp1 z6+bYT1olYd$%jpbU98|xaSQ$~ll!%p2+CF&FsHn9(+8(M#fs958< zYi}Y}njz0%i+c zqVg+ZnvQ}TZHoEp@Fxv5$(ygM1gpCd4z~K6JlCwT_hFtSFzJO(b-pspRwbEnfJ&L2 z^~KFs+CinmN}<^tO%;UVH$8Utz37#!CROh*K&I9neHD5V=2`owpS06$g;?ZK z)(qX3ZZz!@_n5aVH6)1h^gIQ!Mowy)^|Nwlec20+KwLtVKK8pBV6TESFK%=zyfZ?4Rr`~bz*;Q?3t%qL6Js~R+Zu_ zrM_WDssZB2xcMo4&Md%y1JwTMfc& z!)dyC0hZxjKha8OhvbH4S)wLV6}j46U3;X7d7LCFso0{g6Xh-OJT&p4KgAN{=VOc4 z%mk`8SgH!VPJD`Y)??Bv9q5*8vQG;4KHBY#c-B&)$rpb5aa0euruOw6hm_SMgvtJ- zQN5dW5+==-b|YiX~q7=Rigz4mXr_YC^1HN3(l+X7nK z>I$8fvP?aafwn{HAtC@+ewIK@GI^3dT@bnKTiArRNY4#!K@rRNirPZn6=#wq+Ez)U z7RJW_%l2&x$hOxEyaJ}*)TDeHzsax)ne|P~&z-L0r3&m$i9lb=Q`3M0OpqWue~SP@ z4%G(rAd-CDW7hsJ7V-^gS$g`I65b=nUJH!+`-gy`c1I+i&_0qLv#GWYkr+UhL#9!V zjt|#R4T@>6Y9PPhZ{#e_8mrMszugU{X|UB)NWBm!RpvjM2p&@}CSPbOK+whD15{wU zhhRB195J>dw#NJ5U77J5R@3EIs!n9fQ*w<|zu2fTe zB8*!7f<}1aB36bP5`{*7Y3*a7L%lwZ5;^nkK*Hu!nTZF@GttnZ6aOeSQ$60(q}$(D zYKS!xv(TfC{+ySCh%-~zO*^7D=S3!U-WeSRJ$Z zQ%e>)ILY+vNCVib15ooTiw;#N2j>3JmN%oC#6zVWoQ{~{+LJbSmB597-$TTrK}S}w z8sZ20p=qBZ>)iqdc+E6oWjr9ZmIm_A^WsWe6lkDsEPt@vvJVM?QYOGqHGsM&QE1|= zX5@P1Uhhnbo8(%As_11x+}i1xvJe!DS4>|ucR`5;EIA=XN6kOo(t=7l;?uuji$3k%=`6R_tXFw#&lOW*s4hhO%5 z`1J(n%8|Erce9ANQ~);98c>;p%SzT!N3(MGeYakLA%B9AS2f~Te+4+U8*4JqHj(-Q`?Px?vNDqqe`l4_sdqC(E!{=HrF{kK6u zFY9ikLw@YPMSYyHC}vN$)@3zLU5JZP{k{MEQ%IXC*!M z;y|)%3w{mz1A41tU3^*v+u-*+MCtv7kW7pO{z}e_C!0Q|6Y(?dz`n!Onn@oneU>KR zYO>+ZiF9>lDUceVzJ{M0>Q&mc+S^xAJv+m3$Mexc)Gnv1Kzmha{wD& zxg*5(DXf%UnP8s-2mVRDE#`F0_*!m%&rDm=7;=90EpkQUJ~FLbC%db7+5A=jT6Hn~ z!En2x$Vlzj4#Z#Wc``mu^fckxbjT}dY~8QH2)9sI_;v0xb}%_)R;Rn_yf+5y{s1T( z1=Nk(lT-dGch2NDPP=7RANIMMOmWhq>wh#*rriKw!)2rD7hYQ0NE7#__jY zvXo0D7rIZby%2gBWCQY77Get?2ILloYT-@X6qvOh2KXijfE5*DI1aPn>{=LF0YD_C z-Mgx02?o~HELf13s7-86uU^9C=C`)CUEIK0cqV=ctCI_Z=TEk^V|@Nbv?pdG@C|qQ zz_p=^htS8+=DRa@v(V!pkTp>Eux%0a2A}h6#>+k~J1MFE+Qa7`g{nX7cR`=-bG|<7e=d*#V>^12Q_tmJhPsO! zaNj&4y|X3L-cKX@L_r&u@h5pCAJ9^5R({1^BDK6J2e%3y+VE-IPCz_&HVNE+bHNH{ z%bL~l?iW`7ED;WkeX}Ch5iDGw5hRch+r?2u690@&PV zc$1x{Sb^IxWrSt!FJWm5c<7(V0m4XskH_Ee})C+M0>eyXo?WMJOP?XhSg0C_Z=h$pNZ6Bqc zpwin#4S1J4glRR?xRoE1~t}O@mlx(3<@%JqafmUe!{MHi1eVwj7uFD`<-*CG(-3E zWzQ3cV|;jTmZ^*YkgSoO9YFMyc=GVd`l@>CYAqf*9sP(4^zWRzr*A@ByIDMNR7aMuVhnVyrp+b(@XS?qU{7 zhctt{%+kSlBz?-~WGyx_=^brra;&9lqqV=694?cqcLTztLA{OX%nJSTp1tw61wyq7 zVv$?#yMf7pgZEI8r$CE|B1!#Jb|^td4SdPhYq#yw64tKEJbNGs;G-)jKJyWH9Q)yj zL(Lba*%U&p4>_o<*f@HN=jt;o$EOzU#b6`b@e}E^yWDCdRz*&DlH}5AnrN<^Qm5kKXBzLu>~m?2g-lg~ZkEk1q8q1S2QWZU zL6bphFeJSgz)KX3J}PjdL<((P7xyL}n|7l0fGG4e`8ATh__G}ihDg*UZmNsjbvN1E zE2h8IR{72w<2Kt*PImgk#jx5`bs2cH13L}WnhX2}VhOQ*YnSDmz9RAZE0&=U7b;P2 zTK?N3*0f=AK%glc@U=vA(kXdGQY5_2fGo)0J+bRCvw@?r2;(%<#8(mNUiB~9l0cL8 zQ8!N9=Y@Ev5nx~V*8J6G2k)}?J)+$-VpDS0aevz-R)wbg3A>yXZ2(P_^5Rb-J(l*? zEn4C;&7{OC^q|Elt9Tt^Geo0G6(rWt$TojF_L`7Bj`x+2nEcWfg_MfULP1tP&1!Ko zE9ruRZcYcVlv2nfSZSF*5am+zJ@K}2>xPjJhY+}=K5hfKYysY9xmV8Tcil$DsBWg) zo&_%5nH4P1Wgt3$8uvOTavu8{S~%&NpzsZMm{2YXG)9^i5|(Bv3bjyO6qy_j@B*lf zg~JH{WehS4+%{n=Nv7Vr2Ji2vR63K8c>{sk4Q=PdYbJ6YxYUon%H}hch$)*O2L(}$ zH>Jj|WGf1CK;>}n+Qykmb>mp33WcgcCYZqpFv2SKyZTSkfI3U&jf5Kf=#@EM;Zph? zA%*TccCU_L%UKE;D5eQ?`a?3m&ibZV4>3(BsWmf^1w$^kaF#^RpSbpipKK2tnO;PF zBa_0WJQgy(Le6@Awg~(1a#PYIj(P>&+--5%*HfcsM+5Nd4gzz}oXJa)HDQ?tz{2s7 zZ`4Uv5UF02-TrV-g`=5MwhonjAmiN6YR&V9p)q$M64(OXyOCxVMiO6@K)}x8OA+i) zEz6qQ@ox8lkjFFnCPN>~drN>lE*+y}-ll{J_mLvd7N3vU8pJK{gwppVK%Y#9?Mw+@ zP(Luh6Bw?WW&+X@oCag9n!l#7!9Jlz*qq^q(u$4e2|TF#qdIMPkE{3wy#%|;e(2PF z>c_BRpQ-CjxxBcZU%r&gS)4r|KbmAIYHDS<$sX;y_F;eL%#%Lif}rEi)2rX!DmCR48x)$C{ zTYvVV#I}J#K{&m8o~F~Rdk+3_BVC3SjW#nMCp6#n?ojAG{6Ud%Ajx(Yr)w-Ii z)c{XT^1}M)^*emJF(OJ0C2o9q+v9p6K4B(UT+V{c@zbJfXJa>y96aKqZr`82q41E? zX*guHJl4^Wnc|)bW&KVgZV^-tIwX}df2c;es_F9RIT6#tnV(iA<9!w{$$-Lwl4q~T zS(+TTA}?oA`l@94@+HesbC;}GzA8B)JvC=l^1sJG-~Vj*-(#TPe>VK@F%SeM{}=NC B5|jV{ diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js index a5a62b9bcc1..801ce50bc2d 100644 --- a/addons/web/static/src/js/coresetup.js +++ b/addons/web/static/src/js/coresetup.js @@ -551,6 +551,8 @@ $.async_when = function() { if ($.blockUI) { $.blockUI.defaults.baseZ = 1100; $.blockUI.defaults.message = ''; + $.blockUI.defaults.css.border = '0'; + $.blockUI.defaults.css["background-color"] = ''; } /** Setup default session */ From fceb94cb8ac1af2fdb6f88e6b86632552075baf1 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Tue, 24 Jul 2012 15:46:52 +0200 Subject: [PATCH 160/168] Changed style of About dialog box to match login page style bzr revid: mit@openerp.com-20120724134652-t783h7glntytr3kv --- addons/web/static/src/css/base.css | 41 +++++++++++++++++++++++++- addons/web/static/src/css/base.sass | 25 +++++++++++++++- addons/web/static/src/img/pattern.png | Bin 98 -> 0 bytes addons/web/static/src/js/chrome.js | 2 +- addons/web/static/src/xml/base.xml | 27 ++++++++--------- 5 files changed, 78 insertions(+), 17 deletions(-) delete mode 100644 addons/web/static/src/img/pattern.png diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index eda3a996d23..3b2fb526144 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -267,6 +267,45 @@ color: black; text-decoration: none; } +.openerp.ui-dialog .oe_about { + background-color: white; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=); + -moz-border-radius: 0 0 2px 2px; + -webkit-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; +} +.openerp.ui-dialog .oe_about a { + color: #8a89ba; +} +.openerp.ui-dialog .oe_about a:hover { + text-decoration: underline; +} +.openerp.ui-dialog .oe_about .oe_logo { + margin-left: -6px; +} +.openerp.ui-dialog .oe_about .oe_bottom { + position: absolute; + top: 50%; + left: 0; + right: 0; + bottom: 0; + text-shadow: 0 1px 1px #999999; + background-color: #b41616; + background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606)); + background-image: -webkit-linear-gradient(top, #b41616, #600606); + background-image: -moz-linear-gradient(top, #b41616, #600606); + background-image: -ms-linear-gradient(top, #b41616, #600606); + background-image: -o-linear-gradient(top, #b41616, #600606); + background-image: linear-gradient(to bottom, #b41616, #600606); + color: #eeeeee; + padding: 0 16px; + -moz-border-radius: 0 0 2px 2px; + -webkit-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; +} +.openerp.ui-dialog .oe_about .oe_bottom a { + color: #eeeeee; +} .openerp.ui-dialog.oe_act_window .ui-dialog-content { padding: 0px; } @@ -711,7 +750,7 @@ z-index: 1050; } .openerp .oe_login { - background: url("/web/static/src/img/pattern.png") repeat; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=); text-align: center; font-size: 14px; height: 100%; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index dbd3d30f453..de0ab08391b 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -256,6 +256,29 @@ $sheet-max-width: 860px &:hover color: black text-decoration: none + .oe_about + background-color: white + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=) + @include radius(0 0 2px 2px) + a + color: #8A89BA + &:hover + text-decoration: underline + .oe_logo + margin-left: -6px + .oe_bottom + position: absolute + top: 50% + left: 0 + right: 0 + bottom: 0 + text-shadow: 0 1px 1px #999999 + @include vertical-gradient(#b41616, #600606) + color: #eee + padding: 0 16px + @include radius(0 0 2px 2px) + a + color: #eee &.ui-dialog.oe_act_window .ui-dialog-content @@ -567,7 +590,7 @@ $sheet-max-width: 860px // }}} // Login {{{ .oe_login - background: url("/web/static/src/img/pattern.png") repeat + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=) text-align: center font-size: 14px height: 100% diff --git a/addons/web/static/src/img/pattern.png b/addons/web/static/src/img/pattern.png deleted file mode 100644 index 7e3a2b3783419e6e5d6caf570adad0ff72359ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=O-~oc5DwYonlCRd*0Y%$V0!fV v!-oT{tgNh(GauNfu!T8pD4QUr(#pdyMTNya*NmeZsENVT)z4*}Q$iB}iHRDp diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 2ab4b61d9c0..28dc9020c4e 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -851,7 +851,7 @@ instance.web.UserMenu = instance.web.Widget.extend({ window.location.href, 'debug'); }); instance.web.dialog($help, {autoOpen: true, - modal: true, width: 960, title: _t("About")}); + modal: true, width: 580, height: 290, resizable: false, title: _t("About")}); }); }, }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 1bbffe3e2a7..da19e6da0a3 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -329,21 +329,20 @@ -
    - Activate the developer mode -

    OpenERP

    -

    Version

    -

    - Copyright © 2004-TODAY OpenERP SA. All Rights Reserved.
    - OpenERP is a trademark of the OpenERP SA Company. -

    -

    - Licenced under the terms of GNU Affero General Public License -

    -

    - For more information visit OpenERP.com -

    + +
    + Activate the developer mode + +

    Version

    + +
    +

    Copyright © 2004-TODAY OpenERP SA. All Rights Reserved.
    + OpenERP is a trademark of the OpenERP SA Company.

    +

    Licenced under the terms of GNU Affero General Public License

    +

    For more information visit OpenERP.com

    +
    +
    From 35bb49701c1479be1129fd7b2969ede90b7978b9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 24 Jul 2012 15:56:55 +0200 Subject: [PATCH 161/168] [IMP] keep focus in the same column when navigating to the previous/next record with up/down arrows bzr revid: xmo@openerp.com-20120724135655-hjk2l0mxvncker4q --- .../web/static/src/js/view_list_editable.js | 47 ++++++++++++------- doc/form-notes.rst | 6 +++ 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 56df125c98b..707e0d196f1 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -202,6 +202,8 @@ openerp.web.list_editable = function (instance) { return; } + // FIXME: need better way to get the field back from bubbling (delegated) DOM events somehow + field.$element.attr('data-fieldname', field_name); self.fields_for_resize.push({field: field, cell: cell}); }, options).pipe(function () { $recordRow.addClass('oe_edition'); @@ -399,18 +401,20 @@ openerp.web.list_editable = function (instance) { * * @private * @param {String} [next_record='succ'] method to call on the records collection to get the next record to edit + * @param {Object} [options] + * @param {String} [options.focus_field] * @return {*} */ - _next: function (next_record) { + _next: function (next_record, options) { next_record = next_record || 'succ'; var self = this; return this.save_edition().pipe(function (saveInfo) { if (saveInfo.created) { return self.start_edition(); } - return self.start_edition( - self.records[next_record]( - saveInfo.record, {wraparound: true})); + var record = self.records[next_record]( + saveInfo.record, {wraparound: true}); + return self.start_edition(record, options); }); }, keyup_ENTER: function () { @@ -440,25 +444,34 @@ openerp.web.list_editable = function (instance) { } return selection.start; }, - keydown_UP: function (e) { + /** + * @param DOMEvent event + * @param {String} record_direction direction to move into to get the next record (pred | succ) + * @param {Function} is_valid_move whether the edition should be moved to the next record + * @private + */ + _key_move_record: function (event, record_direction, is_valid_move) { if (!this.editor.is_editing('edit')) { return $.when(); } // FIXME: assumes editable widgets are input-type elements - var index = this._text_cursor(e.target); + var index = this._text_cursor(event.target); // If selecting or not at the start of the input - if (index === null || index !== 0) { return $.when(); } + if (!is_valid_move(event.target, index)) { return $.when(); } - e.preventDefault(); - return this._next('pred'); + event.preventDefault(); + var source_field = $(event.target).closest('[data-fieldname]') + .attr('data-fieldname'); + return this._next(record_direction, {focus_field: source_field}); + + }, + keydown_UP: function (e) { + return this._key_move_record(e, 'pred', function (el, index) { + return index === 0; + }); }, keydown_DOWN: function (e) { - if (!this.editor.is_editing('edit')) { return $.when(); } - // FIXME: assumes editable widgets are input-type elements - var index = this._text_cursor(e.target); - // If selecting or not at the end of the input - if (index === null || index !== e.target.value.length) { return $.when(); } - - e.preventDefault(); - return this._next(); + return this._key_move_record(e, 'succ', function (el, index) { + return index === el.value.length; + }); }, keydown_TAB: function (e) { var form = this.editor.form; diff --git a/doc/form-notes.rst b/doc/form-notes.rst index fc450a336e1..98d4a4de67e 100644 --- a/doc/form-notes.rst +++ b/doc/form-notes.rst @@ -47,3 +47,9 @@ Undocumented stuff * What is the difference between ``readonly`` and ``effective_readonly``? + +* No facilities for DOM events handling/delegations e.g. handling + keyup/keydown/keypress from a form fields into the form's user. + + * Also no way to reverse from a DOM node (e.g. DOMEvent#target) back to a + form view field easily From b98723a1fed138068b1b1db936ab0f0ca704bb93 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 24 Jul 2012 16:12:20 +0200 Subject: [PATCH 162/168] [IMP] improved throbber bzr revid: nicolas.vanhoren@openerp.com-20120724141220-1u0odsgsxzjtc5xn --- addons/web/__openerp__.py | 1 + addons/web/static/src/img/throbber2.gif | Bin 404 -> 0 bytes addons/web/static/src/js/chrome.js | 14 +++++------ addons/web/static/src/js/coresetup.js | 32 +++++++++++++++++++++++- addons/web/static/src/js/data_export.js | 4 +-- addons/web/static/src/js/view_form.js | 4 +-- addons/web/static/src/js/views.js | 8 +++--- 7 files changed, 47 insertions(+), 16 deletions(-) delete mode 100644 addons/web/static/src/img/throbber2.gif diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 9e8e258dedc..4051e607e21 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -20,6 +20,7 @@ "static/lib/jquery.form/jquery.form.js", "static/lib/jquery.validate/jquery.validate.js", "static/lib/jquery.ba-bbq/jquery.ba-bbq.js", + "static/lib/spinjs/spin.js", "static/lib/jquery.blockUI/jquery.blockUI.js", "static/lib/jquery.ui/js/jquery-ui-1.8.17.custom.min.js", "static/lib/jquery.ui.timepicker/js/jquery-ui-timepicker-addon.js", diff --git a/addons/web/static/src/img/throbber2.gif b/addons/web/static/src/img/throbber2.gif deleted file mode 100644 index 2fd8e0737ed41ba0a01b98f40688c325d5574762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmZ?wbhEHb)Mnsj_{hNU|Nnmm28O1lCLpQ!pWDwhB-q(8z|~04fSC~_^iRsUC^fMp zHASI3vm`?yF)OhmCqFSoFEcMKpF!~_3nv#)l@1UyfDB|{GHU7LI6dv=jpolsxuoxf zeLmg#z^pAIa$%Z!?Y&w1mh+_RdR}iorT6Q|=AU*u7AP3`hypFaG{*J_&=>{&#N>^$ zT8^)&`8*@>-uIrA88haeTIl8MRiLwjJ^Sp&wJ%lpHZi7(NaaU-s_i@FclpsQour`S z>#>^%a+m?o#FewMqVMEC;^z|HUiq-HXUUZXD|YcM<39A-C)up?`N?xHe+JE(vBva_ zL67^Xm!D<=O Date: Tue, 24 Jul 2012 17:01:12 +0200 Subject: [PATCH 163/168] [ADD] focus previous/next field when using the left/right arrow while at the start/end of a field bzr revid: xmo@openerp.com-20120724150112-r8liahdyaxmx49o8 --- .../web/static/src/js/view_list_editable.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 707e0d196f1..f2ce08f12ca 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -473,6 +473,52 @@ openerp.web.list_editable = function (instance) { return index === el.value.length; }); }, + + keydown_LEFT: function (e) { + // If the cursor is at the beginning of the field + var source_field = $(e.target).closest('[data-fieldname]') + .attr('data-fieldname'); + var index = this._text_cursor(e.target); + if (index !== 0) { return $.when(); } + + var fields_order = this.editor.form.fields_order; + var field_index = _(fields_order).indexOf(source_field); + + // Look for the closest visible form field to the left + var fields = this.editor.form.fields; + var field; + do { + if (--field_index < 0) { return $.when(); } + + field = fields[fields_order[field_index]]; + } while (!field.$element.is(':visible')); + + // and focus it + field.focus(); + return $.when(); + }, + keydown_RIGHT: function (e) { + // same as above, but with cursor at the end of the field and + // looking for new fields at the right + var source_field = $(e.target).closest('[data-fieldname]') + .attr('data-fieldname'); + var index = this._text_cursor(e.target); + if (index !== e.target.value.length) { return $.when(); } + + var fields_order = this.editor.form.fields_order; + var field_index = _(fields_order).indexOf(source_field); + + var fields = this.editor.form.fields; + var field; + do { + if (++field_index >= fields_order.length) { return $.when(); } + + field = fields[fields_order[field_index]]; + } while (!field.$element.is(':visible')); + + field.focus(); + return $.when(); + }, keydown_TAB: function (e) { var form = this.editor.form; var last_field = _(form.fields_order).chain() From da361d10427df704a9a9fa8b365627aae75fc3b7 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Tue, 24 Jul 2012 17:34:05 +0200 Subject: [PATCH 164/168] [IMP] crm: crm.case.stage should be readable by all, to allow new statusbar widgets to work for stages bzr revid: odo@openerp.com-20120724153405-8owoyo60bjgnq60r --- addons/crm/security/ir.model.access.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 91e5f1c1769..fd11a8e64c4 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -16,7 +16,7 @@ access_crm_phonecall,crm.phonecall,model_crm_phonecall,base.group_sale_salesman, access_crm_phonecall_all,crm.phonecall.all,model_crm_phonecall,base.group_user,1,0,0,0 access_crm_case_section_user,crm.case.section.user,model_crm_case_section,base.group_sale_salesman,1,1,1,0 access_crm_case_section_manager,crm.case.section.manager,model_crm_case_section,base.group_sale_manager,1,1,1,1 -access_crm_case_stage,crm.case.stage,model_crm_case_stage,base.group_user,1,0,0,0 +access_crm_case_stage,crm.case.stage,model_crm_case_stage,,1,0,0,0 access_crm_case_stage_manager,crm.case.stage,model_crm_case_stage,base.group_sale_manager,1,1,1,1 access_crm_case_resource_type_user,crm_case_resource_type user,model_crm_case_resource_type,base.group_sale_salesman,1,1,1,0 access_crm_case_resource_type_manager,crm_case_resource_type manager,model_crm_case_resource_type,base.group_sale_manager,1,1,1,1 From 38cb3de5183654661d92db6134fa6423f9441261 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 24 Jul 2012 19:05:50 +0200 Subject: [PATCH 165/168] [FIX] attempt to make editability handling more logical and simpler to manage. Also less buggy, with a bit o' luck bzr revid: xmo@openerp.com-20120724170550-150vimuk6bvzh8y8 --- addons/web/static/src/js/view_form.js | 13 +++-- addons/web/static/src/js/view_list.js | 3 -- .../web/static/src/js/view_list_editable.js | 44 +++++++++-------- doc/list-view.rst | 49 ++++++++++++------- 4 files changed, 63 insertions(+), 46 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 7a0482a3034..835527b3135 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3027,8 +3027,11 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ this.viewmanager.on_controller_inited.add_last(function(view_type, controller) { controller.o2m = self; if (view_type == "list") { - if (self.get("effective_readonly")) - controller.set_editable(false); + if (self.get("effective_readonly")) { + controller.on('edit:before', self, function (e) { + e.cancel = true; + }); + } } else if (view_type === "form") { if (self.get("effective_readonly")) { $(".oe_form_buttons", controller.$element).children().remove(); @@ -3301,7 +3304,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ .value(); }, do_add_record: function () { - if (this.options.editable) { + if (this.editable()) { this._super.apply(this, arguments); } else { var self = this; @@ -4108,10 +4111,12 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend self.dataset, false, _.extend({'deletable': false, 'selectable': !self.options.disable_multiple_selection, - 'read_only': true, 'import_enabled': false, '$buttons': self.$buttonpane, }, self.options.list_view_options || {})); + self.view_list.on('edit:before', self, function (e) { + e.cancel = true; + }); self.view_list.popup = self; self.view_list.appendTo($(".oe_popup_list", self.$element)).pipe(function() { self.view_list.do_show(); diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index f68f1354099..53a8c0126b2 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -21,9 +21,6 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi // whether the view rows can be reordered (via vertical drag & drop) 'reorderable': true, 'action_buttons': true, - // if true, the view can't be editable, ignoring the view's and the context's - // instructions - 'read_only': false, // if true, the 'Import', 'Export', etc... buttons will be shown 'import_enabled': true, }, diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index f2ce08f12ca..697715f2f77 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -12,6 +12,8 @@ openerp.web.list_editable = function (instance) { var self = this; this._super.apply(this, arguments); + this._force_editability = null; + this._context_editable = false; this.editor = this.make_editor(); // Stores records of {field, cell}, allows for re-rendering fields // depending on cell state during and after resize events @@ -37,6 +39,11 @@ openerp.web.list_editable = function (instance) { } }); + this.on('edit:before', this, function (event) { + if (!self.editable() || self.editor.is_editing()) { + event.cancel = true; + } + }); this.on('edit:after', this, function () { self.$element.add(self.$buttons).addClass('oe_editing'); }); @@ -62,26 +69,18 @@ openerp.web.list_editable = function (instance) { do_edit: function (index, id, dataset) { _.extend(this.dataset, dataset); }, - /** - * Sets editability status for the list, based on defaults, view - * architecture and the provided flag, if any. - * - * @param {Boolean} [force] forces the list to editability. Sets new row edition status to "bottom". - */ - set_editable: function (force) { - // TODO: fix handling of editability status to be simpler & clearer & more coherent - // If ``force``, set editability to bottom - // otherwise rely on view default - // view' @editable is handled separately as we have not yet - // fetched and processed the view at this point. - this.options.editable = ( - ! this.options.read_only && ((force && "bottom") || this.defaults.editable)); + editable: function () { + if (this.fields_view.arch.attrs.editable || this._context_editable) { + return true; + } + + return this.options.editable; }, /** * Replace do_search to handle editability process */ do_search: function(domain, context, group_by) { - this.set_editable(context['set_editable']); + this._context_editable = !!context.set_editable; this._super.apply(this, arguments); }, /** @@ -89,7 +88,7 @@ openerp.web.list_editable = function (instance) { * as an editable row at the top or bottom of the list) */ do_add_record: function () { - if (this.options.editable) { + if (this.editable()) { this.$element.find('table:first').show(); this.$element.find('.oe_view_nocontent').remove(); this.start_edition(); @@ -103,9 +102,8 @@ openerp.web.list_editable = function (instance) { this.editor.destroy(); } // tree/@editable takes priority on everything else if present. - this.options.editable = ! this.options.read_only && (data.arch.attrs.editable || this.options.editable); var result = this._super(data, grouped); - if (this.options.editable) { + if (this.editable()) { // FIXME: any hook available to ensure this is only done once? this.$buttons .off('click', '.oe_list_save') @@ -210,6 +208,12 @@ openerp.web.list_editable = function (instance) { self.resize_fields(); return record.attributes; }); + }).fail(function () { + // if the start_edition event is cancelled and it was a + // creation, remove the newly-created empty record + if (!record.get('id')) { + self.records.remove(record); + } }); }); }, @@ -379,7 +383,7 @@ openerp.web.list_editable = function (instance) { return this.reload_record(record); }, prepends_on_create: function () { - return this.options.editable === 'top'; + return this.editable() === 'top'; }, setup_events: function () { var self = this; @@ -701,7 +705,7 @@ openerp.web.list_editable = function (instance) { instance.web.ListView.List.include(/** @lends instance.web.ListView.List# */{ row_clicked: function (event) { - if (!this.options.editable) { + if (!this.view.editable()) { return this._super.apply(this, arguments); } var record_id = $(event.currentTarget).data('id'); diff --git a/doc/list-view.rst b/doc/list-view.rst index 0d67c27f963..83925d82f46 100644 --- a/doc/list-view.rst +++ b/doc/list-view.rst @@ -87,34 +87,37 @@ List view edition is an extension to the base listview providing the capability of inline record edition by delegating to an embedded form view. -.. todo:: +Editability status +++++++++++++++++++ - cleanup options and settings for editability configuration. Right - now there are: +The editability status of a list view can be queried through the +:js:func:`~openerp.web.ListView.editable` method, will return a falsy +value if the listview is not currently editable. - ``defaults.editable`` +The editability status is based on three flags: - ``null``, ``"top"`` or ``"bottom"``, generally broken and - useless +``tree/@editable`` - ``context.set_editable`` + If present, can be either ``"top"`` or ``"bottom"``. Either will + make the list view editable, with new records being respectively + created at the top or at the bottom of the view. - forces ``options.editable`` to ``"bottom"`` +``context.set_editable`` - ``view.arch.attrs.editable`` + Boolean flag extracted from a search context (during the + :js:func:`~openerp.web.ListView.do_search`` handler), ``true`` + will make the view editable (from the top), ``false`` or the + absence of the flag is a noop. - same as ``defaults.editable``, but applied separately (after - reloading the view), if absent delegates to - ``options.editable`` which may have been set previously. +``defaults.editable`` - ``options.read_only`` + Like ``tree/@editable``, one of absent (``null``)), ``"top"`` or + ``"bottom"``, fallback for the list view if none of the previous + two flags are set. - force options.editable to false, or something? - - .. note:: can probably be replaced by cancelling ``edit:before`` - - and :js:func:`~openerp.web.ListView.set_editable` which - ultimately behaves weird-as-fuck-ly. +These three flags can only *make* a listview editable, they can *not* +override a previously set flag. To do that, a listview user should +instead cancel :ref:`the edit:before event `. The editable list view module adds a number of methods to the list view, on top of implementing the :js:class:`EditorDelegate` protocol: @@ -219,6 +222,14 @@ view provides a number of dedicated events to its lifecycle. abort its current behavior as soon as possible, and rollback any state modification. + Generally speaking, an event should only be cancelled (by + setting the ``cancel`` flag to ``true``), uncancelling an + event is undefined as event handlers are executed on a + first-come-first-serve basis and later handlers may + re-cancel an uncancelled event. + +.. _listview-edit-before: + ``edit:before`` *cancellable* Invoked before the list view starts editing a record. From 46a037027384aca64ec7c6140446a6de9d80996d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 24 Jul 2012 19:14:19 +0200 Subject: [PATCH 166/168] [IMP] avoid losing the exact value of tree/@editable when checking for editability status bzr revid: xmo@openerp.com-20120724171419-czll83665nptk3n3 --- addons/web/static/src/js/view_list_editable.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 697715f2f77..c7654479864 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -70,11 +70,9 @@ openerp.web.list_editable = function (instance) { _.extend(this.dataset, dataset); }, editable: function () { - if (this.fields_view.arch.attrs.editable || this._context_editable) { - return true; - } - - return this.options.editable; + return this.fields_view.arch.attrs.editable + || this._context_editable + || this.options.editable; }, /** * Replace do_search to handle editability process From 930dd711ed9369e5a918d2df45878e5421001057 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Wed, 25 Jul 2012 04:52:31 +0000 Subject: [PATCH 167/168] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120725043706-7gh4e1622s0jedal bzr revid: launchpad_translations_on_behalf_of_openerp-20120725045231-nh45u4rfluqv50oa --- .../i18n/gu.po | 8 +- addons/marketing/i18n/nb.po | 28 + addons/multi_company/i18n/nb.po | 83 + addons/project_long_term/i18n/es_EC.po | 533 ++++++ addons/report_designer/i18n/nb.po | 98 ++ addons/stock_invoice_directly/i18n/nb.po | 23 + addons/web/i18n/fr_CA.po | 1563 +++++++++++++++++ addons/web_process/i18n/nb.po | 16 +- 8 files changed, 2340 insertions(+), 12 deletions(-) create mode 100644 addons/marketing/i18n/nb.po create mode 100644 addons/multi_company/i18n/nb.po create mode 100644 addons/project_long_term/i18n/es_EC.po create mode 100644 addons/report_designer/i18n/nb.po create mode 100644 addons/stock_invoice_directly/i18n/nb.po create mode 100644 addons/web/i18n/fr_CA.po diff --git a/addons/account_bank_statement_extensions/i18n/gu.po b/addons/account_bank_statement_extensions/i18n/gu.po index e2c0c365d3a..bc5334125dd 100644 --- a/addons/account_bank_statement_extensions/i18n/gu.po +++ b/addons/account_bank_statement_extensions/i18n/gu.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-02-08 00:35+0000\n" -"PO-Revision-Date: 2012-06-01 04:42+0000\n" +"PO-Revision-Date: 2012-07-24 08:18+0000\n" "Last-Translator: Jalpesh Patel(OpenERP) \n" "Language-Team: Gujarati \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-07-14 06:27+0000\n" -"X-Generator: Launchpad (build 15614)\n" +"X-Launchpad-Export-Date: 2012-07-25 04:37+0000\n" +"X-Generator: Launchpad (build 15679)\n" #. module: account_bank_statement_extensions #: view:account.bank.statement.line:0 @@ -54,7 +54,7 @@ msgstr "ઉધાર" #: model:ir.actions.act_window,name:account_bank_statement_extensions.action_cancel_statement_line #: model:ir.model,name:account_bank_statement_extensions.model_cancel_statement_line msgid "Cancel selected statement lines" -msgstr "" +msgstr "પસંદ કરેલ નિવેદન લીટીઓ રદ કરો" #. module: account_bank_statement_extensions #: constraint:res.partner.bank:0 diff --git a/addons/marketing/i18n/nb.po b/addons/marketing/i18n/nb.po new file mode 100644 index 00000000000..feae1ba056f --- /dev/null +++ b/addons/marketing/i18n/nb.po @@ -0,0 +1,28 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-07-24 20:29+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-25 04:37+0000\n" +"X-Generator: Launchpad (build 15679)\n" + +#. module: marketing +#: model:res.groups,name:marketing.group_marketing_manager +msgid "Manager" +msgstr "Manager" + +#. module: marketing +#: model:res.groups,name:marketing.group_marketing_user +msgid "User" +msgstr "Bruker" diff --git a/addons/multi_company/i18n/nb.po b/addons/multi_company/i18n/nb.po new file mode 100644 index 00000000000..e662ff634b4 --- /dev/null +++ b/addons/multi_company/i18n/nb.po @@ -0,0 +1,83 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-07-24 20:31+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-25 04:36+0000\n" +"X-Generator: Launchpad (build 15679)\n" + +#. module: multi_company +#: model:res.company,overdue_msg:multi_company.res_company_odoo +#: model:res.company,overdue_msg:multi_company.res_company_oerp_be +#: model:res.company,overdue_msg:multi_company.res_company_oerp_editor +#: model:res.company,overdue_msg:multi_company.res_company_oerp_in +#: model:res.company,overdue_msg:multi_company.res_company_oerp_us +msgid "" +"\n" +"Date: %(date)s\n" +"\n" +"Dear %(partner_name)s,\n" +"\n" +"Please find in attachment a reminder of all your unpaid invoices, for a " +"total amount due of:\n" +"\n" +"%(followup_amount).2f %(company_currency)s\n" +"\n" +"Thanks,\n" +"--\n" +"%(user_signature)s\n" +"%(company_name)s\n" +" " +msgstr "" + +#. module: multi_company +#: model:product.category,name:multi_company.Odoo1 +msgid "Odoo Offers" +msgstr "" + +#. module: multi_company +#: view:multi_company.default:0 +msgid "Returning" +msgstr "" + +#. module: multi_company +#: model:ir.ui.menu,name:multi_company.menu_custom_multicompany +msgid "Multi-Companies" +msgstr "" + +#. module: multi_company +#: view:multi_company.default:0 +msgid "Multi Company" +msgstr "Flerfirma" + +#. module: multi_company +#: model:ir.actions.act_window,name:multi_company.action_inventory_form +#: model:ir.ui.menu,name:multi_company.menu_action_inventory_form +msgid "Default Company per Object" +msgstr "Default firma pr. objekt" + +#. module: multi_company +#: view:multi_company.default:0 +msgid "Matching" +msgstr "" + +#. module: multi_company +#: view:multi_company.default:0 +msgid "Condition" +msgstr "Betingelse" + +#. module: multi_company +#: model:product.template,name:multi_company.product_product_odoo1_product_template +msgid "Odoo Offer" +msgstr "" diff --git a/addons/project_long_term/i18n/es_EC.po b/addons/project_long_term/i18n/es_EC.po new file mode 100644 index 00000000000..b00191d8a44 --- /dev/null +++ b/addons/project_long_term/i18n/es_EC.po @@ -0,0 +1,533 @@ +# Spanish (Ecuador) translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-24 16:59+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Spanish (Ecuador) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-25 04:37+0000\n" +"X-Generator: Launchpad (build 15679)\n" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phases +msgid "Phases" +msgstr "Fases" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,next_phase_ids:0 +msgid "Next Phases" +msgstr "Siguientes fases" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project's Tasks" +msgstr "Tareas del proyecto" + +#. module: project_long_term +#: view:project.phase:0 +#: view:project.user.allocation:0 +msgid "Group By..." +msgstr "Agrupar por..." + +#. module: project_long_term +#: field:project.phase,user_ids:0 +msgid "Assigned Users" +msgstr "Usuarios asignados" + +#. module: project_long_term +#: field:project.phase,progress:0 +msgid "Progress" +msgstr "Progreso" + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! project start-date must be lower then project end-date." +msgstr "" +"¡Error! La fecha de inicio del proyecto debe ser menor que la fecha final " +"del proyecto." + +#. module: project_long_term +#: view:project.phase:0 +msgid "In Progress Phases" +msgstr "Fases en progreso" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Displaying Settings" +msgstr "" + +#. module: project_long_term +#: field:project.compute.phases,target_project:0 +msgid "Schedule" +msgstr "Planificar" + +#. module: project_long_term +#: constraint:project.task:0 +msgid "Error ! You cannot create recursive tasks." +msgstr "Error ! No puede crear tareas recursivas." + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! You cannot assign escalation to the same project!" +msgstr "¡Error! No puede asignar un escalado al mismo proyecto!" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:126 +#, python-format +msgid "Day" +msgstr "Día" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_user_allocation +msgid "Phase User Allocation" +msgstr "Asignación Fases de Usuario" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_task +msgid "Task" +msgstr "Tarea" + +#. module: project_long_term +#: model:ir.actions.act_window,help:project_long_term.act_project_phase +msgid "" +"A project can be split into the different phases. For each phase, you can " +"define your users allocation, describe different tasks and link your phase " +"to previous and next phases, add date constraints for the automated " +"scheduling. Use the long term planning in order to planify your available " +"users, convert your phases into a series of tasks when you start working on " +"the project." +msgstr "" +"Un proyecto se puede dividir en diferentes fases. Para cada fase, se puede " +"definir la asignación de usuarios, describir las diferentes tareas, vincular " +"las fases previas y posteriores de una fase y añadir restricciones de fecha " +"para la programación automática. Utilice la planificación a largo plazo con " +"el fin de Planificar sus usuarios disponibles, convertir sus fases en una " +"serie de tareas cuando se empiece a trabajar en el proyecto." + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute a Single Project" +msgstr "Calcular un sólo proyecto" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,previous_phase_ids:0 +msgid "Previous Phases" +msgstr "Fases previas" + +#. module: project_long_term +#: help:project.phase,product_uom:0 +msgid "UoM (Unit of Measure) is the unit of measurement for Duration" +msgstr "UdM (Unidad de Medida) es la unidad de medida para la duración" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation +#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation +#: view:project.phase:0 +#: view:project.user.allocation:0 +msgid "Planning of Users" +msgstr "Planificación de Usuarios" + +#. module: project_long_term +#: help:project.phase,date_end:0 +msgid "" +" It's computed by the scheduler according to the start date and the duration." +msgstr "" +" Es calculado por el planificador en función de la fecha de inicio y la " +"duración" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_project +#: field:project.compute.phases,project_id:0 +#: field:project.compute.tasks,project_id:0 +#: view:project.phase:0 +#: field:project.phase,project_id:0 +#: view:project.task:0 +#: view:project.user.allocation:0 +#: field:project.user.allocation,project_id:0 +msgid "Project" +msgstr "Proyecto" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:48 +#, python-format +msgid "Error!" +msgstr "Error!" + +#. module: project_long_term +#: selection:project.phase,state:0 +msgid "Cancelled" +msgstr "Cancelado" + +#. module: project_long_term +#: help:project.user.allocation,date_end:0 +msgid "Ending Date" +msgstr "Fecha de cierre" + +#. module: project_long_term +#: field:project.phase,constraint_date_end:0 +msgid "Deadline" +msgstr "Fecha límite" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute All My Projects" +msgstr "Calcular todos los proyectos" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "_Cancel" +msgstr "Cancelar" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:141 +#, python-format +msgid " (copy)" +msgstr " (copiar)" + +#. module: project_long_term +#: view:project.user.allocation:0 +msgid "Project User Allocation" +msgstr "Asignación de usuarios a un proyecto" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,state:0 +msgid "State" +msgstr "Estado" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "C_ompute" +msgstr "C_alcular" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "New" +msgstr "Nuevo" + +#. module: project_long_term +#: help:project.phase,progress:0 +msgid "Computed based on related tasks" +msgstr "Calculo basado en las tareas relacionadas" + +#. module: project_long_term +#: field:project.phase,product_uom:0 +msgid "Duration UoM" +msgstr "UdM duración" + +#. module: project_long_term +#: field:project.phase,constraint_date_start:0 +msgid "Minimum Start Date" +msgstr "Fecha de inicio mínima" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_pm_users_project1 +#: model:ir.ui.menu,name:project_long_term.menu_view_resource +msgid "Resources" +msgstr "Recursos" + +#. module: project_long_term +#: view:project.phase:0 +msgid "My Projects" +msgstr "Mis Proyectos" + +#. module: project_long_term +#: help:project.user.allocation,date_start:0 +msgid "Starting Date" +msgstr "Fecha de inicio" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list +msgid "Related Tasks" +msgstr "Tareas relacionadas" + +#. module: project_long_term +#: view:project.phase:0 +msgid "New Phases" +msgstr "Nueva Fase" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:48 +#, python-format +msgid "Please specify a project to schedule." +msgstr "Por favor, especifique un proyecto para planificar." + +#. module: project_long_term +#: help:project.phase,constraint_date_start:0 +msgid "force the phase to start after this date" +msgstr "Forzar que la fase epiece después de esta fecha" + +#. module: project_long_term +#: field:project.phase,task_ids:0 +msgid "Project Tasks" +msgstr "Tareas del proyecto" + +#. module: project_long_term +#: help:project.phase,date_start:0 +msgid "" +"It's computed by the scheduler according the project date or the end date of " +"the previous phase." +msgstr "" +"Es calculado por el planificador en función de la fecha inicio o fecha fin " +"de la fase anterior" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Month" +msgstr "Mes" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Phase start-date must be lower than phase end-date." +msgstr "La fecha-inicio de la fase debe ser menor que la fecha-fin." + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Month" +msgstr "Mes de inicio" + +#. module: project_long_term +#: field:project.phase,date_start:0 +#: field:project.user.allocation,date_start:0 +msgid "Start Date" +msgstr "Fecha inicio" + +#. module: project_long_term +#: help:project.phase,constraint_date_end:0 +msgid "force the phase to finish before this date" +msgstr "Forzar que la fase termine antes de esta fecha" + +#. module: project_long_term +#: help:project.phase,user_ids:0 +msgid "" +"The ressources on the project can be computed automatically by the scheduler" +msgstr "" +"Los Recursos del proyecto se puede calcular automáticamente por el " +"planificador" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Draft" +msgstr "Borrador" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Pending Phases" +msgstr "Fases pendientes" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Pending" +msgstr "Pendiente" + +#. module: project_long_term +#: view:project.user.allocation:0 +#: field:project.user.allocation,user_id:0 +msgid "User" +msgstr "Usuario" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_tasks +msgid "Project Compute Tasks" +msgstr "Calcular tareas del proyecto" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Constraints" +msgstr "Restricciones" + +#. module: project_long_term +#: help:project.phase,sequence:0 +msgid "Gives the sequence order when displaying a list of phases." +msgstr "Indica el orden cuando se muestra la lista de fases" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phase +#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list +#: model:ir.ui.menu,name:project_long_term.menu_project_phase +#: model:ir.ui.menu,name:project_long_term.menu_project_phase_list +#: view:project.phase:0 +#: field:project.project,phase_ids:0 +msgid "Project Phases" +msgstr "Fases del proyecto" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Done" +msgstr "Realizado" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Cancel" +msgstr "Cancelar" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "In Progress" +msgstr "En progreso" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Remaining Hours" +msgstr "Horas restantes" + +#. module: project_long_term +#: constraint:project.task:0 +msgid "Error ! Task end-date must be greater then task start-date" +msgstr "" +"Error ! La fecha final de la tarea debe ser mayor que la fecha de inicio" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar +msgid "Working Time" +msgstr "Horario de trabajo" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases +#: model:ir.ui.menu,name:project_long_term.menu_compute_phase +#: view:project.compute.phases:0 +msgid "Schedule Phases" +msgstr "Planificación de fases" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Phase" +msgstr "Iniciar fase" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Total Hours" +msgstr "Total horas" + +#. module: project_long_term +#: view:project.user.allocation:0 +msgid "Users" +msgstr "Usuarios" + +#. module: project_long_term +#: view:project.user.allocation:0 +msgid "Phase" +msgstr "Fase" + +#. module: project_long_term +#: help:project.phase,state:0 +msgid "" +"If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. " +" \n" +" If the phase is over, the states is set to 'Done'." +msgstr "" +"Si la fase se crea, el estado es \"Borrador\".\n" +" Si la fase comienza, el estado cambia a \"En Proceso\".\n" +" Si se necesita revisión, la fase está en estado \"Pendiente\".\n" +" Si la fase está terminada, el estado se fija en \"z\"." + +#. module: project_long_term +#: field:project.phase,date_end:0 +#: field:project.user.allocation,date_end:0 +msgid "End Date" +msgstr "Fecha de finalización" + +#. module: project_long_term +#: field:project.phase,name:0 +msgid "Name" +msgstr "Nombre" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Tasks Details" +msgstr "Detalles de tareas" + +#. module: project_long_term +#: field:project.phase,duration:0 +msgid "Duration" +msgstr "Duración" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project Users" +msgstr "Usuarios del proyecto" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_phase +#: view:project.phase:0 +#: view:project.task:0 +#: field:project.task,phase_id:0 +#: field:project.user.allocation,phase_id:0 +msgid "Project Phase" +msgstr "Fase del proyecto" + +#. module: project_long_term +#: model:ir.actions.act_window,help:project_long_term.action_project_compute_phases +msgid "" +"To schedule phases of all or a specified project. It then open a gantt " +"view.\n" +" " +msgstr "" +"Para planificar las fases en su totalidad o de un proyecto específico. " +"Entonces, abra una vista de Gantt.\n" +" " + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_phases +msgid "Project Compute Phases" +msgstr "Calcular fases del proyecto" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Loops in phases not allowed" +msgstr "No se permiten bucles en fases" + +#. module: project_long_term +#: field:project.phase,sequence:0 +msgid "Sequence" +msgstr "Secuencia" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves +msgid "Resource Leaves" +msgstr "Ausencia de recursos" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks +#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks +#: view:project.compute.tasks:0 +msgid "Schedule Tasks" +msgstr "Planificar tareas" + +#. module: project_long_term +#: help:project.phase,duration:0 +msgid "By default in days" +msgstr "Por defecto en días" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,user_force_ids:0 +msgid "Force Assigned Users" +msgstr "Forzar asignación de usuarios" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule +msgid "Scheduling" +msgstr "Planificación" + +#~ msgid "Displaying settings" +#~ msgstr "Mostrando configuración" diff --git a/addons/report_designer/i18n/nb.po b/addons/report_designer/i18n/nb.po new file mode 100644 index 00000000000..4715435a323 --- /dev/null +++ b/addons/report_designer/i18n/nb.po @@ -0,0 +1,98 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:15+0000\n" +"PO-Revision-Date: 2012-07-24 20:36+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-25 04:37+0000\n" +"X-Generator: Launchpad (build 15679)\n" + +#. module: report_designer +#: model:ir.actions.act_window,name:report_designer.action_report_designer_installer +#: view:report_designer.installer:0 +msgid "Reporting Tools Configuration" +msgstr "Konfigurasjon rapportverktøy" + +#. module: report_designer +#: field:report_designer.installer,base_report_creator:0 +msgid "Query Builder" +msgstr "Avansert søk" + +#. module: report_designer +#: view:report_designer.installer:0 +msgid "Configure" +msgstr "Konfigurer" + +#. module: report_designer +#: view:report_designer.installer:0 +msgid "title" +msgstr "tittel" + +#. module: report_designer +#: model:ir.model,name:report_designer.model_report_designer_installer +msgid "report_designer.installer" +msgstr "report_designer.installer" + +#. module: report_designer +#: field:report_designer.installer,config_logo:0 +msgid "Image" +msgstr "Bilde" + +#. module: report_designer +#: field:report_designer.installer,base_report_designer:0 +msgid "OpenOffice Report Designer" +msgstr "OpenOffice Rapport Designer" + +#. module: report_designer +#: model:ir.module.module,shortdesc:report_designer.module_meta_information +msgid "Reporting Tools" +msgstr "Rapport verktøy" + +#. module: report_designer +#: view:report_designer.installer:0 +msgid "" +"OpenERP's built-in reporting abilities can be improved even further with " +"some of the following applications" +msgstr "" + +#. module: report_designer +#: view:report_designer.installer:0 +msgid "Configure Reporting Tools" +msgstr "Konfigurer rapportverktøy" + +#. module: report_designer +#: help:report_designer.installer,base_report_creator:0 +msgid "" +"Allows you to create any statistic reports on several objects. It's a SQL " +"query builder and browser for end users." +msgstr "" + +#. module: report_designer +#: help:report_designer.installer,base_report_designer:0 +msgid "" +"Adds wizards to Import/Export .SXW report which you can modify in " +"OpenOffice.Once you have modified it you can upload the report using the " +"same wizard." +msgstr "" + +#. module: report_designer +#: model:ir.module.module,description:report_designer.module_meta_information +msgid "" +"Installer for reporting tools selection\n" +" " +msgstr "" + +#. module: report_designer +#: field:report_designer.installer,progress:0 +msgid "Configuration Progress" +msgstr "Konfigurasjonsprosess" diff --git a/addons/stock_invoice_directly/i18n/nb.po b/addons/stock_invoice_directly/i18n/nb.po new file mode 100644 index 00000000000..d9ecfa5b245 --- /dev/null +++ b/addons/stock_invoice_directly/i18n/nb.po @@ -0,0 +1,23 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:37+0000\n" +"PO-Revision-Date: 2012-07-24 20:34+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-25 04:36+0000\n" +"X-Generator: Launchpad (build 15679)\n" + +#. module: stock_invoice_directly +#: model:ir.model,name:stock_invoice_directly.model_stock_partial_picking +msgid "Partial Picking Processing Wizard" +msgstr "Veiviser for delplukking" diff --git a/addons/web/i18n/fr_CA.po b/addons/web/i18n/fr_CA.po new file mode 100644 index 00000000000..f6426975e7d --- /dev/null +++ b/addons/web/i18n/fr_CA.po @@ -0,0 +1,1563 @@ +# French (Canada) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-07-02 09:06+0200\n" +"PO-Revision-Date: 2012-07-25 03:30+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: French (Canada) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-07-25 04:52+0000\n" +"X-Generator: Launchpad (build 15679)\n" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:176 +#: addons/web/static/src/js/chrome.js:202 +#: addons/web/static/src/js/chrome.js:380 +#: addons/web/static/src/js/view_form.js:457 +#: addons/web/static/src/js/view_form.js:1292 +#: addons/web/static/src/xml/base.xml:1701 +msgid "Ok" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:184 +msgid "Send OpenERP Enterprise Report" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:198 +msgid "Dont send" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:1119 +msgid "Client Error" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:260 +#, python-format +msgid "Loading (%d)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:292 +msgid "Invalid database name" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:455 +msgid "Backed" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:456 +msgid "Database backed up successfully" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:499 +msgid "Restored" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:499 +msgid "Database restored successfully" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:783 +#: addons/web/static/src/xml/base.xml:226 +#: addons/web/static/src/xml/base.xml:1735 +msgid "Change Password" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:759 +#: addons/web/static/src/xml/base.xml:356 +msgid "Preferences" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:763 +msgid "Change password" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:762 +#: addons/web/static/src/js/search.js:241 +#: addons/web/static/src/js/search.js:300 +#: addons/web/static/src/js/view_editor.js:95 +#: addons/web/static/src/js/view_editor.js:836 +#: addons/web/static/src/js/view_editor.js:962 +#: addons/web/static/src/js/view_form.js:1287 +#: addons/web/static/src/xml/base.xml:743 +#: addons/web/static/src/xml/base.xml:1502 +#: addons/web/static/src/xml/base.xml:1512 +#: addons/web/static/src/xml/base.xml:1521 +msgid "Cancel" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:764 +#: addons/web/static/src/js/view_editor.js:73 +#: addons/web/static/src/js/views.js:967 addons/web/static/src/xml/base.xml:742 +#: addons/web/static/src/xml/base.xml:1506 +#: addons/web/static/src/xml/base.xml:1520 +msgid "Save" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:680 +#: addons/web/static/src/xml/base.xml:359 +msgid "About" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/chrome.js:1052 +msgid "OpenERP - Unsupported/Community Version" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:619 +msgid "less than a minute ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:620 +msgid "about a minute ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:621 +#, python-format +msgid "%d minutes ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:622 +msgid "about an hour ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:623 +#, python-format +msgid "%d hours ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:624 +msgid "a day ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:625 +#, python-format +msgid "%d days ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:626 +msgid "about a month ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:627 +#, python-format +msgid "%d months ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:628 +msgid "about a year ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/coresetup.js:629 +#, python-format +msgid "%d years ago" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_export.js:6 +msgid "Export Data" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_export.js:19 +#: addons/web/static/src/js/data_import.js:70 +#: addons/web/static/src/js/view_editor.js:49 +#: addons/web/static/src/js/view_editor.js:398 +#: addons/web/static/src/js/view_form.js:734 +#: addons/web/static/src/js/view_form.js:3298 +#: addons/web/static/src/js/views.js:968 +msgid "Close" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_export.js:20 +msgid "Export To File" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_export.js:126 +msgid "Please enter save field list name" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_export.js:362 +msgid "Please select fields to save export list..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_export.js:375 +msgid "Please select fields to export..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_import.js:34 +msgid "Import Data" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_import.js:71 +msgid "Import File" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_import.js:106 +msgid "External ID" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_import.js:346 +msgid "" +"Destination fields should only be selected once, some fields are selected " +"more than once:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/data_import.js:383 +msgid "*Required Fields are not selected :" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/formats.js:139 +#, python-format +msgid "(%d records)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/formats.js:325 +#: addons/web/static/src/js/view_page.js:268 +msgid "Download" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/formats.js:330 +#, python-format +msgid "Download \"%s\"" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:437 +msgid "Invalid Search" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:437 +msgid "triggered from search view" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:528 +#, python-format +msgid "Incorrect value for field %(fieldname)s: [%(value)s] is %(message)s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:948 +#, python-format +msgid "Filter on: %s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:999 +msgid "Filter" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1108 +#, python-format +msgid "Group by: %s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1132 +msgid "GroupBy" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1267 +#, python-format +msgid "Search %(field)s for: %(value)s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:869 +msgid "not a valid integer" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:883 +msgid "not a valid number" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:962 +#: addons/web/static/src/xml/base.xml:973 +msgid "Yes" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:963 +msgid "No" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1416 +#, python-format +msgid "Search %(field)s at: %(value)s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1286 +msgid "Filters" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1762 +msgid "Advanced" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1853 +#, python-format +msgid "%(field)s %(operator)s \"%(value)s\"" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1341 +msgid "contains" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1342 +msgid "doesn't contain" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1343 +#: addons/web/static/src/js/search.js:1359 +#: addons/web/static/src/js/search.js:1380 +#: addons/web/static/src/js/search.js:1401 +#: addons/web/static/src/js/search.js:1424 +msgid "is equal to" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1344 +#: addons/web/static/src/js/search.js:1360 +#: addons/web/static/src/js/search.js:1381 +#: addons/web/static/src/js/search.js:1402 +#: addons/web/static/src/js/search.js:1425 +msgid "is not equal to" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1345 +#: addons/web/static/src/js/search.js:1361 +#: addons/web/static/src/js/search.js:1382 +#: addons/web/static/src/js/search.js:1403 +#: addons/web/static/src/js/search.js:1426 +msgid "greater than" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1346 +#: addons/web/static/src/js/search.js:1362 +#: addons/web/static/src/js/search.js:1383 +#: addons/web/static/src/js/search.js:1404 +#: addons/web/static/src/js/search.js:1427 +msgid "less than" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1347 +#: addons/web/static/src/js/search.js:1363 +#: addons/web/static/src/js/search.js:1384 +#: addons/web/static/src/js/search.js:1405 +#: addons/web/static/src/js/search.js:1428 +msgid "greater or equal than" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1348 +#: addons/web/static/src/js/search.js:1364 +#: addons/web/static/src/js/search.js:1385 +#: addons/web/static/src/js/search.js:1406 +#: addons/web/static/src/js/search.js:1429 +msgid "less or equal than" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1419 +#: addons/web/static/src/js/search.js:1444 +msgid "is" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1445 +msgid "is not" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1459 +msgid "is true" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:1460 +msgid "is false" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:20 +#, python-format +msgid "Manage Views (%s)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:46 +#: addons/web/static/src/js/view_list.js:17 +#: addons/web/static/src/xml/base.xml:100 +#: addons/web/static/src/xml/base.xml:327 +#: addons/web/static/src/xml/base.xml:761 +msgid "Create" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:47 +#: addons/web/static/src/xml/base.xml:483 +#: addons/web/static/src/xml/base.xml:760 +msgid "Edit" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:48 +#: addons/web/static/src/xml/base.xml:1653 +msgid "Remove" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:71 +#, python-format +msgid "Create a view (%s)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:168 +msgid "Do you really want to remove this view?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:364 +#, python-format +msgid "View Editor %d - %s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:367 +msgid "Inherited View" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:371 +msgid "Do you really wants to create an inherited view here?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:381 +msgid "Preview" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:501 +msgid "Do you really want to remove this node?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:815 +#: addons/web/static/src/js/view_editor.js:939 +msgid "Properties" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_editor.js:818 +#: addons/web/static/src/js/view_editor.js:942 +msgid "Update" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:16 +#: addons/web/static/src/js/view_form.js:210 +msgid "Form" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:632 +#: addons/web/static/src/xml/base.xml:763 +#: addons/web/static/src/xml/base.xml:1714 +msgid "Delete" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:762 +msgid "Duplicate" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:133 +#: addons/web/static/src/js/view_form.js:728 +msgid "Set Default" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_page.js:59 +msgid "Do you really want to delete this record?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:508 +msgid "" +"Warning, the record has been modified, your changes will be discarded." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:735 +msgid "Save default" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:867 +#, python-format +msgid "Unknown operator %s in domain %s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:875 +#, python-format +msgid "Unknown field %s in domain %s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:913 +#, python-format +msgid "Unsupported operator %s in domain %s" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:1284 +msgid "Confirm" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2193 +msgid "   Search More..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2211 +#, python-format +msgid "   Create \"%s\"" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2217 +msgid "   Create and Edit..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2250 +#: addons/web/static/src/js/views.js:680 +msgid "Search: " +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2250 +#: addons/web/static/src/js/view_form.js:2738 +msgid "Create: " +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2040 +#: addons/web/static/src/js/view_form.js:2766 +#: addons/web/static/src/js/view_form.js:2991 +msgid "Open: " +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2911 +#: addons/web/static/src/xml/base.xml:755 +#: addons/web/static/src/xml/base.xml:777 +#: addons/web/static/src/xml/base.xml:1652 +msgid "Add" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:2971 +msgid "Add: " +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:4230 +msgid "Save As..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:4230 +msgid "The field is empty, there's nothing to save !" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:8 +msgid "List" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:277 +msgid "Unlimited" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:819 +#: addons/web/static/src/xml/base.xml:1742 +msgid "Import" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:822 +#: addons/web/static/src/xml/base.xml:1612 +msgid "Export" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:374 +msgid "Group" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:549 +msgid "Do you really want to remove these records?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:925 +msgid "Warning" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:716 +msgid "You must select at least one record." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:1243 +msgid "Undefined" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_list.js:1342 +#, python-format +msgid "%(page)d/%(page_count)d" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_tree.js:11 +msgid "Tree" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:570 addons/web/static/src/xml/base.xml:480 +msgid "Fields View Get" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:578 +#, python-format +msgid "View Log (%s)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:605 +#, python-format +msgid "Model %s fields" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:615 addons/web/static/src/xml/base.xml:482 +msgid "Manage Views" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:616 +msgid "Could not find current view declaration" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:716 +msgid "Print" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:717 +msgid "Attachment" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:718 addons/web/static/src/xml/base.xml:276 +msgid "More" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:810 +msgid "Translate" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:812 +msgid "Technical translation" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:924 +msgid "You must choose at least one record." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:875 +msgid "Uploading..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:885 +msgid "Do you really want to delete this attachment ?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/views.js:962 +msgid "Translations" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:52 +msgid "Loading..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:251 +msgid "" +"Your version of OpenERP is unsupported. Support & maintenance services are " +"available here:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:251 +msgid "OpenERP Entreprise" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:256 +msgid "OpenERP Enterprise Contract." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:257 +msgid "Your report will be sent to the OpenERP Enterprise team." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:259 +msgid "Summary:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:263 +msgid "Description:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:267 +msgid "What you did:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:297 +msgid "Invalid username or password" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:116 +#: addons/web/static/src/xml/base.xml:150 +#: addons/web/static/src/xml/base.xml:301 +msgid "Database:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:306 +msgid "Username" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:308 +#: addons/web/static/src/xml/base.xml:331 +msgid "Password" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:310 +msgid "Log in" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:314 +msgid "Manage Databases" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:44 addons/web/static/src/xml/base.xml:315 +msgid "Powered by" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:44 addons/web/static/src/xml/base.xml:315 +#: addons/web/static/src/xml/base.xml:1819 +msgid "OpenERP" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:132 +#: addons/web/static/src/xml/base.xml:328 +msgid "Drop" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:166 +#: addons/web/static/src/xml/base.xml:329 +msgid "Backup" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:195 +#: addons/web/static/src/xml/base.xml:330 +msgid "Restore" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:332 +msgid "Back to Login" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:61 +msgid "CREATE DATABASE" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:68 addons/web/static/src/xml/base.xml:211 +msgid "Master password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:72 addons/web/static/src/xml/base.xml:191 +msgid "New database name:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:77 +msgid "Load Demonstration data:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:81 +msgid "Default language:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:91 +msgid "Admin password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:95 +msgid "Confirm password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:109 +msgid "DROP DATABASE" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:128 +#: addons/web/static/src/xml/base.xml:162 +#: addons/web/static/src/xml/base.xml:187 +msgid "Master Password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:143 +msgid "BACKUP DATABASE" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:175 +msgid "RESTORE DATABASE" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:182 +msgid "File:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:204 +msgid "CHANGE MASTER PASSWORD" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:216 +msgid "New master password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:221 +msgid "Confirm new master password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:325 +msgid "About OpenERP" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:327 +msgid "Log out" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:333 +msgid "Activate the developer mode" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1820 +msgid "Version" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1821 +msgid "Copyright © 2004-TODAY OpenERP SA. All Rights Reserved." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1822 +msgid "OpenERP is a trademark of the" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1823 +msgid "OpenERP SA Company" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1825 +msgid "Licenced under the terms of" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1826 +msgid "GNU Affero General Public License" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1828 +msgid "For more information visit" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1829 +msgid "OpenERP.com" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1720 +msgid "Old Password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1725 +msgid "New Password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1730 +msgid "Confirm Password:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:390 +msgid "Open" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:390 +msgid "ERP" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:477 +msgid "Debug View#" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:478 +msgid "View Log (perm_read)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:450 +msgid "Toggle Form Layout Outline" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:479 +msgid "View Fields" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1300 +msgid "Manage Filters" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:483 +msgid "View" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:484 +msgid "Edit SearchView" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:485 +msgid "Edit Action" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:486 +msgid "Edit Workflow" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:491 +msgid "ID:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:494 +msgid "XML ID:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:497 +msgid "Creation User:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:500 +msgid "Creation Date:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:503 +msgid "Latest Modification by:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:506 +msgid "Latest Modification Date:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:518 +msgid "Delete this attachment" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:523 +msgid "/web/binary/upload_attachment" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:527 +msgid "Add..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:622 +#: addons/web/static/src/xml/base.xml:687 +msgid "or" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:687 +msgid "Discard" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:806 +msgid "Default:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:823 +msgid "Condition:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:842 +msgid "Only you" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:849 +msgid "All users" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:856 +msgid "Unhandled widget" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:936 +msgid "(nolabel)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:941 +msgid "Field:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:945 +msgid "Object:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:949 +msgid "Type:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:953 +msgid "Widget:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:957 +msgid "Size:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:961 +msgid "Context:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:965 +msgid "Domain:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:910 +#: addons/web/static/src/xml/base.xml:969 +msgid "Modifiers:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:973 +msgid "Change default:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:977 +msgid "On change:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:981 +msgid "Relation:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:985 +msgid "Selection:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1040 +msgid "Open this resource" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1063 +msgid "Select date" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:948 +msgid "Open Resource" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1162 +#: addons/web/static/src/xml/base.xml:1205 +msgid "Set Image" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/view_form.js:1620 +#: addons/web/static/src/xml/base.xml:1170 +#: addons/web/static/src/xml/base.xml:1220 +#: addons/web/static/src/xml/base.xml:1222 +#: addons/web/static/src/xml/base.xml:1279 +msgid "Clear" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1179 +#: addons/web/static/src/xml/base.xml:1230 +msgid "Uploading ..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1066 +msgid "width: 83px;" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1207 +#: addons/web/static/src/xml/base.xml:1501 +msgid "Select" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1214 +#: addons/web/static/src/xml/base.xml:1216 +msgid "Save As" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1245 +msgid "Button" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1248 +msgid "(no string)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1255 +msgid "Special:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1260 +msgid "Button Type:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1264 +msgid "Method:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1268 +msgid "Action ID:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:542 +msgid "Field" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1205 +msgid "Advanced Search..." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1287 +msgid "-- Filters --" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1296 +msgid "-- Actions --" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1297 +msgid "Add Advanced Filter" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1298 +msgid "Save Filter" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1305 +msgid "Filter Name:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1307 +msgid "(Any existing filter with the same name will be replaced)" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1376 +msgid "Custom Filters" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1379 +msgid "Save current filter" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1381 +msgid "Filter name" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1383 +msgid "Share with all users" +msgstr "" + +#. openerp-web +#: addons/web/static/src/js/search.js:298 +#: addons/web/static/src/xml/base.xml:1299 +msgid "Add to Dashboard" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1394 +msgid "Title of new Dashboard item" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1395 +msgid "save" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1399 +msgid "Select Dashboard to add this filter to" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1406 +msgid "Advanced Search" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1411 +msgid "Add a condition" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1412 +msgid "Apply" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1509 +msgid "Save & New" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1510 +msgid "Save & Close" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1617 +msgid "" +"This wizard will export all data that matches the current search criteria to " +"a CSV file.\n" +" You can export all data or only the fields that can be " +"reimported after modification." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1624 +msgid "Export Type:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1626 +msgid "Import Compatible Export" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1627 +msgid "Export all Data" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1630 +msgid "Export Formats" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1636 +msgid "Available fields" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1638 +msgid "Fields to export" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1640 +msgid "Save fields list" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1654 +msgid "Remove All" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1666 +msgid "Name" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1699 +msgid "Save as:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1706 +msgid "Saved exports:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1748 +msgid "1. Import a .CSV file" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1749 +msgid "" +"Select a .CSV file to import. If you need a sample of file to import,\n" +" you should use the export tool with the \"Import Compatible\" option." +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1753 +msgid "CSV File:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1756 +msgid "2. Check your file format" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1759 +msgid "Import Options" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1763 +msgid "Does your file have titles?" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1769 +msgid "Separator:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1771 +msgid "Delimiter:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1775 +msgid "Encoding:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1778 +msgid "UTF-8" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1779 +msgid "Latin 1" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1782 +msgid "Lines to skip" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1782 +msgid "" +"For use if CSV files have titles on multiple lines, skips more than a single " +"line during import" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1713 +msgid "--- Don't Import ---" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1809 +msgid "The import failed due to:" +msgstr "" + +#. openerp-web +#: addons/web/static/src/xml/base.xml:1811 +msgid "Here is a preview of the file we could not import:" +msgstr "" diff --git a/addons/web_process/i18n/nb.po b/addons/web_process/i18n/nb.po index 021bbfbf3f4..977d690db7d 100644 --- a/addons/web_process/i18n/nb.po +++ b/addons/web_process/i18n/nb.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-02 09:06+0200\n" -"PO-Revision-Date: 2012-03-29 11:39+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2012-07-24 06:25+0000\n" +"Last-Translator: Tor Syversen \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-07-03 05:55+0000\n" -"X-Generator: Launchpad (build 15531)\n" +"X-Launchpad-Export-Date: 2012-07-25 04:52+0000\n" +"X-Generator: Launchpad (build 15679)\n" #. openerp-web #: addons/web_process/static/src/js/process.js:261 @@ -85,12 +85,12 @@ msgstr "Notater:" #. openerp-web #: addons/web_process/static/src/xml/web_process.xml:59 msgid "Last modified by:" -msgstr "" +msgstr "Sist revidert av:" #. openerp-web #: addons/web_process/static/src/xml/web_process.xml:59 msgid "N/A" -msgstr "" +msgstr "N/A" #. openerp-web #: addons/web_process/static/src/xml/web_process.xml:62 @@ -105,7 +105,7 @@ msgstr "" #. openerp-web #: addons/web_process/static/src/xml/web_process.xml:88 msgid "Select Process" -msgstr "" +msgstr "Velg prosess" #. openerp-web #: addons/web_process/static/src/xml/web_process.xml:98 @@ -115,4 +115,4 @@ msgstr "Velg" #. openerp-web #: addons/web_process/static/src/xml/web_process.xml:109 msgid "Edit Process" -msgstr "" +msgstr "Rediger prosess" From a4f1ce69ab01818fce1a23fc3744865bcc4fd85c Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 25 Jul 2012 10:04:39 +0200 Subject: [PATCH 168/168] [FIX] throbber use an image. fva will fix the aliasing. Also check http://commons.wikimedia.org/wiki/Category:Throbbers bzr revid: al@openerp.com-20120725080439-j7f44tb0fbp90cm0 --- addons/web/__openerp__.py | 1 - addons/web/static/src/img/throbber.gif | Bin 673 -> 7625 bytes addons/web/static/src/js/coresetup.js | 28 ++----------------------- 3 files changed, 2 insertions(+), 27 deletions(-) diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 4051e607e21..9e8e258dedc 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -20,7 +20,6 @@ "static/lib/jquery.form/jquery.form.js", "static/lib/jquery.validate/jquery.validate.js", "static/lib/jquery.ba-bbq/jquery.ba-bbq.js", - "static/lib/spinjs/spin.js", "static/lib/jquery.blockUI/jquery.blockUI.js", "static/lib/jquery.ui/js/jquery-ui-1.8.17.custom.min.js", "static/lib/jquery.ui.timepicker/js/jquery-ui-timepicker-addon.js", diff --git a/addons/web/static/src/img/throbber.gif b/addons/web/static/src/img/throbber.gif index ded8d36d48686558e7fd498eff3b6cc47b8a648a..7ab8346ce0957a729a712adc2a61a97166f4252c 100644 GIT binary patch literal 7625 zcmeHM`&(1jw%vJ$B!=(`8;qFnGSC2liZ}F7PZ9{GfogcwK(S^cwutsNqPF;Go1GT{ zf<{1$)uSPVHXzm*v0_^_4?uhz4_LJHJla5!QhQn{wJr7Ze!VN{cfWIgz<=O=ckZ<} z{5a=WV~#cE%DU$Y1UX0~6bb!|K*1nG!G{dKWHJLR5HNTGpFnV6PGEsZNdYhTrle%1 zWP->EteilI!4d~Qfxj}a0#PC>2}EUJRaOSy$}N>!0&C0mE!zXJEARwk|E~S}gD?1_ z(}5R!17R|O7ko{oj=<^&#))9`^qe@+)6;Y23|MC_1lEOMT)uqa0(dW9zC1Dl*2u_h z@QmCJ#J$`1?%n&JKj7bcp9h{`d=-p`!T9+hcz*u*x8HvI9i#vM{+~pE^BZ-&q^vYg zB$s5R^KlqZBGAmN4SctUZue1$RrRQK3G3 zNPIEJ*ODq{v9fgCp_=GoE4O&e7}gfLv6C#4H-#s}_;iyw=8*OzS^YlvfylZcIfqcM zNS$x`#Ex{7etUE*d=F|EutV+?D-mOFSHb4WxI zpVT=SGusqM-2lfBD+a1^F+4=efXu=;;( z!oLf6KTrTXL<)_|siRd1RHJ4MIpU7dBex!o4@Kc37*{|w6n0dxT+RX$GqsFX<1Kk^ z7)_O18H+O^?MHE2Z})qD2w9INX*wPC_iy|~&k-vt_LV8`Fe(OWx5bWV%X`aws>vHY z-yH3ZPFGGc4271ne@xLuE#9YEQUytJtCL}30zU9|`yox0p&$_=%l$$N0a=ta>;=2w zZH%6O_VJ_|8KU8^OYOnCff59XQpU>MdQifc@v!EPj9Evqw#%I)i;L}0XbWhD=Plgp zgQ{v1GmW^m;`)$H2&a`f07sf5K?(1YwLPyyoxm28CF2p)F*K>IE?7c% zZ=8#c-_@br7>Zm`Pf;ELLRIaGbU!zxc~KJy=_)>wYjhvbs1Wz}%vrii-_*YbUsV$d zYxnux8iFQfY5JTAq+VNNG_%(p2%z88rV%j~#twtjlZ)cSk30$MT4QOaa*?*3$hFwa zYFfW{p-F;fRS(p17}UzZsW5{@zBhr8h<^iYIHM1X0X-RqL23C5C;PADBEZXU^ z!_z8cn3Y{e8}hntNYFK)NjUNrCNEGyZ<6WHC$KM)U-k5G$I#TaxUI(cqUH?wQG-Yn zWh(DYav2cYw0oSvk#>-MQ;@nl&Z}dP1BvJ4sOHTturY%#MVAb!MCm@zyIcj}zmC6u z*S<|cfe9bdgl47xx>zk-lK+lC{-ZTOPVx-2szH!{GN}R^U9-|N!#4f?mR-D{2bO45TQP0 z$(Pu&NJRz-ECqf~Ao)cdz`Vc&z-JU5Sw#q=$As&;ggpAnxYgoJW2m8W zK-upy+d^0766-$;FKCgV++8z_(Vp3xXx4V!FAF_4|BPm99?bl*OKIv>wlSk%-*5|) z#pEsX*(6j*@m}8~MG2sm6dTLKX1}=;o+Rhx&Oe<`9>9gN6i&BCOlRc|Uf|w+A5V$q z&-^&=dLI|^c1D%^#Yd`XDs$ZsiQKMF)5@-a9sT$Jz$+uM0gbH__aNf5Orq-gUEtyVNlcb}3uCp*H3UfwrIo zD)bFmDy?-BOvRb>a?b_58%Juk3A?7ZPZIv4umk>xaRz6I%hkzmssOvg6Xk<$RQq>E z`WG_t`Tx*v4wd})-7=r&32X@hZtRgASyf~KfCmUn2+Jz225F}w12s*fH6gO)<0a1K$Yz;|kH;m` zq76}p;FzrW>(|?&ef_kEe0C!vdkcl;eVV2|McVz{BT?C$Bu+}@W~Zva$%oMKTk8^v z=)I+__aDiTGDB2_wRgaISpN>BLi_QY-lr z`$3n6a=eTGb^Hgc!N(Ev3O>ZRW}cvvLBhj^7G|2l$*6*fw~lHMMm4Aav2d1gWcJA# z1VhPjt2qkE4bT)stfInQ4JXSw;4p=?rx4A0<<7v@cSg;pNSe=Cuze2g!fSseyR0d9 z_-k$H4XNhFa+2ck?BqLJth%mjFQr4+sVRgrYbRhS>eW+OWSe~4CNb$>1A@u0La5 zAgg;Tr}L@uldEGC)+DF}dy0>^^8F~EprqH>@}INdgs(lIbpvC>rx?;#XVr{q-jji? zh_|C!2Uc6V#~pS0(AiM0)NJi&tXNr{B$vOF&`3ukr(YUN=`Ltx;WDZw-5#GfDy@3R zft)+r$Vl>9Ar|~DGQ?$GtnFHjpN?orTl$a<9#H|r`Beh}=pj-vG0ZTo(IYSxqC1Qh zbM+BDLHu%}Gz>#|;{iqgB zkaQY$`ga@4Lll1^e)i50?}n91Ezp7~?}oVC1LTk0o!Y|XIj_&NM^T{l_!oy9#R=EM zA0grnAu85?ewq2O4Q7p~OzzbY`^*^6n#3Fy2!8&sgG!ObK)Jem$|boeB+Q_j53j$?sy#1@q6prgKl(+dDel6a z;$9A5o-Fs(`2A%~ZAmQGJ_fKsclmK%%8HU9qcD^s?y$rpj+!~RyPd)=F+z`9``7dn zg%>3ze)e~d=RIxjQ?5RZedy;5=r_lrtCptw?{r}op?s(^(6Sy>L&DH7KLENAs9s?{ zS6@A>r^7tCTxDICUPY7vzd!BnsKm<@U)OhaS|Yhc){0UfwF>V{|0PE45vsI_-tXf&4)|ZC!0cfQb)qipyN45G9kl$g0!a&u*WzOUQN$m;v3+vV z<0IYRFdvRM!jjh^mnGY0RR7dIp-qFM;2`@J21lR(+{aKYfe@OASE;*%A#`6pj{&Li z3A7Zc+PsquLEHg#g;Zphpyi+?;^(~tN(Sl9O!&(<;_)29TT|i=?YNbCq4s-sWUsKN zLM+`AOKiE@TXwdpx5TzR#J-`=xJ+x~l_YOCN#>o7cZ4UaNWd+`7qsg0n&D!X4xz%Y z@0y>-BuZa0Gq;R64(B;TeR<}r*-U})3H=(h2y;pgz#VX&%Q0#BRBs{=Qg#U`%T^ZT z%GK2<@TqIc7Q-Mt2bbZnD~pvV3vrWY+*9J4sM38P5%!dB8D4H~eb?0D13oh}Ov{cej&zy z%@B0>*)*}9Kvqu7sk(--5Ro?HMtlSl76bYD`BqXWOSxt>Ho3@nJZ?8-1`AFLhE!k8 z^OSupPp?{URXy&YHlHrLP+RUP*O%}r25Le+vGw11O5r5)mggC6uPUFWo5H#a=yB8| zd}LuJ#25Se-bFI#h_K7gD`&?z0`iovu;Vezv-3yPOHLv|__-p0K9vayn8)gYLrBea zJ2`rA=B5JPLwR&ox}ZjS4nonmTy;O!Da1e!-a!5my)T4F0$qwIeyHd;LU$-#=kr6X zI1g9iiR^V}$V+visoh=8r^_$ZzUsL^C`qgI>RLt26s8k<{hkv!PwBjf+deVs@m&)q zZ?Kp3dimE5ekd{kBH`lv_lJuy%Y_g4hQBau}4ey@{|HI zt`U?IU&a3($_tGXCukzN1&&g?K?^0E!(y_>J-dOa5mchV~^&W>hwv{ay5_AXj`lWsB7ad#h+vucnio?>8N zli=w4VM#?N%PzGHC;fx-HjbKp>l5j;J8J1M${ILgM>)3$l*q(@=4eUu7+?+N)Lm`{ zC$3)bJDuQ8?%{EqubD#va|9Tp%p^Lw?A)FEZVUEB$KV}f4l9Rq1c86qevz0YcEUwC#>a0 zcVDPYX{T)q8)@8V+w4|{%_T_9oM*2(Ry4eB3`?S3&`o*ogQR7h{JkZFLgu9^#g(nD ziy6$c`u*XvfBUprxMY6@84i2%Nc3nRj|yA9D3qK5Zm;C*WHN#6XARVbEVNGq$l zC2%HyE+CGm$8FQX5C%)YkR}w+g13C0^ThS&)6u+9(W9?~T}Z=>AK5*H0X}#2vR!^P zX60ISQJOp3_$j9VgZIb2JZg?dFc72Ro-zDHxm+sXkEKNP9fRFyeAS333T2;aQbm1y}>FC58Ed@5RIV z%t~ecIrB7V2jV?z7|tL;BNIm>72V*jBb+!pdF;zsAxXHG{Nr^MdZ;^}kgkZGS!cH6 zLh;8aKdSF?6s?RjxzZYzAZx3SBEJyQew+X~Rt)N{N2HW9HJEm-_*4D!C(As)XYSU; zERR?Vn2bxCp;KE+skyI!abl7 zOMG1N7W?V&Zjv{S+?^j1(M|B0mYvsyw69u&iM0H|dA&V#qmwry2ImEq_OSZ8O;0__ zSDIAtn2W+p(}!v?5kIa%e8?5W(gX^gu9IR3B{E4C=-C1jIGozZQ=o`gIu+ce#+yiV z+O7%rWHm=ZXOk8t5BmW6tn|^yIW6hXQ5@(LMzZk`koScSHpd9$y-5apfw>_eEI6fl zXj>Vnlt>p$MlFWkGE2`jIHo zn$DSRK=p~hZEG9BRaq&8=32Nf1Ou=xCfp8oA(|(*^6hhfLGw~za7k>{y(hD+*)#~C z?xnjb-&~lP(-6SKHC1`vp*f2?UFNC&!HqF&2kE*P;H)5io<3wtqWvR7nGQMke_H*; zRb?H^xxeFPw7Y0`*3#eyZ$A_XBjA^WvH9}8TR?vDrunwmorD(Qey;z6zF-C$5;%&e@PwypCUg7oMnNg9Qa82 znN-g9BdO9A#yyPLrgywLX7JuEc zg)Oe&O!t{$j=D)R294;0~f~YmYr% zP1B#=&{x)*>gjudr#LBtmlOM$cHsXe0MTy~kUR7Vm%i|51}#)q0lmSAP6xmFU?8i| Xg4?%qdPUWwYT9a|!Y_kc)<66=+QS-Y literal 673 zcmZ?wbhEHb6krfw_{6~Q|NnnuW8-t@&ZVcP0~w8tjk9LWTE2X_;(u;G*N|Xm#{gF& zJp*P&1_lPje^Smxsfi`2DGKG8B^e5dS&0=n`H3ldnR#jX42nNlIJtnTbbuIWv;YGG zvoXi6JO2z$d1ebIb69am&SCePk;dt|(eThNk(md#=_MRFRCqx*TEg<~GImP|9(J$n z=N>>?FwHRmnd8@^s36_KvwOp{E|)^5z>ow(NreO-*J!B~H8NXE@4royU~f>kF7c?% zS#p!Aik1*IgUmQ~87XU@ay&8N%#<*Fw$@}BzAut~A3dECXRI!e`M`B%^In-_E3}y+ z--`cXY(C6yv@%6%{(cs0Mgjenq^f<&sBPk#Ibrdw-OD&z6?s?;UD^|61XsB=ZMZ1U zoD>xM*;d}bLPx6q#F8RQAFO^e;@DNBuI=?aMdX9TXP-tMwX(wrF-aj)T3dF?Wkfn@ zoe-L1lcsR