[Merge] Merge with trunk addons
authorVir (Open ERP) <vir@tinyerp.com>
Wed, 2 Jun 2010 08:23:32 +0000 (13:53 +0530)
committerVir (Open ERP) <vir@tinyerp.com>
Wed, 2 Jun 2010 08:23:32 +0000 (13:53 +0530)
bzr revid: vir@tinyerp.com-20100602082332-bq3vbck48iyd4thx

211 files changed:
MANIFEST.in
addons/account_budget/crossovered_budget_view.xml
addons/base_calendar/base_calendar_view.xml
addons/crm_claim/crm_claim_view.xml
addons/crm_fundraising/crm_fundraising_view.xml
addons/crm_helpdesk/crm_helpdesk_view.xml
addons/crm_profiling/crm_profiling_view.xml
addons/hr_recruitment/hr_recruitment_view.xml
addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
addons/hr_timesheet_sheet/report/timesheet_report_view.xml
addons/mail_gateway/mail_gateway_view.xml
addons/mrp/mrp_view.xml
addons/mrp/report/mrp_production_order_view.xml
addons/mrp_operations/mrp_operations_view.xml
addons/mrp_procurement/mrp_procurement_view.xml
addons/mrp_repair/mrp_repair_view.xml
addons/point_of_sale/pos_view.xml
addons/product/product_view.xml
addons/project/project_demo.xml
addons/project/project_view.xml
addons/project/report/project_report_view.xml
addons/project_gtd/project_gtd.py
addons/project_gtd/project_gtd_view.xml
addons/project_issue/project_issue_view.xml
addons/project_issue/report/project_issue_report_view.xml
addons/project_long_term/project_long_term.py
addons/project_long_term/project_long_term_view.xml
addons/project_long_term/wizard/project_compute_phases_view.xml
addons/project_long_term/wizard/project_compute_tasks_view.xml
addons/project_timesheet/report/task_report_view.xml
addons/purchase/purchase.py
addons/purchase/purchase_view.xml
addons/purchase/report/purchase_report_view.xml
addons/purchase_requisition/purchase_requisition_view.xml
addons/report_intrastat/report_intrastat_view.xml
addons/resource/resource_view.xml
addons/sale/report/sale_report_view.xml
addons/sale/sale.py
addons/sale/sale_view.xml
addons/sale_crm/sale_crm_view.xml
addons/sale_journal/report/sale_journal_report_view.xml
addons/sale_journal/sale_journal_view.xml
addons/scrum/scrum.py
addons/scrum/scrum_demo.xml
addons/scrum/scrum_view.xml
addons/stock/stock.py
addons/stock/stock_view.xml
bin/addons/__init__.py
bin/addons/base/__openerp__.py [new file with mode: 0644]
bin/addons/base/__terp__.py [deleted file]
bin/addons/base/base_data.xml
bin/addons/base/base_update.xml
bin/addons/base/data/res.country.state.csv
bin/addons/base/i18n/am.po
bin/addons/base/i18n/ar.po
bin/addons/base/i18n/bg.po
bin/addons/base/i18n/bs.po
bin/addons/base/i18n/ca.po
bin/addons/base/i18n/cs.po
bin/addons/base/i18n/da.po
bin/addons/base/i18n/de.po
bin/addons/base/i18n/el.po
bin/addons/base/i18n/en_GB.po [new file with mode: 0644]
bin/addons/base/i18n/es.po
bin/addons/base/i18n/es_EC.po
bin/addons/base/i18n/et.po
bin/addons/base/i18n/eu.po
bin/addons/base/i18n/fa.po
bin/addons/base/i18n/fi.po
bin/addons/base/i18n/fr.po
bin/addons/base/i18n/gl.po
bin/addons/base/i18n/he.po
bin/addons/base/i18n/hr.po
bin/addons/base/i18n/hu.po
bin/addons/base/i18n/id.po
bin/addons/base/i18n/is.po
bin/addons/base/i18n/it.po
bin/addons/base/i18n/ja.po
bin/addons/base/i18n/ko.po
bin/addons/base/i18n/lt.po
bin/addons/base/i18n/lv.po
bin/addons/base/i18n/mn.po
bin/addons/base/i18n/nb.po
bin/addons/base/i18n/nl.po
bin/addons/base/i18n/pl.po
bin/addons/base/i18n/pt.po
bin/addons/base/i18n/pt_BR.po
bin/addons/base/i18n/ro.po
bin/addons/base/i18n/ru.po
bin/addons/base/i18n/sk.po
bin/addons/base/i18n/sl.po
bin/addons/base/i18n/sq.po
bin/addons/base/i18n/sr.po
bin/addons/base/i18n/sv.po
bin/addons/base/i18n/th.po
bin/addons/base/i18n/tlh.po
bin/addons/base/i18n/tr.po
bin/addons/base/i18n/uk.po
bin/addons/base/i18n/vi.po
bin/addons/base/i18n/zh_CN.po
bin/addons/base/i18n/zh_TW.po
bin/addons/base/ir/__init__.py
bin/addons/base/ir/ir.xml
bin/addons/base/ir/ir_actions.py
bin/addons/base/ir/ir_attachment.py
bin/addons/base/ir/ir_cron.py
bin/addons/base/ir/ir_filters.py [new file with mode: 0644]
bin/addons/base/ir/ir_model.py
bin/addons/base/ir/ir_rule.py
bin/addons/base/ir/ir_translation.py
bin/addons/base/ir/ir_ui_menu.py
bin/addons/base/ir/ir_ui_view.py
bin/addons/base/ir/ir_values.py
bin/addons/base/migrations/1.2/pre-10-ir_property_rename_column.py [new file with mode: 0644]
bin/addons/base/migrations/1.2/pre-10-res_address_fuction_change_type.py [new file with mode: 0644]
bin/addons/base/module/module.py
bin/addons/base/module/module_view.xml
bin/addons/base/module/wizard/add_new.py
bin/addons/base/res/__init__.py
bin/addons/base/res/bank_view.xml
bin/addons/base/res/config_pixmaps/1.png [new file with mode: 0644]
bin/addons/base/res/config_pixmaps/2.png [new file with mode: 0644]
bin/addons/base/res/config_pixmaps/3.png [new file with mode: 0644]
bin/addons/base/res/country.py
bin/addons/base/res/ir_property.py
bin/addons/base/res/ir_property_view.xml
bin/addons/base/res/partner/crm.py
bin/addons/base/res/partner/crm_view.xml
bin/addons/base/res/partner/partner.py
bin/addons/base/res/partner/partner_data.xml
bin/addons/base/res/partner/partner_demo.xml
bin/addons/base/res/partner/partner_report.xml
bin/addons/base/res/partner/partner_view.xml
bin/addons/base/res/partner/partner_wizard.xml
bin/addons/base/res/partner/wizard/__init__.py
bin/addons/base/res/partner/wizard/partner_sms_send.py [new file with mode: 0644]
bin/addons/base/res/partner/wizard/partner_sms_send_view.xml [new file with mode: 0644]
bin/addons/base/res/partner/wizard/wizard_sms.py [deleted file]
bin/addons/base/res/res_company.py
bin/addons/base/res/res_config.py
bin/addons/base/res/res_config.xml
bin/addons/base/res/res_lang.py
bin/addons/base/res/res_log.py [new file with mode: 0644]
bin/addons/base/res/res_log_view.xml [new file with mode: 0644]
bin/addons/base/res/res_security.xml
bin/addons/base/res/res_user.py
bin/addons/base/rng/view.rng
bin/addons/base/security/base_security.xml
bin/addons/base/security/ir.model.access.csv
bin/addons/base/test/bug_lp541545.xml [new file with mode: 0644]
bin/addons/base/test/test_context.xml [new file with mode: 0644]
bin/addons/gen_graph.sh [deleted file]
bin/addons/module_graph.py [deleted file]
bin/import_xml.rng
bin/netsvc.py
bin/osv/expression.py
bin/osv/fields.py
bin/osv/orm.py
bin/osv/osv.py
bin/release.py
bin/report/custom.py
bin/report/preprocess.py
bin/report/render/rml2pdf/trml2pdf.py
bin/report/render/rml2pdf/utils.py
bin/report/report_sxw.py
bin/service/http_server.py
bin/service/netrpc_server.py
bin/service/web_services.py
bin/sql_db.py
bin/tools/config.py
bin/tools/convert.py
bin/tools/misc.py
bin/tools/translate.py
bin/tools/which.py [new file with mode: 0644]
bin/tools/yaml_import.py
bin/tools/yaml_tag.py
debian/po/bg.po
debian/po/ca.po
debian/po/cs.po
debian/po/de.po
debian/po/el.po
debian/po/es.po
debian/po/es_EC.po
debian/po/fa.po
debian/po/fi.po
debian/po/fr.po
debian/po/gl.po
debian/po/hr.po
debian/po/it.po
debian/po/ja.po
debian/po/ko.po
debian/po/nb.po
debian/po/nl.po
debian/po/pl.po
debian/po/pt.po
debian/po/ro.po
debian/po/ru.po
debian/po/sk.po
debian/po/sv.po
debian/po/tr.po
debian/po/uk.po
debian/po/zh_CN.po
debian/po/zh_TW.po [new file with mode: 0644]
doc/Changelog
doc/Changelog-6.x [new file with mode: 0644]
setup.cfg
setup.py
tools/gen_graph.sh [new file with mode: 0755]
tools/module_graph.py [new file with mode: 0755]
tools/xml2yml.py [new file with mode: 0755]

index b25045b..84ed459 100644 (file)
@@ -9,7 +9,8 @@ include bin/server.pkey
 include bin/gpl.txt
 include man/openerp-server.1
 include man/openerp_serverrc.5
-recursive-include pixmaps
+recursive-include pixmaps *
+recursive-include win32 *
 recursive-include doc *
 recursive-include bin *xml *xsl *sql *rml *sxw *csv *rng
 graft bin/addons/
index 00dec85..b48ccc5 100644 (file)
             </field>
         </record>
 
+        <record id="view_crossovered_budget_search" model="ir.ui.view">
+           <field name="name">crossovered.budget.search</field>
+           <field name="model">crossovered.budget</field>
+           <field name="type">search</field>
+           <field name="arch" type="xml">
+               <search string="Budget">
+                   <group col="20" colspan="4">
+                       <filter string="Draft" domain="[('state','=','draft')]" help="Draft Budgets"  default="1"/>
+                       <filter string="To Validate" domain="[('state','=','validate')]" help="To Validate Budgets" />
+                       <separator orientation="vertical"/>
+                       <field name="name" select="1"/>
+                       <field name="code" select="1" />
+                       <field name="state"/>
+                       <field name="date_from"/>
+                       <field name="date_to"/>
+                   </group>
+               </search>
+           </field>
+        </record>
+
         <record model="ir.actions.act_window" id="act_crossovered_budget_view">
             <field name="name">Budget</field>
             <field name="res_model">crossovered.budget</field>
             <field name="view_type">form</field>
             <field name="view_mode">tree,form</field>
             <field name="view_id" ref="crossovered_budget_view_tree"/>
+            <field name="search_view_id" ref="view_crossovered_budget_search"/>
         </record>
         <menuitem parent="next_id_31"
             id="menu_act_crossovered_budget_view"
index a5afddc..fc5140c 100644 (file)
             </record>
 
                <!-- Calenadar's menu -->
-
-        <menuitem id="base.menu_calendar_configuration" name="Calendar"
-            parent="base.menu_base_config" sequence="10" />
+          <menuitem id="base.menu_calendar_configuration" name="Calendar"
+            parent="base.menu_config_address_book" sequence="15" />
 
                <!-- Invitation menu -->
 
-               <menuitem id="menu_attendee_invitations"
-                       name="Event Invitations" parent="base.menu_calendar_configuration"
-                       sequence="10" action="action_view_attendee_form" />
+              <menuitem id="menu_attendee_invitations"
+            name="Event Invitations" parent="base.menu_calendar_configuration"
+            sequence="10" action="action_view_attendee_form" />
 
                <!--            ALARM FORM VIEW-->
 
 
                <!--            Menu for Alarms-->
 
-        <menuitem id="menu_crm_meeting_avail_alarm"
+         <menuitem id="menu_crm_meeting_avail_alarm"
             groups="base.group_extended"
             action="base_calendar.action_res_alarm_view"
             parent="base.menu_calendar_configuration" />
-
         <!-- Event Form View-->
 
                <record model="ir.ui.view" id="event_form_view">
 
                <!-- Event menu  -->
 
-               <menuitem id="menu_events"
-                               name="Events" parent="base.menu_calendar_configuration"
-                               sequence="5" action="action_view_event" />
+                 <menuitem id="menu_events"
+                name="Events" parent="base.menu_calendar_configuration"
+                sequence="5" action="action_view_event" />
 
      </data>
  </openerp>
index 7b46264..2b3f883 100644 (file)
@@ -2,6 +2,10 @@
 <openerp>
     <data>
 
+    <menuitem id="menu_config_claim" name="Claim"
+        groups="base.group_extended"
+        parent="base.menu_base_config" sequence="8" />
+
     <!-- Claims categories  -->
 
     <record id="crm_claim_categ_action" model="ir.actions.act_window">
@@ -13,8 +17,9 @@
         <field name="context">{'object_id':'crm.claim'}</field>
     </record>
 
-    <menuitem action="crm_claim_categ_action"
-        id="menu_crm_case_claim-act" parent="crm.menu_crm_case_categ" />
+    <menuitem action="crm_claim_categ_action" name="Categories"
+        id="menu_crm_case_claim-act" parent="menu_config_claim" />
+
 
     <!-- Claim Stages -->
 
@@ -27,8 +32,8 @@
         <field name="context">{'object_id':'crm.claim'}</field>
     </record>
 
-    <menuitem action="crm_claim_stage_act"
-            id="menu_crm_claim_stage_act" parent="crm.menu_crm_case_stage" />
+     <menuitem action="crm_claim_stage_act" name="Stages"
+            id="menu_crm_claim_stage_act" parent="menu_config_claim" />
 
     <!-- Claim Resource Type -->
 
@@ -41,9 +46,9 @@
         <field name="context">{'object_id':'crm.claim'}</field>
     </record>
 
-    <menuitem action="crm_claim_resource_act"
+     <menuitem action="crm_claim_resource_act" name="Resource Type"
             id="menu_crm_claim_stage_act"
-            parent="crm.menu_crm_case_resource_type" />
+            parent="menu_config_claim" />
 
         <!-- Claims    -->
 
index 78123fd..6853da7 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version="1.0"?>
 <openerp>
     <data>
+           <!-- Fund Raising Configuration Menu -->
+        <menuitem id="menu_config_fundrising" name="Fund Raising"
+        groups="base.group_extended"
+        parent="base.menu_base_config" sequence="7" />
 
         <!-- Fund Raising Categories Form View -->
 
@@ -13,9 +17,9 @@
             <field name="context">{'object_id':'crm.fundraising'}</field>
         </record>
 
-        <menuitem action="crm_fund_categ_action"
+       <menuitem action="crm_fund_categ_action" name="Categories"
             id="menu_crm_case_fundraising-act" groups="base.group_extended"
-            parent="crm.menu_crm_case_categ" />
+            parent="menu_config_fundrising" />
 
         <!-- Fund Stage Form View -->
 
             <field name="context">{'object_id':'crm.fundraising'}</field>
         </record>
 
-        <menuitem action="crm_fundraising_stage_act"
-            groups="base.group_extended"
+         <menuitem action="crm_fundraising_stage_act"
+            groups="base.group_extended" name="Stages"
             id="menu_crm_fundraising_stage_act"
-            parent="crm.menu_crm_case_stage" />
+            parent="menu_config_fundrising" />
+
 
         <!-- Fund Resource Type Form View -->
 
             <field name="context">{'object_id':'crm.fundraising'}</field>
         </record>
 
-        <menuitem action="crm_fundraising_resource_act"
-            groups="base.group_extended"
+       <menuitem action="crm_fundraising_resource_act"
+            groups="base.group_extended" name="Resource Type"
             id="menu_crm_fundraising_resource_act"
-            parent="crm.menu_crm_case_resource_type" />
+            parent="menu_config_fundrising" />
 
 
         <!-- Fund Raising Tree View -->
index 4642f60..451f6c7 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version="1.0"?>
 <openerp>
     <data>
+       <!-- Helpdesk Support Categories Configuration Menu-->
+       <menuitem id="menu_config_helpdesk" name="Helpdesk"
+        groups="base.group_extended"
+        parent="base.menu_base_config" sequence="8" />
 
         <!-- Helpdesk Support Categories Form View -->
 
@@ -13,8 +17,8 @@
             <field name="context">{'object_id':'crm.helpdesk'}</field>
         </record>
 
-        <menuitem action="crm_helpdesk_categ_action"
-            id="menu_crm_case_helpdesk-act" parent="crm.menu_crm_case_categ" />
+        <menuitem action="crm_helpdesk_categ_action" name="Categories"
+            id="menu_crm_case_helpdesk-act" parent="menu_config_helpdesk" />
 
         <!--  Helpdesk Support Form View -->
 
index 040dff1..eeb95d7 100644 (file)
@@ -15,9 +15,9 @@
           <field name="view_type">form</field>
           <field name="view_mode">tree,form</field>
         </record>
-        <menuitem parent="base.menu_crm_configuration" id="menu_segm_questionnaire"
-                  action="open_questionnaires" />
 
+        <menuitem parent="base.menu_crm_config_sales" id="menu_segm_questionnaire"
+                  action="open_questionnaires" />
 
         <record model="ir.actions.act_window" id="open_questions">
           <field name="name">Questions</field>
@@ -25,7 +25,8 @@
           <field name="view_type">form</field>
           <field name="view_mode">tree,form</field>
         </record>
-        <menuitem parent="base.menu_crm_configuration" id="menu_segm_answer"
+
+        <menuitem parent="base.menu_crm_config_sales" id="menu_segm_answer"
                   action="open_questions" />
 
 <!-- Profiling Questionnaire Tree view  -->
index 8bc2468..433ad5f 100644 (file)
@@ -2,6 +2,12 @@
 <openerp>
     <data>
 
+       <menuitem
+        id="menu_hr_config_applicant"
+        name="Applicant"
+        parent="hr.menu_hr_configuration"
+        />
+
     # ------------------------------------------------------
     # Job Categories
     # ------------------------------------------------------
@@ -25,7 +31,8 @@
         <field name="domain">[('object_id.model', '=', 'hr.applicant')]</field>
         <field name="context">{'object_id':'hr.applicant'}</field>
     </record>
-    <menuitem action="hr_job_stage_act" id="menu_hr_job_stage_act" parent="crm.menu_crm_case_stage"/>
+
+    <menuitem action="hr_job_stage_act" id="menu_hr_job_stage_act" name="Stages" parent="menu_hr_config_applicant"/>
 
     # ------------------------------------------------------
     # Jobs
index 7a12c5d..1693b0d 100644 (file)
                    <newline/>
                    <group expand="1" string="Group By...">
                         <filter string="User" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
+                        <separator orientation="vertical"/>
                         <filter string="Product" icon="terp-project" domain="[]" context="{'group_by':'product_id'}"/>
                         <filter string="Analytic Account" icon="terp-project" domain="[]" context="{'group_by':'analytic_account_id'}"/>
                                <filter string="General Account" icon="terp-project" domain="[]" context="{'group_by':'general_account_id'}"/>
index 790296c..462f20a 100644 (file)
             <field name="arch" type="xml">
                 <search string="Search Timesheet">
                     <group col="10" colspan="4">
-                        <separator orientation="vertical"/>
                         <filter icon="terp-crm" string="In Draft" domain="[('state','in',('draft', 'new'))]" help="Unvalidated Timesheets"/>
                         <filter icon="terp-crm" string="To Validate" domain="[('state','=','confirm')]" help="Confirmed Timesheets"/>
                         <separator orientation="vertical"/>
index c7cf7b0..32e8bda 100644 (file)
                                                domain="[('user_id','=',False)]"/>
                            </field>
                            <field name="company_id" widget="selection" groups="base.group_multi_company"/>
-                    </group>      
-                    <newline/>                        
+                    </group>
+                    <newline/>
                     <group expand="1" string="Group By...">
                            <filter string="User" name="User" icon="terp-hr" context="{'group_by':'user_id'}"/>
-                           <filter string="Product" icon="terp-hr" context="{'group_by':'product_id'}"/>
                            <separator orientation="vertical"/>
+                           <filter string="Product" icon="terp-hr" context="{'group_by':'product_id'}"/>
                            <filter string="Type of Invoicing" icon="terp-hr" context="{'group_by':'to_invoice'}"/>
                            <filter string="Analytic Account" icon="terp-hr" context="{'group_by':'account_id'}"/>
                            <filter string="General Account" icon="terp-hr" context="{'group_by':'general_account_id'}"/>
                            <separator orientation="vertical"/>
                            <field name="general_account_id"/>
                            <field name="to_invoice" widget="selection"/>
-                       </group>                    
+                       </group>
                 </search>
             </field>
         </record>
index 5cf35fa..6114160 100644 (file)
@@ -8,32 +8,32 @@
             <field name="arch" type="xml">
                 <form string="mailgate message">
                     <group colspan="4" col="6">
-                           <field name="name" required="1" select="1"/>
-                           <field name="date" required="1" select="1"/>
-                           <field name="user_id" string="Responsible" select="1"/>
-                       </group>                        
+                        <field name="name" required="1" select="1"/>
+                        <field name="date" required="1" select="1"/>
+                        <field name="user_id" string="Responsible" select="1"/>
+                    </group>
                     <notebook colspan="4">
-                           <page string="Details">
-                               <group col="4" colspan="4">
-                                       <separator string="Email Details" colspan="4"/>
-                                           <field name="email_from" />
-                                           <field name="email_to" />
-                                           <field name="email_cc" />
-                                           <field name="email_bcc" />
-                                           <field name="message_id" />
-                                      </group>
-                                      <separator string="Description" colspan="4"/>
+                        <page string="Details">
+                            <group col="4" colspan="4">
+                                <separator string="Email Details" colspan="4"/>
+                                <field name="email_from" />
+                                <field name="email_to" />
+                                <field name="email_cc" />
+                                <field name="email_bcc" />
+                                <field name="message_id" />
+                           </group>
+                           <separator string="Description" colspan="4"/>
                             <field name="description" nolabel="1" colspan="4" />
-                               </page>
-                               <page string="Attachments">
-                                       <separator string="Attachments" colspan="4"/>
-                                   <field name="attachment_ids" nolabel="1" colspan="4" readonly="1"/>
-                               </page>
-                       </notebook>
+                        </page>
+                        <page string="Attachments">
+                            <separator string="Attachments" colspan="4"/>
+                            <field name="attachment_ids" nolabel="1" colspan="4" readonly="1"/>
+                        </page>
+                    </notebook>
                 </form>
             </field>
         </record>
-        
+
         <record model="ir.ui.view" id="view_mailgate_message_tree">
             <field name="name">mailgate.message.tree</field>
             <field name="model">mailgate.message</field>
             <field name="arch" type="xml">
                 <tree string="Mailgateway Message">
                     <field name="date" />
-                    <field name="email_from" />                    
-                    <field name="user_id" />                    
+                    <field name="email_from" />
+                    <field name="user_id" />
                 </tree>
             </field>
         </record>
-        
+
         <record model="ir.ui.view" id="view_mailgate_message_search">
             <field name="name">mailgate.message.search</field>
             <field name="model">mailgate.message</field>
                     <field name="name" />
                     <field name="date" />
                     <field name="user_id" />
-                    <field name="message_id" />                    
+                    <field name="message_id" />
                 </search>
             </field>
         </record>
-        
+
 
         <record model="ir.ui.view" id="view_mailgate_thread_form">
             <field name="name">mailgate.thread.form</field>
                     <field name="thread" select="1"/>
                     <separator string="Logs" colspan="4"/>
                     <field name="log_ids" nolabel="1" colspan="4" domain="[('history', '=', True)]">
-                       <tree string="Mailgateway Logs">
-                                   <field name="name" select="1" />
-                                   <field name="date" />
-                               </tree>
-                           <form string="Mailgate Logs">
-                                   <field name="name" />
-                                   <field name="date" />
-                                   <field name="user_id" />
-                                   <field name="message_id" />                             
-                                   <notebook colspan="4">
-                                           <page string="Email Details">
-                                               <group col="4" colspan="4">
-                                                       <separator string="Email Details" colspan="4"/>
-                                                           <field name="email_from" />
-                                                           <field name="email_to" />
-                                                           <field name="email_cc" />
-                                                           <field name="email_bcc" />
-                                                      </group>
-                                                      <separator string="Description" colspan="4"/>
+                        <tree string="Mailgateway Logs">
+                            <field name="name" select="1" />
+                            <field name="date" />
+                        </tree>
+                        <form string="Mailgate Logs">
+                            <field name="name" />
+                            <field name="date" />
+                            <field name="user_id" />
+                            <field name="message_id" />
+                            <notebook colspan="4">
+                                <page string="Email Details">
+                                    <group col="4" colspan="4">
+                                        <separator string="Email Details" colspan="4"/>
+                                        <field name="email_from" />
+                                        <field name="email_to" />
+                                        <field name="email_cc" />
+                                        <field name="email_bcc" />
+                                   </group>
+                                   <separator string="Description" colspan="4"/>
                                     <field name="description" nolabel="1" colspan="4" />
-                                               </page>
-                                               <page string="Attachments">
-                                                       <separator string="Attachments" colspan="4"/>
-                                                   <field name="attachment_ids" nolabel="1" colspan="4" />
-                                               </page>
-                                       </notebook>
-                               </form>
+                                </page>
+                                <page string="Attachments">
+                                    <separator string="Attachments" colspan="4"/>
+                                    <field name="attachment_ids" nolabel="1" colspan="4" />
+                                </page>
+                            </notebook>
+                        </form>
                     </field>
                     <separator string="Histories" colspan="4"/>
                     <field name="message_ids" nolabel="1" colspan="4" domain="[('history', '=', True)]">
                 </form>
             </field>
         </record>
-        
+
         <record model="ir.ui.view" id="view_mailgate_thread_tree">
             <field name="name">mailgate.thread.tree</field>
             <field name="model">mailgate.thread</field>
                 </tree>
             </field>
         </record>
-        
+
         <record model="ir.actions.act_window" id="action_view_mailgate_thread">
-               <field name="name">Mailgateway Threads</field>
-               <field name="res_model">mailgate.thread</field>
-               <field name="view_mode">tree,form</field>
-               <field name="view_type">form</field>
-               <field name="view_id" ref="view_mailgate_thread_tree"/>
-           </record>
-               
-               <record model="ir.actions.act_window.view" id="action_view_mailgate_thread_view1">
-               <field name="sequence" eval="1"/>
-               <field name="view_mode">tree</field>
-               <field name="view_id" ref="view_mailgate_thread_tree"/>
-               <field name="act_window_id" ref="action_view_mailgate_thread"/>
-           </record>
-           <record model="ir.actions.act_window.view" id="action_view_mailgate_thread_view2">
-               <field name="sequence" eval="2"/>
-               <field name="view_mode">form</field>
-               <field name="view_id" ref="view_mailgate_thread_form"/>
-               <field name="act_window_id" ref="action_view_mailgate_thread"/>
-           </record>
-               
-               
-                <!-- <menuitem id="base.menu_crm_configuration" name="Cases"
+            <field name="name">Mailgateway Threads</field>
+            <field name="res_model">mailgate.thread</field>
+            <field name="view_mode">tree,form</field>
+            <field name="view_type">form</field>
+            <field name="view_id" ref="view_mailgate_thread_tree"/>
+        </record>
+
+        <record model="ir.actions.act_window.view" id="action_view_mailgate_thread_view1">
+            <field name="sequence" eval="1"/>
+            <field name="view_mode">tree</field>
+            <field name="view_id" ref="view_mailgate_thread_tree"/>
+            <field name="act_window_id" ref="action_view_mailgate_thread"/>
+        </record>
+        <record model="ir.actions.act_window.view" id="action_view_mailgate_thread_view2">
+            <field name="sequence" eval="2"/>
+            <field name="view_mode">form</field>
+            <field name="view_id" ref="view_mailgate_thread_form"/>
+            <field name="act_window_id" ref="action_view_mailgate_thread"/>
+        </record>
+
+
+         <!-- <menuitem id="base.menu_crm_configuration" name="Cases"
             parent="base.menu_base_config" sequence="0"/>
 
         <menuitem id="menu_mailgate_thread" name="Mailgateway Threads" action="action_view_mailgate_thread"
-               parent="base.menu_crm_configuration"  sequence="20"/>
-               -->
+            parent="base.menu_crm_configuration"  sequence="20"/>
+            -->
         <act_window domain="[('partner_id', '=', active_id), ('history', '=', True)]"
             id="act_res_partner_emails" name="Emails"
             res_model="mailgate.message"
             src_model="res.partner"
-            view_id="view_mailgate_message_tree"            
+            view_id="view_mailgate_message_tree"
             />
 
     </data>
-</openerp>
+</openerp>
\ No newline at end of file
index 15ed872..bcda66e 100644 (file)
                            <field name="company_id" groups="base.group_multi_company"/>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By" colspan="4" col="8" groups="base.group_extended">
-                        <filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product_id'}"/>
-                        <filter string="Routing" icon="terp-mrp" domain="[]" context="{'group_by':'routing_id'}"/>
+                    <group expand="0" string="Group By" colspan="4" col="8" groups="base.group_extended">
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
                    </group>
                 </search>
             </field>
             <field name="arch" type="xml">
                 <search string="Search Production">
                    <group col='9' colspan='4'>
-                       <filter icon="terp-mrp" string="Draft"
+                       <filter icon="terp-document-new" string="Draft"
                            domain="[('state','=','draft')]"
                            help="Non confirmed manufacturing orders"/>
-                       <filter icon="terp-mrp" string="Current" name="Current"
+                       <filter icon="terp-check" string="Current" name="Current"
                            default="1"
                            domain="[('state','in',('confirmed','ready','exception'))]"
                            help="Manufacturing Orders which are waiting for raw materials"/>
-                       <filter icon="terp-mrp" string="Ready"
+                       <filter icon="terp-camera_test" string="Ready"
                            domain="[('state','=','ready')]"
                            help="Manufacturing Orders which are ready to produce" />
-                       <filter icon="terp-mrp" string="In Production"
+                       <filter icon="terp-check" string="In Production"
                            domain="[('state','=','in_production')]"
                            help="Manufacturing Orders which are in production" />
                        <separator orientation="vertical"/>
-                       <filter icon="terp-mrp" string="Late"
+                       <filter icon="terp-gnome-cpu-frequency-applet+" string="Late"
                            domain="['&amp;', ('date_planned::date','&lt;', current_date), ('state', 'in', ('draft', 'confirmed', 'ready'))]"
                            help="Production started late" />
                        <separator orientation="vertical"/>
                        <field name="origin"/>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By" colspan="10" col="8">
-                        <filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product_id'}"/>
-                        <filter string="State" icon="terp-mrp" domain="[]" context="{'group_by':'state'}"/>
-                        <filter string="Routing" icon="terp-mrp" domain="[]" context="{'group_by':'routing_id'}" groups="base.group_extended"/>
+                    <group expand="0" string="Group By" colspan="10" col="8">
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}" groups="base.group_extended"/>
                         <separator orientation="vertical"/>
-                        <filter string="Date" icon="terp-mrp" domain="[]" context="{'group_by':'date_planned'}"/>
+                        <filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_planned'}"/>
                     </group>
                </search>
             </field>
index 5663ef9..ec58fa3 100644 (file)
             <field name="arch" type="xml">
                 <search string="Search">
                   <group col="16" colspan="6">
-                               <filter string="This Year" icon="terp-mrp" domain="[('year','=',time.localtime()[0])]" default="1" />
-                                               <filter string="This Month" icon="terp-mrp" domain="[('month','=',time.strftime('%%m'))]" default="1"/>
+                               <filter string="This Year" icon="terp-go-year" domain="[('year','=',time.localtime()[0])]" default="1" />
+                                               <filter string="This Month" icon="terp-go-month" domain="[('month','=',time.strftime('%%m'))]" default="1"/>
                         <separator orientation="vertical"/>
-                                               <filter string="Current" icon="terp-mrp" domain="[('state','in',('open','draft'))]"/>
+                                               <filter string="Current" icon="terp-check" domain="[('state','in',('open','draft'))]"/>
                                                <separator orientation="vertical"/>
                                                <field name="origin"/>
                                                <field name="date_planned"/>
                    <newline/>
 
                    <group expand="1" string="Group By...">
-                       <filter string="Source Location" icon="terp-mrp" context="{'group_by':'location_src_id'}"/>
-                       <filter string="Destination Location" icon="terp-mrp" context="{'group_by':'location_dest_id'}"/>
-                       <filter string="Picking" icon="terp-mrp" context="{'group_by':'picking_id'}"/>
+                       <filter string="Source Location" icon="terp-gtk-jump-to-rtl" context="{'group_by':'location_src_id'}"/>
+                       <filter string="Destination Location" icon="terp-gtk-jump-to-ltr" context="{'group_by':'location_dest_id'}"/>
+                       <filter string="Picking" icon="terp-accessories-archiver" context="{'group_by':'picking_id'}"/>
                        <separator orientation="vertical"/>
-                        <filter string="Routing" icon="terp-mrp" context="{'group_by':'routing_id'}"/>
-                        <filter string="Product" name="Product" icon="terp-mrp" context="{'group_by':'product_id'}" />
-                        <filter string="State" icon="terp-mrp" context="{'group_by':'state'}"/>
+                        <filter string="Routing" icon="terp-stock_align_left_24" context="{'group_by':'routing_id'}"/>
+                        <filter string="Product" name="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}" />
+                        <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
                        <separator orientation="vertical"/>
                        <filter string="BOM" icon="terp-mrp" context="{'group_by':'bom_id'}"/>
-                       <filter string="Month" icon="terp-mrp" context="{'group_by':'month'}"/>
-                       <filter string="Year" icon="terp-mrp" context="{'group_by':'year'}"/>
+                       <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
+                       <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
                    </group>
                     <newline/>
                        <group expand="0" string="Extended options..." groups="base.group_extended">
-                           <filter icon="terp-mrp" string="Draft" domain="[('state','=','draft')]"/>
-                           <filter icon="terp-mrp" string="Picking Exception" domain="[('state','=','picking_except')]"/>
+                           <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]"/>
+                           <filter icon="terp-emblem-important" string="Picking Exception" domain="[('state','=','picking_except')]"/>
                            <separator orientation="vertical"/>
-                           <filter icon="terp-mrp" string="Waiting Goods" domain="[('state','=','confirmed')]"/>
-                           <filter icon="terp-mrp" string="Ready to Produce" domain="[('state','=','ready')]"/>
+                           <filter icon="terp-gtk-media-pause" string="Waiting Goods" domain="[('state','=','confirmed')]"/>
+                           <filter icon="terp-camera_test" string="Ready to Produce" domain="[('state','=','ready')]"/>
                            <separator orientation="vertical"/>
-                           <filter icon="terp-mrp" string="In Production" domain="[('state','=','in_production')]"/>
-                           <filter icon="terp-mrp" string="Done" domain="[('state','=','done')]"/>
-                           <filter icon="terp-mrp" string="Cancelled" domain="[('state','=','cancel')]"/>
+                           <filter icon="terp-check" string="In Production" domain="[('state','=','in_production')]"/>
+                           <filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]"/>
+                           <filter icon="terp-gtk-stop" string="Cancelled" domain="[('state','=','cancel')]"/>
                            <newline/>
-                           <filter icon="terp-mrp" string="Not urgent" domain="[('priority','=','0')]"/>
-                           <filter icon="terp-mrp" string="Normal" domain="[('priority','=','1')]"/>
+                           <filter icon="terp-gtk-media-pause" string="Not urgent" domain="[('priority','=','0')]"/>
+                           <filter icon="terp-check" string="Normal" domain="[('priority','=','1')]"/>
                            <separator orientation="vertical"/>
-                           <filter icon="terp-mrp" string="Urgent" domain="[('priority','=','2')]"/>
-                           <filter icon="terp-mrp" string="Very Urgent" domain="[('priority','=','3')]"/>
+                           <filter icon="terp-gnome-cpu-frequency-applet+" string="Urgent" domain="[('priority','=','2')]"/>
+                           <filter icon="terp-gnome-cpu-frequency-applet+" string="Very Urgent" domain="[('priority','=','3')]"/>
                            <separator orientation="vertical"/>
                            <field name="date_start"/>
                                                <field name="date_finnished"/>
-                       </group>                   
+                       </group>
                   </search>
             </field>
         </record>
index 37e90a9..a5c6564 100644 (file)
                                <field name="production_id"/>
                        </group>
                        <newline/>
-                    <group expand="1" string="Group By" colspan="10" col="8" groups="base.group_extended">
-                        <filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product'}"/>
-                        <filter string="State" icon="terp-mrp" domain="[]" context="{'group_by':'state'}"/>
-                        <filter string="Date" icon="terp-mrp" domain="[]" context="{'group_by':'date_planned'}"/>
+                    <group expand="0" string="Group By" colspan="10" col="8" groups="base.group_extended">
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_planned'}"/>
                     </group>
                </search>
             </field>
index 1defa21..7345dc9 100644 (file)
             <field name="arch" type="xml">
                 <search string="Search Procurement">
                     <group col='10' colspan='4'>
-                       <filter icon="terp-mrp" string="Current" domain="[('state','in',('draft','confirmed'))]" name="current" help="Procurement Orders in draft or open state."/>
-                       <filter icon="terp-mrp" string="Exceptions" domain="[('state','=','exception')]" help="Procurement Orders with exceptions"/>
-                       <filter icon="terp-mrp" string="Late"
+                       <filter icon="terp-check" string="Current" domain="[('state','in',('draft','confirmed'))]" name="current" help="Procurement Orders in draft or open state."/>
+                       <filter icon="terp-emblem-important" string="Exceptions" domain="[('state','=','exception')]" help="Procurement Orders with exceptions"/>
+                       <filter icon="terp-gnome-cpu-frequency-applet+" string="Late"
                            domain="['&amp;', ('date_planned::date','&lt;', current_date), ('state', 'in', ('draft', 'confirmed'))]"
                            help="Procurement started late" />
-                       <filter icon="terp-mrp" string="To Fix" domain="[('state', '=', 'exception'),('message','=','')]" help="Procurement Orders with exceptions and without message"/>
+                       <filter icon="terp-gtk-go-back-rtl" string="To Fix" domain="[('state', '=', 'exception'),('message','=','')]" help="Procurement Orders with exceptions and without message"/>
                        <separator orientation="vertical"/>
                        <field name="name"/>
                        <field name="origin"/>
                        <field name="state" />
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By" colspan="4" col="8" groups="base.group_extended">
-                        <filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product_id'}"/>
-                        <filter string="Reason" icon="terp-mrp" domain="[]" context="{'group_by':'name'}"/>
-                        <filter string="Scheduled Date" icon="terp-mrp" domain="[]" context="{'group_by':'date_planned'}"/>
-                       <filter string="State" icon="terp-mrp" domain="[]" context="{'group_by':'state'}"/>
+                    <group expand="0" string="Group By" colspan="4" col="8" groups="base.group_extended">
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string="Reason" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'name'}"/>
+                        <filter string="Scheduled Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_planned'}"/>
+                       <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                     </group>
                 </search>
             </field>
                         <field name="product_id"/>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="4" col="10">
-                        <filter string="Warehouse" icon="terp-stock" domain="[]"  context="{'group_by':'warehouse_id'}"/>
-                        <filter string="Location" icon="terp-stock" domain="[]" context="{'group_by':'location_id'}"/>
+                    <group expand="0" string="Group By..." colspan="4" col="10">
+                        <filter string="Warehouse" icon="terp-go-home" domain="[]"  context="{'group_by':'warehouse_id'}"/>
+                        <filter string="Location" icon="terp-go-home" domain="[]" context="{'group_by':'location_id'}"/>
                     </group>
                 </search>
             </field>
index 47e80be..36afb1d 100644 (file)
                </group>
                <newline/>
                   <group expand="1" string="Group By" colspan="10" col="8" groups="base.group_extended">
-                      <filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product_id'}"/>
-                      <filter string="State" icon="terp-mrp" domain="[]" context="{'group_by':'state'}"/>
-                      <filter string="Partner" icon="terp-mrp" domain="[]" context="{'group_by':'partner_id'}"/>
+                      <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                      <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                      <filter string="Partner" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
                   </group>
              </search>
           </field>
index ef8ae33..62b15db 100644 (file)
             <field name="type">search</field>
             <field name="arch" type="xml">
                 <search string="Search Sales Order">
-                    <filter icon="terp-sale" string="Quotations" domain="[('state','=','draft')]"/>
-                    <filter icon="terp-sale" string="Running" domain="[('state','in',('payment','advance'))]"/>
+                    <filter icon="terp-document-new" string="Quotations" domain="[('state','=','draft')]"/>
+                    <filter icon="terp-check" string="Running" domain="[('state','in',('payment','advance'))]"/>
                     <separator orientation="vertical"/>
                     <field name="name" select="1"/>
                     <field name="partner_id" select="1"/>
                     <field name="user_id" select="1" widget="selection"/>
                     <field name="date_order" select="1" string="Order date" />
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="11" col="11" groups="base.group_extended">
-                        <filter string="Customer" icon="terp-sale" domain="[]" context="{'group_by':'partner_id'}"/>
-                        <filter string="State" icon="terp-sale" domain="[]" context="{'group_by':'state'}"/>
-                        <filter string="Order Date" icon="terp-sale" domain="[]" context="{'group_by':'date_order'}"/>
-                        <filter string="Salesman" icon="terp-sale" domain="[]" context="{'group_by':'user_id'}"/>
+                    <group expand="0" string="Group By..." colspan="11" col="11" groups="base.group_extended">
+                        <filter string="Customer" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
+                        <filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
                     </group>
                </search>
             </field>
index aa73cdd..11ed4bf 100644 (file)
@@ -1,29 +1,30 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
     <data>
-        <menuitem groups="base.group_extended" id="prod_config_main" name="Product" parent="base.menu_base_config" sequence="50"/>
+        <menuitem groups="base.group_extended" id="prod_config_main" name="Product" parent="base.menu_base_config" sequence="40"/>
+
         <record id="product_search_form_view" model="ir.ui.view">
             <field name="name">product.search.form</field>
             <field name="model">product.product</field>
             <field name="type">search</field>
             <field name="arch" type="xml">
                 <search string="Product">
-                   <filter string="Services" icon="terp-stock" domain="[('type','=','service')]"/>
-                   <filter string="Stockable" icon="terp-stock" domain="['|',('type','=','product'),('type','=','consu')]"/>
+                   <filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
+                   <filter string="Stockable" icon="terp-accessories-archiver" domain="['|',('type','=','product'),('type','=','consu')]"/>
                    <separator orientation="vertical"/>
-                   <filter string="Can be sold" icon="terp-stock" domain="[('sale_ok','=',1)]"/>
-                   <filter string="Can be Purchased" icon="terp-stock" domain="[('purchase_ok', '=', 1)]" />
+                   <filter string="Can be sold" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
+                   <filter string="Can be Purchased" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]" />
                    <separator orientation="vertical"/>
                    <field name="default_code"/>
                    <field name="name"/>
                    <field name="categ_id" widget="selection" operator="child_of"/>
                    <newline/>
-                   <group  expand='1' string='Group by...' groups="base.group_extended">
-                       <filter string='Category' icon="terp-stock" domain="[]" context="{'group_by' : 'categ_id'}" />
+                   <group  expand='0' string='Group by...' groups="base.group_extended">
+                       <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}" />
                        <separator orientation="vertical"/>
-                       <filter string='Default UOM' icon="terp-stock" domain="[]" context="{'group_by' : 'uom_id'}" />
+                       <filter string='Default UOM' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}" />
                        <separator orientation="vertical"/>
-                       <filter string='Type' icon="terp-stock" domain="[]" context="{'group_by' : 'type'}" />
+                       <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}" />
                    </group>
                    <newline/>
                    <group expand="0" string="Extended options..." groups="base.group_extended">
         <menuitem action="product_category_action_form"
             groups="base.group_extended"
             id="menu_product_category_action_form"
-            parent="prod_config_main" sequence="60"/>
+            parent="prod_config_main" sequence="2"/>
 
 
         <record id="product_normal_action_tree" model="ir.actions.act_window">
             <field name="view_mode">tree,form</field>
         </record>
         <menuitem
-            action="product_ul_form_action" groups="base.group_extended" id="menu_product_ul_form_action" parent="prod_config_main" sequence="65"/>
+            action="product_ul_form_action" groups="base.group_extended" id="menu_product_ul_form_action" parent="prod_config_main" sequence="3"/>
 
         <record id="product_packaging_tree_view" model="ir.ui.view">
             <field name="name">product.packaging.tree.view</field>
index f668d82..973194e 100644 (file)
             <field name="project_id" ref="project_project_22"/>
             <field name="name">Latest in house tests</field>
         </record>
+        <record id="project_message_1" model="project.message">
+                       <field name="date">2010-05-27</field>
+                       <field name="project_id" ref="project.project_project_23"/>
+                       <field name="user_id" ref="base.user_root"/>
+                       <field name="description">Follow the procedure of Configuration wizard.
+- Add all required modules
+- Add chat of accounts
+- Create Users</field>
+                       <field name="subject">Configuration steps</field>
+               </record>
     </data>
 </openerp>
index fccf13c..a9e97c0 100644 (file)
@@ -93,7 +93,7 @@
             <field name="type">tree</field>
             <field name="priority" eval="5"/>
             <field name="arch" type="xml">
-                <tree string="Projects">
+                <tree colors="blue:state in ('pending');black:state in ('open','template','close');gray:state in ('cancelled') " string="Projects">
                     <field name="complete_name" string="Project Name"/>
                     <field name="user_id" string="Project Manager"/>
                     <field name="partner_id" string="Partner"/>
             <field name="arch" type="xml">
                 <search string="Search Project">
                    <group col='15' colspan='4'>
-                       <filter icon="terp-project" string="Open" domain="[('state', 'in',('open','draft'))]" help="Open and Draft Projects" default="1"/>
-                       <filter icon="terp-project" string="Pending" domain="[('state', '=', 'pending')]" help="Pending Projects"/>
+                       <filter icon="terp-document-new" string="Draft" domain="[('state', 'in',('draft'))]" help="Draft Projects" default="1"/>
+                       <filter icon="terp-check" string="Current" name="Current" domain="[('state', 'in',('open','pending'))]" help="Open and Pending Projects" default="1"/>
                        <separator orientation="vertical"/>
-                       <filter icon="terp-project" string="Manager" domain="[('user_id', '=', uid)]" help="Projects in which I am a manager."/>
-                       <filter icon="terp-project" string="Member" domain="['|',('user_id', '=', uid),('members', '=', uid)]" help="Projects in which I am a member." default="1"/>
-                       <separator orientation="vertical"/>
-                       <filter icon="terp-project" string="Templates" domain="[('state','=','template')]" help="Template Projects"/>
+                       <filter icon="terp-personal" string="Manager" name="Manager" domain="[('user_id', '=', uid)]" help="Projects in which I am a manager."/>
+                       <filter icon="terp-personal-" string="Member" domain="['|',('user_id', '=', uid),('members', '=', uid)]" help="Projects in which I am a member." default="1"/>
                        <separator orientation="vertical"/>
                        <field name="name" string="Project Name"/>
                        <field name="user_id" string="Project Manager" default="1"/>
                        <field name="partner_id" string="Partner"/>
                    </group>
-                    <group expand="1" string="Group By..." colspan="4" col="20" groups="base.group_extended">
-                        <filter string="Users" name="Users"  icon="terp-project" domain = "[]" context="{'group_by':'user_id'}"/>
-                        <filter string="Partner" name="Partner"  icon="terp-project" domain = "[]" context="{'group_by':'partner_id'}"/>
+                   <newline/>
+                    <group expand="0" string="Group By..." colspan="4" col="20">
+                        <filter string="Users" name="Users"  icon="terp-personal" domain = "[]" context="{'group_by':'user_id'}"/>
+                        <filter string="Partner" name="Partner"  icon="terp-personal" domain = "[]" context="{'group_by':'partner_id'}"/>
                       </group>
                </search>
             </field>
             <field name="domain">[]</field>
             <field name="view_id" ref="view_project"/>
             <field name="search_view_id" ref="view_project_project_filter"/>
+            <field name="context">{'search_default_Current':1}</field>
         </record>
         <menuitem action="open_view_project_all" id="menu_open_view_project_all" parent="menu_project_management" sequence="1"/>
 
             <field name="domain">[('state','=','template')]</field>
             <field name="view_id" ref="view_project"/>
         </record>
-        <menuitem  id="menu_template_project_specification" parent="project.menu_definitions" name="Specification" sequence="1"/>
-        <menuitem action="open_view_template_project" id="menu_template_project" parent="project.menu_template_project_specification" name="Specification Template"/>
+<!--        <menuitem  id="menu_template_project_specification" parent="project.menu_definitions" name="Specification" sequence="1"/>-->
+<!--        <menuitem action="open_view_template_project" id="menu_template_project" parent="project.menu_template_project_specification" name="Specification Template"/>-->
 
         <record id="view_task_work_form" model="ir.ui.view">
             <field name="name">project.task.work.form</field>
                     <separator string="" colspan="4"/>
                     <group col="4" colspan="4">
                         <button icon="gtk-cancel" special="cancel" string="Cancel"/>
-                        <button icon="gtk-refresh" name="compute_hours" string="Update" type="object" default_focus="1"/>
+                        <button icon="gtk-apply" name="compute_hours" string="Update" type="object" default_focus="1"/>
                     </group>
                 </form>
             </field>
                                 <button name="%(action_config_compute_remaining)d" states="done,cancelled" string="Reactivate" type="action" icon="gtk-convert" context="{'button_reactivate':True}" />
                                 <button name="do_pending" states="open" string="Pending" type="object" icon="gtk-media-pause"/>
                                 <button groups="base.group_extended" name="%(action_project_task_delegate)d" states="pending,open" string="Delegate" type="action" icon="gtk-sort-descending"/>
-                                <button name="do_close" states="pending,open" string="Done" type="object" icon="gtk-jump-to"/>
+                                <button name="do_close" states="pending,open" string="Done" type="object" icon="gtk-apply"/>
                                 <button name="do_cancel" states="draft,open,pending" string="Cancel" type="object" icon="gtk-cancel"/>
                             </group>
                         </page>
             <field name="type">tree</field>
             <field eval="2" name="priority"/>
             <field name="arch" type="xml">
-                <tree colors="grey:state in ('cancelled','done');blue:remaining_hours&lt;0;red:bool(date_deadline) and (date_deadline&lt;current_date) and (state in ('draft','open'));black:state not in ('cancelled','done')" string="Tasks">
-                    <field name="sequence" invisible="1"/>
+                <tree colors="grey:state in ('cancelled','done');blue:remaining_hours&lt;0 and state in ('pending');red:bool(date_deadline) and (date_deadline&lt;current_date) and (state in ('draft','open'));black:state not in ('cancelled','done')" string="Tasks">
+                    <field name="sequence" />
                     <field name="name"/>
                     <field name="project_id" icon="gtk-indent" domain="['|',('user_id','=',uid),('members','=',uid)]"/>
                     <field name="user_id"/>
                     <field name="progress" widget="progressbar" invisible="context.get('set_visible',False)"/>
                     <field name="state" invisible="context.get('set_visible',False)"/>
                     <button name="do_open" states="pending,draft,done,cancel" string="Start Task" type="object" icon="gtk-execute" help="For changing to open state" invisible="context.get('set_visible',False)"/>
-                    <button groups="base.group_extended" name="%(action_project_task_delegate)d" states="pending,open,draft" string="Delegate" type="action" icon="gtk-execute" help="For changing to delegate state"/>
-                    <button name="do_close" states="draft,pending,open" string="Done" type="object" icon="gtk-jump-to" help="For changing to done state"/>
+                    <button groups="base.group_extended" name="%(action_project_task_delegate)d" states="pending,open,draft" string="Delegate" type="action" icon="gtk-sort-descending" help="For changing to delegate state"/>
+                    <button name="do_close" states="draft,pending,open" string="Done" type="object" icon="gtk-apply" help="For changing to done state"/>
                     <button name="do_cancel" states="draft,open,pending" string="Cancel" type="object" icon="gtk-cancel" help="For cancelling the task"/>
                 </tree>
             </field>
             <field name="arch" type="xml">
                <search string="Task Edition">
                     <group col="20" colspan="4">
-                        <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Tasks" icon="terp-project" default="1"/>
-                        <filter string="In Progress" domain="[('state','=','open')]" help="Open Tasks" icon="terp-project"/>
-                        <filter string="Pending" domain="[('state','=','pending')]" context="{'show_delegated':False}" help="Pending Tasks" icon="terp-project"/>
+                        <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Tasks" icon="terp-check" default="1"/>
+                        <filter string="In Progress" domain="[('state','=','open')]" help="Open Tasks" icon="terp-camera_test"/>
+                        <filter string="Pending" domain="[('state','=','pending')]" context="{'show_delegated':False}" help="Pending Tasks" icon="terp-gtk-media-pause"/>
                         <separator orientation="vertical"/>
                         <filter string="Deadlines" domain="[('date_deadline','&lt;&gt;',False)]" help="Show only tasks having a deadline" icon="terp-project"/>
                         <separator orientation="vertical"/>
                         <field name="name" select="1"/>
                         <field name="project_id" select="1" widget="selection">
-                             <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
+                             <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-folder-blue"/>
                         </field>
                         <field name="user_id" select="1" widget="selection">
                             <filter domain="[('user_id','=',False)]" help="Unassigned Tasks" icon="gtk-execute" separator="1"/>
                         </field>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="4" col="20">
-                        <filter string="Users" name="group_user_id" icon="terp-project" domain="[]"  context="{'group_by':'user_id'}"/>
-                        <filter string="Project" name="group_project_id" icon="terp-project" domain="[]" context="{'group_by':'project_id'}" default = "1"/>
-                        <filter string="Stage" name="group_stage_id" icon="terp-project" domain="[]" context="{'group_by':'type'}"/>
-                        <filter string="State" name="group_state" icon="terp-project" domain="[]" context="{'group_by':'state'}"/>
+                    <group expand="0" string="Group By..." colspan="4" col="20">
+                        <filter string="Users" name="group_user_id" icon="terp-personal" domain="[]"  context="{'group_by':'user_id'}"/>
+                        <filter string="Project" name="group_project_id" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}" default = "1"/>
+                        <filter string="Stage" name="group_stage_id" icon="terp-stage" domain="[]" context="{'group_by':'type'}"/>
+                        <filter string="State" name="group_state" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                         <separator orientation="vertical"/>
-                        <filter string="Deadline" icon="terp-project" domain="[]" context="{'group_by':'date_deadline'}"/>
-                        <filter string="Start Date" icon="terp-project" domain="[]" context="{'group_by':'date_start'}"/>
-                        <filter string="End Date" icon="terp-project" domain="[]" context="{'group_by':'date_end'}"/>
+                        <filter string="Deadline" icon="terp-gnome-cpu-frequency-applet+" domain="[]" context="{'group_by':'date_deadline'}"/>
+                        <filter string="Start Date" icon="terp-gtk-jump-to-ltr" domain="[]" context="{'group_by':'date_start'}"/>
+                        <filter string="End Date" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'date_end'}"/>
                     </group>
                 </search>
             </field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
                 <tree string="Messages">
+                    <field name="date" select="1"/>
                     <field name="subject" select="1"/>
                     <field name="project_id" select="1"/>
                     <field name="user_id" select="1"/>
-                    <field name="date" select="1"/>
                 </tree>
             </field>
        </record>
            <field name="arch" type="xml">
                <search string="Messages">
                    <group col="20" colspan="4">
-                       <filter domain="[('date','&gt;=',time.strftime('%%Y-%%m-01'))]" icon="terp-project" string="This Month" />
-                       <filter domain="[('date', '=', time.strftime('%%Y-%%m-%%d'))]" icon="terp-project" string="Today" />
+                       <filter domain="[('date','&gt;=',time.strftime('%%Y-%%m-01'))]" icon="terp-go-month" string="This Month" />
+                       <filter domain="[('date', '=', time.strftime('%%Y-%%m-%%d'))]" icon="terp-go-today" string="Today" />
 
                           <separator orientation="vertical"/>
                           <field name="subject"/>
                           </field>
                    </group>
                    <newline/>
-                   <group expand="1" string="Group By..." colspan="4" col="20">
-                       <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
-                       <filter string="User" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
-                       <filter string="Date" icon="terp-project" domain="[]" context="{'group_by':'date'}"/>
+                   <group expand="0" string="Group By..." colspan="4" col="20">
+                       <filter string="Project" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}"/>
+                       <filter string="User" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
+                       <filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date'}"/>
                    </group>
                </search>
            </field>
index b444d17..a87dade 100644 (file)
             <field name="arch" type="xml">
                 <search string="Tasks Analysis">
                        <group>
-                           <filter icon="gtk-media-rewind" string="  365 Days  "
+                           <filter icon="terp-go-year" string="  365 Days  "
                                    domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')),('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
                                    help="Tasks performed in last 365 Days"/>
-                           <filter icon="gtk-media-rewind" string="   30 Days   "
+                           <filter icon="terp-go-month" string="   30 Days   "
                                        name="month"
                                        domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
                                        help="Tasks performed in last 30 days"/>
-                               <filter icon="gtk-media-rewind"
+                               <filter icon="terp-go-week"
                                    string="    7 Days    "
                                    separator="1"
                                    domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
                                    help="Tasks during last 7 days"/>
                            <separator orientation="vertical"/>
                            <filter string="Draft"
-                                       icon="terp-project"
+                                       icon="terp-document-new"
                                        domain="[('state','=','draft')]"
                                        help = "Draft tasks"/>
                                <filter string="Current"
-                                               icon="terp-project"
+                                               icon="terp-check"
                                                domain="[('state', '=' ,'open')]"
                                                help = "In progress tasks"/>
                                <filter string="Pending"
-                                               icon="terp-project"
+                                               icon="terp-gtk-media-pause"
                                                domain="[('state','=','pending')]"
                                                help = "Pending tasks"/>
                        <filter string="Done"
-                                       icon="terp-project"
+                                       icon="terp-dialog-close"
                                        name="done"
                                        domain="[('state','=','done')]"/>
                                                <separator orientation="vertical"/>
                                                <field name="partner_id" />
                            <field name="user_id" widget="selection">
-                               <filter icon="terp-project"
+                               <filter icon="terp-personal"
                                                string="My Task"
                                                help = "My tasks"
                                                domain="[('user_id','=',uid)]" />
-                               <filter icon="terp-project"
+                               <filter icon="terp-personal-"
                                                string="Non Assigned Tasks to users"
                                                help="Non Assigned Tasks to users"
                                                domain="[('user_id','=',False)]"/>
                            </field>
                            <field name="project_id" widget="selection">
-                               <filter icon="terp-project"
+                               <filter icon="terp-folder-blue"
                                                string="My Projects"
                                                help="My Projects"
                                                domain="[('project_id','=',context.get('project_id', False)]"/>
                            </field>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="10" col="11">
-                        <filter string="User" name="User" icon="terp-project" context="{'group_by':'user_id'}" />
-                        <filter string="Project" icon="terp-project" context="{'group_by':'project_id'}"/>
+                    <group expand="0" string="Group By..." colspan="10" col="11">
+                        <filter string="User" name="User" icon="terp-personal" context="{'group_by':'user_id'}" />
+                        <filter string="Project" icon="terp-folder-blue" context="{'group_by':'project_id'}"/>
                         <separator orientation="vertical"/>
-                        <filter string="Partner" icon="terp-project" context="{'group_by':'partner_id'}" />
-                        <filter string="Task" icon="terp-project" context="{'group_by':'name'}" />
-                        <filter string="Done By" icon="terp-project" context="{'group_by':'done_by'}" />
+                        <filter string="Partner" icon="terp-personal" context="{'group_by':'partner_id'}" />
+                        <filter string="Task" icon="terp-stock_align_left_24" context="{'group_by':'name'}" />
+                        <filter string="Done By" icon="terp-personal" context="{'group_by':'done_by'}" />
                         <separator orientation="vertical"/>
-                        <filter string="State" icon="terp-project" context="{'group_by':'state'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
                         <filter string="Company" icon="terp-project" context="{'group_by':'company_id'}"  groups="base.group_multi_company"/>
-                        <filter string="Stage" icon="terp-project" context="{'group_by':'type'}" />
+                        <filter string="Stage" icon="terp-stage" context="{'group_by':'type'}" />
                         <separator orientation="vertical"/>
                         <filter string="Day" icon="terp-project" context="{'group_by':'day'}"/>
-                        <filter string="Month" icon="terp-project" context="{'group_by':'month'}"/>
-                        <filter string="Year" icon="terp-project" context="{'group_by':'year'}"/>
+                        <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
+                        <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
                     </group>
                     <newline/>
                        <group expand="0" string="Extended options..." colspan="10" col="12" groups="base.group_extended">
index 059c19e..d680e53 100644 (file)
@@ -120,8 +120,8 @@ project_gtd_timebox()
 class project_task(osv.osv):
     _inherit = "project.task"
     _columns = {
-        'timebox_id': fields.many2one('project.gtd.timebox', "Timebox"),
-        'context_id': fields.many2one('project.gtd.context', "Context"),
+        'timebox_id': fields.many2one('project.gtd.timebox', "Timebox",help="Time-laps during which task has to be treated"),
+        'context_id': fields.many2one('project.gtd.context', "Context",help="The context place where user has to treat task"),
      }
 
     def copy_data(self, cr, uid, id, default=None, context=None):
@@ -169,7 +169,7 @@ class project_task(osv.osv):
         timebox_obj = self.pool.get('project.gtd.timebox')
         if res['type'] == 'search':
             tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]))
-            search_extended ='''<newline/><group col="%d" expand="1" string="%s" groups="project_gtd.group_project_getting">''' % (len(tt)+7,_('Getting Things Done'))
+            search_extended ='''<newline/><group col="%d" expand="0" string="%s" groups="project_gtd.group_project_getting">''' % (len(tt)+7,_('Getting Things Done'))
             search_extended += '''<filter domain="[('timebox_id','=', False)]" context="{'set_editable':True,'set_visible':True}" icon="gtk-new" string="%s"/>''' % (_('Inbox'),)
             search_extended += '''<filter domain="[('state', 'in', ('draft','open','pending'))]" context="{'set_editable':True,'set_visible':True}" icon="gtk-new" string="%s"/>''' % (_('All'),)
             search_extended += '''<separator orientation="vertical"/>'''
index 1615319..64f6bcd 100644 (file)
@@ -8,7 +8,8 @@
         <field name="arch" type="xml">
             <tree string="Context">
                 <field name="sequence" invisible="1"/>
-                <field name="name"/>
+                <field name="name" select="1"/>
+                <field name="project_default_id" select="1"/>
             </tree>
         </field>
     </record>
@@ -75,7 +76,7 @@
         <field name="inherit_id" ref="project.view_task_tree2" />
         <field name="arch" type="xml">
             <field name="remaining_hours" position="after">
-                <field string="xxxxxx" name="timebox_id" groups="project_gtd.group_project_getting" invisible=" not context.get('set_visible',True)"/>
+                <field string="Timebox" name="timebox_id" groups="project_gtd.group_project_getting" invisible=" not context.get('set_visible',True)"/>
                 <button name="prev_timebox" type="object" icon="gtk-go-back" string="Previous" states="draft,pending,open" groups="project_gtd.group_project_getting" invisible=" not context.get('set_visible',True)"/>
                 <button name="next_timebox" type="object" icon="gtk-go-forward" string="Next" states="draft,pending,open" groups="project_gtd.group_project_getting" invisible=" not context.get('set_visible',False)"/>
                 <button name="do_reopen" states="done,cancelled" string="Reactivate" type="object" icon="gtk-convert" help="For reopening the tasks" invisible="not context.get('set_visible',False)"/>
index c7a420a..9631e31 100644 (file)
@@ -2,6 +2,8 @@
 <openerp>
     <data>
 
+       <menuitem  id="menu_project_confi" name="Project Issue" parent="project.menu_definitions" sequence="1"/>
+
         <record id="project_issue_categ_action" model="ir.actions.act_window">
             <field name="name">Issue Categories</field>
             <field name="res_model">crm.case.categ</field>
@@ -19,7 +21,8 @@
             <field name="domain">[('object_id.model', '=', 'project.issue')]</field>
             <field name="context">{'object_id':'project.issue'}</field>
         </record>
-        <menuitem action="project_issue_stage_act" id="menu_project_issue_stage_act" parent="crm.menu_crm_case_stage"/>
+
+        <menuitem action="project_issue_stage_act" name="Stages" id="menu_project_issue_stage_act" parent="menu_project_confi"/>
 
         <record model="ir.ui.view" id="project_issue_form_view">
             <field name="name">Project Issue Tracker Form</field>
             <field name="arch" type="xml">
                 <search string="Issue Tracker Search">
                     <group colspan="4" col="20">
-                                               <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft and Open Issues" icon="terp-project" default="1"/>
-                        <filter string="In Progress" domain="[('state','=','open')]" help="Open Issues" icon="terp-project"/>
-                        <filter string="Pending" domain="[('state','=','pending')]"  help="Pending Issues" icon="terp-project"/>
-                                               
+                                               <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft and Open Issues" icon="terp-check" default="1"/>
+                        <filter string="In Progress" domain="[('state','=','open')]" help="Open Issues" icon="terp-camera_test"/>
+                        <filter string="Pending" domain="[('state','=','pending')]"  help="Pending Issues" icon="terp-gtk-media-pause"/>
+
                                                <separator orientation="vertical"/>
-                                               
-                        <filter icon="gtk-home" string="   Today   "
+
+                        <filter icon="terp-go-today" string="   Today   "
                             separator="1"
                             domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
                             help="Today's bugs"
                             />
-                        <filter icon="gtk-media-rewind"
+                        <filter icon="terp-go-week"
                             string="    7 Days    " separator="1"
                             domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
                             help="Bugs during last 7 days"
                         <field name="name" select='1' string="Subject"/>
                         <field name="user_id" select="1" widget="selection"/>
                         <field name="state" select="1">
-                            <filter icon="gtk-new" domain="[('state','in',('open','draft'))]" help="Current Bugs" name="current_bugs"/>
-                            <filter icon="gtk-yes" domain="[('state','=','open')]" help="Open Bugs"/>
+                            <filter icon="terp-check" domain="[('state','in',('open','draft'))]" help="Current Bugs" name="current_bugs"/>
+                            <filter icon="terp-camera_test" domain="[('state','=','open')]" help="Open Bugs"/>
                         </field>
                         <field name="project_id" select="1" widget="selection" string="Project"/>
                     </group>
                     <newline/>
                     <group expand="1" string="Group By..." colspan="4" col="20" groups="base.group_extended">
-                           <filter string="Stage" icon="terp-crm" domain="[]"
+                           <filter string="Stage" icon="terp-stage" domain="[]"
                                context="{'group_by':'stage_id'}" />
-                           <filter string="Priority" icon="terp-crm" domain="[]"
+                           <filter string="Priority" icon="terp-rating-rated" domain="[]"
                                context="{'group_by':'priority'}" />
-                           <filter string="Campaign" icon="terp-crm"
+                           <filter string="Campaign" icon="terp-gtk-jump-to-rtl"
                                domain="[]" context="{'group_by':'type_id'}" />
                            <separator orientation="vertical" />
-                           <filter string="Partner" icon="terp-crm" domain="[]"
+                           <filter string="Partner" icon="terp-personal" domain="[]"
                                context="{'group_by':'partner_id'}" />
-                           <filter string="Salesman" icon="terp-crm"
+                           <filter string="Salesman" icon="terp-personal"
                                domain="[]" context="{'group_by':'user_id'}" />
                                                <separator orientation="vertical" />
-                                               <filter string="Month" icon="terp-crm"
+                                               <filter string="Month" icon="terp-go-month"
                                domain="[]" context="{'group_by':'create_date'}" />
                            <separator orientation="vertical" />
                        </group>
             <field name="arch" type="xml">
                 <search string="Feature Tracker Search">
                     <group>
-                        <filter icon="gtk-home" string="   Today   "
+                        <filter icon="terp-go-today" string="   Today   "
                             separator="1"
                             domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
                             help="Today's features"
                             />
-                        <filter icon="gtk-media-rewind"
+                        <filter icon="terp-go-week"
                             string="    7 Days    " separator="1"
                             domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
                             help="Features during last 7 days"
                         <field name="name" select='1' string="Feature description"/>
                         <field name="user_id" select="1" widget="selection"/>
                         <field name="state" select="1">
-                            <filter icon="gtk-new" domain="[('state','in',('open','draft'))]" help="Current Features" name="current_feature"/>
-                            <filter icon="gtk-yes" domain="[('state','=','open')]" help="Open Features"/>
+                            <filter icon="terp-check" domain="[('state','in',('open','draft'))]" help="Current Features" name="current_feature"/>
+                            <filter icon="terp-camera_test" domain="[('state','=','open')]" help="Open Features"/>
                         </field>
                         <field name="project_id" select="1" widget="selection" string="Project"/>
 
index 5694d33..adc1b3c 100644 (file)
                   <group col="16" colspan="8">
                                <!--  <filter string="This Year" name="This Year" icon="terp-hr"
                                        domain="[('name','=',time.localtime()[0])]"/>-->
-                               <filter string="This Year" icon="terp-hr"
+                               <filter string="This Year" icon="terp-go-year"
                                        domain="[('create_date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('create_date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"/>
 
                                <!-- <filter string="This Month" name="This Year" icon="terp-hr"
                                        domain="[('month','=',time.strftime('%%m'))]" />-->
-                       <filter string="This Month" icon="terp-hr" name="This Month"
+                       <filter string="This Month" icon="terp-go-month" name="This Month"
                           domain="[('create_date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('create_date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"/>
 
-                       <filter icon="gtk-media-rewind" string="7 Days" separator="1"
+                       <filter icon="terp-go-week" string="7 Days" separator="1"
                             domain="[('create_date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('create_date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"/>
 
                                <separator orientation="vertical" />
-                        <filter icon="terp-hr"
+                        <filter icon="terp-document-new"
                                string="Draft"
                                domain="[('state','=','draft')]"/>
-                                          <filter icon="terp-hr"
+                                          <filter icon="terp-camera_test"
                                string="Open"
                                domain="[('state','=','open')]"/>
-                                          <filter icon="terp-hr"
+                                          <filter icon="terp-gtk-media-pause"
                                string="Pending"
                                domain="[('state','=','pending')]"/>
 
@@ -88,7 +88,7 @@
 
                                </field>
                                <field name="company_id" widget="selection">
-                           <filter icon="terp-crm"
+                           <filter icon="terp-go-home"
                         context="{'invisible_section': False}"
                         domain="[('section_id.user_id.company_id','=',uid)]"
                         help="My company"/>
                        <field name="user_id"  select="1" widget="selection"/>
                    </group>
                    <newline/>
-                   <group  expand="1" string="Group By..." colspan="4" col="8">
-                        <filter string="User" name="User" icon="terp-sale"
+                   <group  expand="0" string="Group By..." colspan="4" col="8">
+                        <filter string="User" name="User" icon="terp-personal"
                                domain="[]" context="{'group_by':'user_id'}" />
 
-                        <filter string="Company" icon="terp-sale"
+                        <filter string="Company" icon="terp-go-home"
                                domain="[]"
                                context="{'group_by':'company_id'}" />
 
                                context="{'group_by':'section_id'}" />
 
                         <separator orientation="vertical" />
-                        <filter string="State" icon="terp-sale"
+                        <filter string="State" icon="terp-stock_effects-object-colorize"
                                domain="[]" context="{'group_by':'state'}" />
 
-                        <filter string="Category" icon="terp-sale"
+                        <filter string="Category" icon="terp-stock_symbol-selection"
                                domain="[]" context="{'group_by':'categ_id'}" />
 
-                                               <filter string="Stage" icon="terp-sale" domain="[]" context="{'group_by':'stage_id'}"/>
+                                               <filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/>
                                <separator orientation="vertical"/>
-                               <filter string="Project"  icon="terp-sale" domain="[]" context="{'group_by':'project_id'}" />
-                               <filter string="Priority"  icon="terp-sale" domain="[]" context="{'group_by':'priority'}" />
+                               <filter string="Project"  icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}" />
+                               <filter string="Priority"  icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" />
                                <separator orientation="vertical"/>
-                               <filter string="Type"  icon="terp-sale" domain="[]" context="{'group_by':'type_id'}"/>
-                               <filter string="Task"  icon="terp-sale" domain="[]" context="{'group_by':'task_id'}"/>
+                               <filter string="Type"  icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type_id'}"/>
+                               <filter string="Task"  icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'task_id'}"/>
                                <newline/>
-                               <filter string="Assigned To"  icon="terp-sale" domain="[]" context="{'group_by':'assigned_to'}"/>
-                               <filter string="Partner"  icon="terp-sale" domain="[]" context="{'group_by':'partner_id'}"/>
-                               <filter string="Channel"  icon="terp-sale" domain="[]" context="{'group_by':'canal_id'}"/>
+                               <filter string="Assigned To"  icon="terp-personal" domain="[]" context="{'group_by':'assigned_to'}"/>
+                               <filter string="Partner"  icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
+                               <filter string="Channel"  icon="terp-call-start" domain="[]" context="{'group_by':'canal_id'}"/>
 
                         <separator orientation="vertical" />
                         <filter string="Day" icon="terp-sale"
                                domain="[]" context="{'group_by':'day'}"/>
 
-                        <filter string="Month" icon="terp-sale"
+                        <filter string="Month" icon="terp-go-month"
                                domain="[]" context="{'group_by':'month'}" />
 
-                        <filter string="Year" icon="terp-sale"
+                        <filter string="Year" icon="terp-go-year"
                                domain="[]" context="{'group_by':'name'}" />
 
                   </group>
                    <newline/>
                    <group  expand="0" string="Extended options..." colspan="10" col="12" groups="base.group_extended">
-                         <filter icon="terp-sale"
+                         <filter icon="terp-dialog-close"
                                string="Done"
                                domain="[('state','=','done')]"/>
 
-                       <filter icon="terp-sale"
+                       <filter icon="terp-gtk-stop"
                                string="Cancel"
                                domain="[('state','=','cancel')]"/>
                        <group>
                                <field name="task_id"/>
                                <separator orientation="vertical"/>
                                <field name="assigned_to" widget="selection">
-                                       <filter icon="terp-crm"  help = "Project Issue Assigned To Me" domain="[('assigned_to','=',uid)]" />
-                                                       <filter icon="terp-crm"  help="Non Assigned Project Issue"  domain="[('assigned_to','=',False)]"/>
+                                       <filter icon="terp-personal"  help = "Project Issue Assigned To Me" domain="[('assigned_to','=',uid)]" />
+                                                       <filter icon="terp-personal-"  help="Non Assigned Project Issue"  domain="[('assigned_to','=',False)]"/>
                                </field>
                                <newline/>
                                <field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'project.issue')]"/>
index b924650..77a764f 100644 (file)
@@ -93,7 +93,7 @@ class project_phase(osv.osv):
         'next_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'prv_phase_id', 'next_phase_id', 'Next Phases'),
         'previous_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'next_phase_id', 'prv_phase_id', 'Previous Phases'),
         'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of phases."),
-        'duration': fields.float('Duration', required=True),
+        'duration': fields.float('Duration', required=True, help="By default in days"),
         'product_uom': fields.many2one('product.uom', 'Duration UoM', required=True, help="UoM (Unit of Measure) is the unit of measurement for Duration"),
         'task_ids': fields.one2many('project.task', 'phase_id', "Project Tasks"),
         'resource_ids': fields.one2many('project.resource.allocation', 'phase_id', "Project Resources"),
index 68acf49..d339c4e 100644 (file)
@@ -52,7 +52,7 @@
                             <group colspan="2" col="2">
                                 <separator colspan="2" string="Duration"/>
                                 <field name="duration" widget="float_time"/>
-                                <field name="product_uom"/>
+                                <field name="product_uom" widget="selection"/>
                             </group>
                             <group colspan="2" col="2">
                                 <separator colspan="2" string="Dates"/>
@@ -73,7 +73,7 @@
                                 <field name="state" select="1"/>
                                 <button string="Draft" name="set_draft" states="open" icon="gtk-indent"/>
                                 <button string="Start Phase" name="set_open" states="pending,draft" icon="gtk-execute"/>
-                                <button string="Done" name="set_done" states="draft,pending,open" icon="gtk-jump-to"/>
+                                <button string="Done" name="set_done" states="draft,pending,open" icon="gtk-apply"/>
                                 <button string="Pending" name="set_pending" states="open" icon="gtk-media-pause"/>
                                 <button string="Cancel" name="set_cancel" states="draft,open,pending" icon="gtk-cancel"/>
                             </group>
             <field name="arch" type="xml">
                 <search string="Project Phases">
                     <group colspan="4" col="20">
-                        <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Phases" icon="terp-project" default="1"/>
-                        <filter string="In Progress" domain="[('state','=','open')]" help="Open Phases" icon="terp-project"/>
-                        <filter string="Pending" domain="[('state','=','pending')]" help="Pending Phases" icon="terp-project"/>
+                        <filter string="Draft" domain="[('state','=','draft')]" help="Draft Phases" icon="terp-check" default="1"/>
+                        <filter string="In Progress" name="Progress" domain="[('state','=','open')]" help="Open Phases" icon="terp-camera_test"/>
+                        <filter string="Pending" domain="[('state','=','pending')]" help="Pending Phases" icon="terp-gtk-media-pause"/>
                         <separator orientation="vertical"/>
                         <field name="name"/>
                         <field name="project_id" widget="selection">
-                            <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
+                            <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-folder-blue"/>
                         </field>
                         <field name="responsible_id" widget="selection"/>
                         <field name="date_start"/>
                     </group>
                     <newline/>
                     <group expand="1" string="Group By..." colspan="4" col="20" groups="base.group_extended">
-                        <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
-                        <filter string="State" icon="terp-project" domain="[]" context="{'group_by':'state'}"/>
-                        <filter string="User" icon="terp-project" domain="[]" context="{'group_by':'responsible_id'}"/>
-                        <filter string="Start Date" icon="terp-project" domain="[]" context="{'group_by':'date_start'}"/>
+                        <filter string="Project" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="User" icon="terp-personal" domain="[]" context="{'group_by':'responsible_id'}"/>
+                        <filter string="Start Date" icon="terp-gtk-jump-to-ltr" domain="[]" context="{'group_by':'date_start'}"/>
                     </group>
                 </search>
             </field>
             <field name="res_model">project.phase</field>
             <field name="view_type">form</field>
             <field name="view_mode">tree,form,calendar,gantt</field>
-                       <field name="context">{'search_default_responsible_id':uid}</field>
+                       <field name="context">{'search_default_Progress':1,'search_default_responsible_id':uid}</field>
             <field name="search_view_id" ref="view_project_phase_search"/>
         </record>
 
index 4b4e01a..3f1c35b 100644 (file)
@@ -8,6 +8,7 @@
             <field name="type">form</field>
             <field name="arch" type="xml">
                <form string="Compute Scheduling of Phases">
+                   <group colspan="4" height="100" width="500">
                              <field name="target_project" />
                              <newline />
                              <group colspan="4" col="6" attrs="{'invisible':[('target_project','=','all')]}">
@@ -18,6 +19,7 @@
                                        <button  icon="gtk-cancel" special="cancel" string="_Cancel"/>
                                        <button icon="gtk-ok" name="check_selection" string="_Compute" type="object"/>
                              </group>
+                           </group>
                                </form>
             </field>
                </record>
index 3b03f20..31d457d 100644 (file)
@@ -8,11 +8,13 @@
             <field name="type">form</field>
             <field name="arch" type="xml">
                <form string="Compute Scheduling of Phases">
-                             <field name="project_id"/>
-                             <group colspan="4" col="6">
-                                       <button  icon="gtk-cancel" special="cancel" string="_Cancel"/>
+                   <group colspan="4" height="100" width="500">
+                               <field name="project_id"/>
+                               <group colspan="4" col="6">
+                                   <button  icon="gtk-cancel" special="cancel" string="_Cancel"/>
                                        <button icon="gtk-ok" name="compute_date" string="Compute" type="object"/>
                              </group>
+                           </group>
                                </form>
             </field>
                </record>
index 35a7c9f..5a65398 100644 (file)
             <field name="arch" type="xml">
                <search string="Tasks by User">
                        <group colspan="4" col="3">
-                               <filter icon="terp-project" string="This Year" domain="[('year','=',time.strftime('%%Y'))]" />
-                               <filter icon="terp-project" string="This Month" domain="[('month','=',time.strftime('%%m'))]" />
+                               <filter icon="terp-go-year" string="This Year" domain="[('year','=',time.strftime('%%Y'))]" />
+                               <filter icon="terp-go-month" string="This Month" domain="[('month','=',time.strftime('%%m'))]" />
                                <separator orientation="vertical"/>
                            <field name="user_id" select="1" widget="selection"/>
                        </group>
                        <newline/>
                        <group expand="1" string="Group By..." colspan="4" col="3">
-                           <filter string="User" icon="terp-project" context="{'group_by':'user_id'}" default="1" />
-                       <filter string="Year" icon="terp-project" context="{'group_by':'year'}" />
-                       <filter string="Month" icon="terp-project" context="{'group_by':'month'}" />
+                           <filter string="User" icon="terp-personal" context="{'group_by':'user_id'}" default="1" />
+                       <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}" />
+                       <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}" />
                        </group>
                </search>
             </field>
index b886dc6..c2e871f 100644 (file)
@@ -223,7 +223,7 @@ class purchase_order(osv.osv):
             else:
                 raise osv.except_osv(_('Invalid action !'), _('Cannot delete Purchase Order(s) which are in %s State!' % s['state']))
 
-        # TODO: temporary fix in 5.0, to remove in 5.2 when subflows support 
+        # TODO: temporary fix in 5.0, to remove in 5.2 when subflows support
         # automatically sending subflow.delete upon deletion
         wf_service = netsvc.LocalService("workflow")
         for id in unlink_ids:
@@ -248,7 +248,7 @@ class purchase_order(osv.osv):
         return {'value':{'location_id': res, 'dest_address_id': False}}
 
     def onchange_partner_id(self, cr, uid, ids, part):
-        
+
         if not part:
             return {'value':{'partner_address_id': False, 'fiscal_position': False}}
         addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['default'])
@@ -264,12 +264,12 @@ class purchase_order(osv.osv):
     #TODO: implement messages system
     def wkf_confirm_order(self, cr, uid, ids, context={}):
         todo = []
-        for po in self.browse(cr, uid, ids):            
+        for po in self.browse(cr, uid, ids):
             if not po.order_line:
                 raise osv.except_osv(_('Error !'),_('You can not confirm purchase order without Purchase Order Lines.'))
-            for line in po.order_line:            
+            for line in po.order_line:
                 if line.state=='draft':
-                    todo.append(line.id)            
+                    todo.append(line.id)
         current_name = self.name_get(cr, uid, ids)[0][1]
         self.pool.get('purchase.order.line').action_confirm(cr, uid, todo, context)
         for id in ids:
@@ -313,13 +313,13 @@ class purchase_order(osv.osv):
         wf_service = netsvc.LocalService("workflow")
         for p_id in ids:
             # Deleting the existing instance of workflow for PO
-            wf_service.trg_delete(uid, 'purchase.order', p_id, cr)            
+            wf_service.trg_delete(uid, 'purchase.order', p_id, cr)
             wf_service.trg_create(uid, 'purchase.order', p_id, cr)
         return True
 
     def action_invoice_create(self, cr, uid, ids, *args):
         res = False
-       
+
         journal_obj = self.pool.get('account.journal')
         for o in self.browse(cr, uid, ids):
             il = []
@@ -437,7 +437,7 @@ class purchase_order(osv.osv):
                     })
                     if order_line.move_dest_id:
                         self.pool.get('stock.move').write(cr, uid, [order_line.move_dest_id.id], {'location_id':order.location_id.id})
-                    todo_moves.append(move)    
+                    todo_moves.append(move)
             self.pool.get('stock.move').action_confirm(cr, uid, todo_moves)
             self.pool.get('stock.move').force_assign(cr, uid, todo_moves)
             wf_service = netsvc.LocalService("workflow")
@@ -459,26 +459,26 @@ class purchase_order(osv.osv):
 
 
     def do_merge(self, cr, uid, ids, context):
-        """ 
-        To merge similar type of purchase orders.        
-        Orders will only be merged if: 
-        * Purchase Orders are in draft  
-        * Purchase Orders belong to the same partner   
+        """
+        To merge similar type of purchase orders.
+        Orders will only be merged if:
+        * Purchase Orders are in draft
+        * Purchase Orders belong to the same partner
         * Purchase Orders are have same stock location, same pricelist
-        Lines will only be merged if: 
-        * Order lines are exactly the same except for the quantity and unit 
+        Lines will only be merged if:
+        * Order lines are exactly the same except for the quantity and unit
 
          @param self: The object pointer.
          @param cr: A database cursor
          @param uid: ID of the user currently logged in
-         @param ids: the ID or list of IDs 
-         @param context: A standard dictionary 
-         
+         @param ids: the ID or list of IDs
+         @param context: A standard dictionary
+
          @return: new purchase order id
-            
-        """          
-        wf_service = netsvc.LocalService("workflow")    
-        def make_key(br, fields):                    
+
+        """
+        wf_service = netsvc.LocalService("workflow")
+        def make_key(br, fields):
             list_key = []
             for field in fields:
                 field_val = getattr(br, field)
@@ -496,9 +496,9 @@ class purchase_order(osv.osv):
             return tuple(list_key)
 
     # compute what the new orders should contain
-  
+
         new_orders = {}
-    
+
         for porder in [order for order in self.browse(cr, uid, ids) if order.state == 'draft']:
             order_key = make_key(porder, ('partner_id', 'location_id', 'pricelist_id'))
             new_order = new_orders.setdefault(order_key, ({}, []))
@@ -541,7 +541,7 @@ class purchase_order(osv.osv):
                         o_line[field] = field_val
                     o_line['uom_factor'] = order_line.product_uom and order_line.product_uom.factor or 1.0
 
-        
+
 
         allorders = []
         for order_key, (order_data, old_ids) in new_orders.iteritems():
@@ -601,7 +601,7 @@ class purchase_order_line(osv.osv):
         'invoiced': fields.boolean('Invoiced', readonly=True),
         'partner_id': fields.related('order_id','partner_id',string='Partner',readonly=True,type="many2one", relation="res.partner"),
         'date_order': fields.related('order_id','date_order',string='Order Date',readonly=True,type="date")
-        
+
     }
     _defaults = {
         'product_qty': lambda *a: 1.0,
@@ -621,7 +621,7 @@ class purchase_order_line(osv.osv):
             partner_id, date_order=False, fiscal_position=False, date_planned=False,
             name=False, price_unit=False, notes=False):
         if not pricelist:
-            raise osv.except_osv(_('No Pricelist !'), _('You have to select a pricelist in the purchase form !\nPlease set one before choosing a product.'))
+            raise osv.except_osv(_('No Pricelist !'), _('You have to select a pricelist or a supplier in the purchase form !\nPlease set one before choosing a product.'))
         if not  partner_id:
             raise osv.except_osv(_('No Partner!'), _('You have to select a partner in the purchase form !\nPlease set one partner before choosing a product.'))
         if not product:
@@ -692,7 +692,7 @@ class purchase_order_line(osv.osv):
         return res
     def action_confirm(self, cr, uid, ids, context={}):
         self.write(cr, uid, ids, {'state': 'confirmed'}, context)
-        return True    
+        return True
 purchase_order_line()
 
 class mrp_procurement(osv.osv):
@@ -700,7 +700,7 @@ class mrp_procurement(osv.osv):
     _columns = {
         'purchase_id': fields.many2one('purchase.order', 'Latest Requisition'),
     }
-    
+
     def action_po_assign(self, cr, uid, ids, context={}):
         """ This is action which call from workflow to assign purchase order to procurements
         @return: True
index 8aa643d..72d4feb 100644 (file)
             <field name="arch" type="xml">
                 <search string="Search Purchase Order">
                  <group col='10' colspan='4'>
-                    <filter icon="terp-purchase" name="draft" string="Quotations" domain="[('state','=','draft')]" separator="1"/>
-                    <filter icon="terp-purchase" name="confirmed" string="To Approve" domain="[('state','in',('wait','confirmed'))]" separator="1"/>
-                    <filter icon="terp-purchase" name="approved" string="Approved" domain="[('state','in',('approved','done'))]" separator="1"/>
-                    <filter icon="terp-purchase" name="exception" string="Exception" domain="[('state','in',('except_invoice','except_picking'))]" separator="1"/>
+                    <filter icon="terp-document-new" name="draft" string="Quotations" domain="[('state','=','draft')]" separator="1"/>
+                    <filter icon="terp-camera_test" name="confirmed" string="To Approve" domain="[('state','in',('wait','confirmed'))]" separator="1"/>
+                    <filter icon="terp-check" name="approved" string="Approved" domain="[('state','in',('approved','done'))]" separator="1"/>
+                    <filter icon="terp-emblem-important" name="exception" string="Exception" domain="[('state','in',('except_invoice','except_picking'))]" separator="1"/>
                     <separator orientation="vertical"/>
-                    <filter icon="terp-purchase" string="To Invoice" domain="[('invoiced','=',1)]" separator="1"/>
+                    <filter icon="terp-gtk-go-back-rtl" string="To Invoice" domain="[('invoiced','=',1)]" separator="1"/>
                     <separator orientation="vertical"/>
                     <field name="name" select="1" string="Reference"/>
                     <field name="partner_id" select="1"/>
                     <field name="create_uid" select="1" widget="selection"/>
                 </group>
                 <newline/>
-                  <group expand="1" string="Group By..." colspan="4" col="10" groups="base.group_extended">
-                    <filter string="Supplier" icon="terp-purchase" domain="[]" context="{'group_by':'partner_id'}"/>
-                    <filter string="State" icon="terp-sale" domain="[]" context="{'group_by':'state'}"/>
-                    <filter string="Order Date" icon="terp-purchase" domain="[]" context="{'group_by':'date_order'}"/>
+                  <group expand="0" string="Group By..." colspan="4" col="10" groups="base.group_extended">
+                    <filter string="Supplier" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
+                    <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                    <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
+                    <separator orientation="vertical"/>
+                    <filter string="Expected Date" icon="terp-go-month" domain="[]" context="{'group_by':'minimum_planned_date'}"/>
+                    <filter string="Source Document”" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'origin'}"/>
                 </group>
               </search>
             </field>
             <field name="model">purchase.order</field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
-                <tree string="Purchase Order">
+                <tree colors="grey:state in ('approved','done');blue:state in ('wait','confirmed');red:state in ('except_invoice','except_picking')" string="Purchase Order">
                     <field name="name" string="Reference"/>
                     <field name="date_order" string="Order Date"/>
                     <field name="partner_id"/>
                 <tree colors="red:date_planned&lt;=current_date;black:date_planned&gt;current_date" string="Purchase Order Lines">
                     <field name="order_id"/>
                     <field name="name"/>
-                    <field name="date_planned" widget="date"/>
+                    <field name="date_planned" widget="date" width="135"/>
                     <field name="product_id"/>
                     <field name="product_qty"/>
                     <field name="product_uom"/>
             </field>
         </record>
 
+          <record id="purchase_order_line_search" model="ir.ui.view">
+            <field name="name">purchase.order.line.search</field>
+            <field name="model">purchase.order.line</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Search Purchase Order">
+                        <group>
+                        <field name='order_id'/>
+                        <field name="product_id" widget="selection" />
+                        </group>
+                        <newline/>
+                        <group expand="0" string="Group By...">
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by' : 'state'}" />
+                        <filter string="Order Reference" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by' : 'product_id'}" />
+                        </group>
+               </search>
+            </field>
+        </record>
+
         <act_window
             context="{'partner_id': active_id}"
             domain="[('partner_id', '=', active_id)]"
             <field name="domain">[('state','in',('confirmed','done')), ('invoiced','=',False)]</field>
             <field name="view_type">form</field>
             <field name="view_mode">tree,form</field>
+             <field name="search_view_id" ref="purchase_order_line_search"/>
         </record>
         <record id="purchase_line_form_action_tree2" model="ir.actions.act_window.view">
             <field eval="1" name="sequence"/>
index 0cfc357..5dd8dd3 100644 (file)
         <field name="arch" type="xml">
             <search string="Purchase Orders">
             <group colspan="10" col="12">
-               <filter icon="terp-purchase" string="This Year"
+               <filter icon="terp-go-year" string="This Year"
                                    domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
                                    help="Tasks performed in this year"/>
-                <filter icon="terp-purchase" string="This Month"
+                <filter icon="terp-go-month" string="This Month"
                                name="month"
                                domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
                                help="Tasks performed in this month"/>
-                <filter icon="gtk-media-rewind"
+                <filter icon="terp-go-week"
                         string="    7 Days    "
                         separator="1"
                         domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
                         help="Tasks during last 7 days"/>
                 <separator orientation="vertical"/>
-                <filter icon="terp-purchase"
+                <filter icon="terp-document-new"
                        string="Quotations"
                        domain="[('state','=','draft')]"/>
-                <filter icon="terp-purchase"
+                <filter icon="terp-gtk-media-pause"
                                string="Waiting Schedule"
                                domain="[('state','=','waiting_date')]"/>
-                <filter icon="terp-purchase"
+                <filter icon="terp-camera_test"
                                string="Manual in progress"
                                domain="[('state','=','manual')]"/>
 
@@ -80,7 +80,7 @@
                 <field name="partner_id" string="Supplier"/>
                 <field name="product_id"/>
                 <field name="user_id" widget="selection">
-                    <filter icon="terp-purchase"
+                    <filter icon="terp-personal-"
                                string="Purchase Non User"
                                help="Purchase Non User"
                                domain="[('user_id','=',False)]"/>
                                </group>
                                <newline/>
                 <group expand="1" string="Group By..." colspan="10" col="12">
-                    <filter string="Company" icon="terp-purchase" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
-                    <filter string="Warehouse" icon="terp-purchase" context="{'group_by':'warehouse_id'}"/>
-                    <filter string="Location" icon="terp-purchase" context="{'group_by':'location_id'}"/>
+                    <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
+                    <filter string="Warehouse" icon="terp-go-home" context="{'group_by':'warehouse_id'}"/>
+                    <filter string="Location" icon="terp-go-home" context="{'group_by':'location_id'}"/>
                     <separator orientation="vertical"/>
-                    <filter string="Responsible" name="Responsible" icon="terp-purchase" context="{'group_by':'user_id'}"/>
-                    <filter string="Pricelist" icon="terp-purchase" context="{'group_by':'pricelist_id'}"/>
-                    <filter string="Validated by" icon="terp-purchase" context="{'group_by':'validator'}"/>
+                    <filter string="Responsible" name="Responsible" icon="terp-personal" context="{'group_by':'user_id'}"/>
+                    <filter string="Pricelist" icon="terp-dolar" context="{'group_by':'pricelist_id'}"/>
+                    <filter string="Validated by" icon="terp-personal" context="{'group_by':'validator'}"/>
                     <separator orientation="vertical"/>
-                    <filter string="Address Contact Name" icon="terp-purchase" context="{'group_by':'partner_address_id'}"/>
-                    <filter string="Dest. Contact Name" icon="terp-purchase" context="{'group_by':'dest_address_id'}"/>
-                    <filter string="Product" icon="terp-purchase" context="{'group_by':'product_id'}"/>
+                    <filter string="Address Contact Name" icon="terp-personal" context="{'group_by':'partner_address_id'}"/>
+                    <filter string="Dest. Contact Name" icon="terp-gtk-jump-to-ltr" context="{'group_by':'dest_address_id'}"/>
+                    <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/>
                     <separator orientation="vertical"/>
-                    <filter string="Supplier" name="partner_id" icon="terp-purchase" context="{'group_by':'partner_id'}"/>
-                    <filter string="State" icon="terp-purchase" context="{'group_by':'state'}"/>
-                    <filter string="Fiscal Position" icon="terp-purchase" context="{'group_by':'fiscal_position'}"/>
+                    <filter string="Supplier" name="partner_id" icon="terp-personal" context="{'group_by':'partner_id'}"/>
+                    <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
+                    <filter string="Fiscal Position" icon="terp-go-year" context="{'group_by':'fiscal_position'}"/>
                     <newline/>
-                    <filter string="Day" icon="terp-purchase" context="{'group_by':'day'}"/>
-                    <filter string="Month" icon="terp-purchase" context="{'group_by':'month'}"/>
-                    <filter string="Year" icon="terp-purchase" context="{'group_by':'name'}"/>
+                    <filter string="Day" icon="terp-go-month" context="{'group_by':'day'}"/>
+                    <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
+                    <filter string="Year" icon="terp-go-year" context="{'group_by':'name'}"/>
                 </group>
                                <newline/>
                 <group expand="0" string="Extended filters..." colspan="10" col="12" groups="base.group_extended">
-                    <filter icon="terp-purchase" string="Shipping Exception" domain="[('state','=','shipping_except')]"/>
-                    <filter icon="terp-purchase" string="Done" domain="[('state','=','done')]"/>
+                    <filter icon="terp-emblem-important" string="Shipping Exception" domain="[('state','=','shipping_except')]"/>
+                    <filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]"/>
                     <separator orientation="vertical"/>
                     <field name="date_approve"/>
                     <separator orientation="vertical"/>
                     <field name="validator" widget="selection"/>
 
                     <newline/>
-                    <filter icon="terp-purchase" string="Invoice Exception  " domain="[('state','=','invoice_except')]"/>
-                    <filter icon="terp-purchase" string="Cancel" domain="[('state','=','cancel')]"/>
+                    <filter icon="terp-emblem-important" string="Invoice Exception  " domain="[('state','=','invoice_except')]"/>
+                    <filter icon="terp-gtk-stop" string="Cancel" domain="[('state','=','cancel')]"/>
                     <separator orientation="vertical"/>
                     <field name="expected_date"/>
                     <separator orientation="vertical"/>
index 4a4587f..186815c 100644 (file)
@@ -39,7 +39,7 @@
                     <field name="date_start"/>
                     <field name="date_end"/>
                     <field name="origin"/>
-                                       <field name="company_id" groups="base.group_multi_company" widget="selection"/>                    
+                                       <field name="company_id" groups="base.group_multi_company" widget="selection"/>
                 </group>
 
                 <notebook colspan="4">
@@ -65,7 +65,7 @@
                            <button name="tender_reset" states="done,cancel" string="Reset to Draft" type="object" icon="gtk-convert" />
                                                <button name="tender_done" states="in_progress" string="Done" type="object" icon="gtk-jump-to" />
                                                <button name="tender_cancel" states="draft,in_progress" string="Cancel" type="object" icon="gtk-cancel" />
-                       </group>                        
+                       </group>
                     </page>
                     <page string="Quotations">
                                                <field colspan="4" name="purchase_ids" nolabel="1" mode="tree,form">
@@ -77,8 +77,8 @@
                                            <field name="location_id"/>
                                            <field name="minimum_planned_date"/>
                                            <field name="origin"/>
-                                           <field name="state"/>       
-                                           </tree>     
+                                           <field name="state"/>
+                                           </tree>
                        </field>
                                                <separator colspan="4" string=""/>
                        <group col="8" colspan="4">
             <field name="arch" type="xml">
                 <search string="Search Purchase Requisition">
                  <group col='10' colspan='4'>
-                    <filter icon="terp-purchase" string="Current" domain="[('state','=','draft,in_progress')]" separator="1" help="Current Purchaes Requisition"/>
-                                       <filter icon="terp-purchase" string="Done" domain="[('state','=','done')]" separator="1" help="Current Purchaes Requisition"/>                    
+                    <filter icon="terp-check" string="Current" domain="[('state','=','draft,in_progress')]" separator="1" help="Current Purchaes Requisition"/>
+                                       <filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]" separator="1" help="Current Purchaes Requisition"/>
                     <separator orientation="vertical"/>
                     <field name="name" select="1" string="Requisition Reference"/>
                     <field name="purchase_ids" select="1"/>
                     <field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
                 </group>
                 <newline/>
-                  <group expand="1" string="Group By..." colspan="4" col="10" groups="base.group_extended">
-                    <filter string="State" icon="terp-sale" domain="[]" context="{'group_by':'state'}"/>
-                                       <separator orientation="vertical"/>                    
-                    <filter string="Date Start" icon="terp-purchase" domain="[]" context="{'group_by':'date_start'}"/>
-                    <filter string="Date End" icon="terp-purchase" domain="[]" context="{'group_by':'date_end'}"/>
-                    <separator orientation="vertical"/>                    
-                                       <filter string="Origin" icon="terp-purchase" domain="[]" context="{'group_by':'origin'}"/>
+                  <group expand="0" string="Group By..." colspan="4" col="10" groups="base.group_extended">
+                    <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
+                                       <separator orientation="vertical"/>
+                    <filter string="Date Start" icon="terp-gtk-jump-to-ltr" domain="[]" context="{'group_by':'date_start'}"/>
+                    <filter string="Date End" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'date_end'}"/>
+                    <separator orientation="vertical"/>
+                                       <filter string="Origin" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'origin'}"/>
                 </group>
               </search>
             </field>
index e7a12e8..0449b09 100644 (file)
@@ -97,8 +97,8 @@
             <field name="arch" type="xml">
                 <search string="Intrastat Data">
                     <group col="10" colspan="4">
-                        <filter string="This Year" icon="terp-stock" domain="[('name','=',time.localtime()[0])]"/>
-                        <filter string="This Month" icon="terp-stock" domain="[('month','=',time.localtime()[1])]"/>
+                        <filter string="This Year" icon="terp-go-year" domain="[('name','=',time.localtime()[0])]"/>
+                        <filter string="This Month" icon="terp-go-month" domain="[('month','=',time.localtime()[1])]"/>
                         <separator orientation="vertical"/>
                         <field name="name" select="1"/>
                         <field name="month" select="1"/>
index 579f697..adc3b6c 100644 (file)
                        <field name="company_id" widget="selection" groups="base.group_multi_company"/>
                    </group>
                    <newline/>
-                   <group expand="1" string="Group By..." colspan="4" col="20" groups="base.group_extended">
-                        <filter string="Type" icon="terp-project" domain="[]" context="{'group_by':'resource_type'}"/>
-                        <filter string="Company" icon="terp-project" domain="[]" context="{'group_by':'company_id'}"/>
-                        <filter string="User" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
+                   <group expand="0" string="Group By..." colspan="4" col="20" groups="base.group_extended">
+                        <filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'resource_type'}"/>
+                        <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}"/>
+                        <filter string="User" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
                     </group>
                </search>
             </field>
@@ -55,9 +55,9 @@
                        <field name="resource_id" string="Resource" widget="selection"/>
                    </group>
                    <newline/>
-                   <group expand="1" string="Group By..." colspan="4" col="20">
-                        <filter string="Resouce" icon="terp-project" domain="[]" context="{'group_by':'resource_id'}"/>
-                        <filter string="Company" icon="terp-project" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
+                   <group expand="0" string="Group By..." colspan="4" col="20">
+                        <filter string="Resouce" icon="terp-personal" domain="[]" context="{'group_by':'resource_id'}"/>
+                        <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
                     </group>
                </search>
             </field>
             <field name="arch" type="xml">
                 <form string="Resource">
                     <field name="name" />
-                    <field name="active"/>
+                    <field name="user_id" attrs="{'required':[('resource_type','=','user')]}"/>
                     <field name="company_id" widget="selection" groups="base.group_multi_company"/>
-                    <field name="calendar_id" widget="selection"/>
                     <field name="resource_type" />
-                    <field name="user_id" attrs="{'required':[('resource_type','=','user')]}"/>
+                    <field name="calendar_id" widget="selection"/>
                     <field name="time_efficiency" groups="base.group_extended"/>
+                    <field name="active"/>
                 </form>
             </field>
         </record>
index 98ae326..d06c8a2 100644 (file)
         <field name="arch" type="xml">
             <search string="Sales Analysis">
                <group>
-                   <filter icon="gtk-media-rewind" string="  365 Days  "
+                   <filter icon="terp-go-year" string="  365 Days  "
                            domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
                            help="Tasks performed in last 365 days"/>
-                       <filter icon="gtk-media-rewind" string="   30 Days   "
+                       <filter icon="terp-go-month" string="   30 Days   "
                                name="month"
                                domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
                                help="Tasks performed in last 30 days"/>
-                       <filter icon="gtk-media-rewind"
+                       <filter icon="terp-go-week"
                             string="    7 Days    "
                             separator="1"
                             domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
                             help="Tasks during last 7 days"/>
                        <separator orientation="vertical"/>
-                       <filter icon="terp-sale"
+                       <filter icon="terp-document-new"
                            string="Quotations"
                            domain="[('state','=','draft')]"/>
-                       <filter icon="terp-sale"
+                       <filter icon="terp-dolar"
                                string="Sales"
                                domain="[('state','not in',('draft','done','cancel'))]"/>
                        <separator orientation="vertical"/>
                        <field name="partner_id"/>
                     <field name="product_id"/>
                        <field name="user_id" widget="selection">
-                           <filter icon="terp-sale"
+                           <filter icon="terp-dolar"
                             string="My Sales"
                             help="My Sales"
                             domain="[('user_id','=',uid)]"/>
                        </field>
                                </group>
                                <newline/>
-                <group expand="1" string="Group By..." colspan="10" col="12">
-                    <filter string="Salesman" icon="terp-sale" name="User" context="{'group_by':'user_id'}"/>
-                    <filter string="Shop" icon="terp-sale" context="{'group_by':'shop_id'}"/>
-                    <filter string="Company" icon="terp-sale" groups="base.group_multi_company" context="{'group_by':'company_id'}"/>
+                <group expand="0" string="Group By..." colspan="10" col="12">
+                    <filter string="Salesman" icon="terp-personal" name="User" context="{'group_by':'user_id'}"/>
+                    <filter string="Shop" icon="terp-go-home" context="{'group_by':'shop_id'}"/>
+                    <filter string="Company" icon="terp-go-home" groups="base.group_multi_company" context="{'group_by':'company_id'}"/>
                     <separator orientation="vertical"/>
-                    <filter string="Product" icon="terp-sale" context="{'group_by':'product_id','set_visible':True}"/>
-                    <filter string="Default UoM" icon="terp-sale" context="{'group_by':'uom_name'}"/>
-                    <filter string="Partner" icon="terp-sale" context="{'group_by':'partner_id'}"/>
-                    <filter string="State" icon="terp-sale" context="{'group_by':'state'}"/>
+                    <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id','set_visible':True}"/>
+                    <filter string="Default UoM" icon="terp-mrp" context="{'group_by':'uom_name'}"/>
+                    <filter string="Partner" icon="terp-personal" context="{'group_by':'partner_id'}"/>
+                    <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
                     <separator orientation="vertical"/>
-                    <filter string="Pricelist" icon="terp-sale" context="{'group_by':'pricelist_id'}"/>
-                    <filter string="Analytic Account" icon="terp-sale" context="{'group_by':'analytic_account_id'}"/>
-                    <filter string="Category of Product" icon="terp-sale" context="{'group_by':'categ_id'}"/>
+                    <filter string="Pricelist" icon="terp-dolar" context="{'group_by':'pricelist_id'}"/>
+                    <filter string="Analytic Account" icon="terp-folder-green" context="{'group_by':'analytic_account_id'}"/>
+                    <filter string="Category of Product" icon="terp-stock_symbol-selection" context="{'group_by':'categ_id'}"/>
                     <separator orientation="vertical"/>
-                                       <filter string="Day" icon="terp-sale" context="{'group_by':'day'}"/>
-                    <filter string="Month" icon="terp-sale" context="{'group_by':'month'}"/>
-                    <filter string="Year" icon="terp-sale" context="{'group_by':'year'}"/>
+                                       <filter string="Day" icon="terp-go-month" context="{'group_by':'day'}"/>
+                    <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
+                    <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
                 </group>
                                <newline/>
                 <group expand="0" string="Extended options..." groups="base.group_extended">
index 356bd69..e684a1a 100644 (file)
@@ -510,12 +510,12 @@ class sale_order(osv.osv):
     def action_invoice_end(self, cr, uid, ids, context=None):
         if context is None:
             context = {}
-            
+
         for order in self.browse(cr, uid, ids, context=context):
             for line in order.order_line:
                 if line.state == 'exception':
                     self.pool.get('sale.order.line').write(cr, uid, [line.id], {'state': 'confirmed'}, context=context)
-            
+
             if order.state == 'invoice_except':
                 self.write(cr, uid, [order.id], {'state' : 'progress'}, context=context)
 
@@ -1085,7 +1085,7 @@ class sale_order_line(osv.osv):
             warning = {
                 'title': 'No Pricelist !',
                 'message':
-                    'You have to select a pricelist in the sale form !\n'
+                    'You have to select a pricelist or a customer in the sale form !\n'
                     'Please set one before choosing a product.'
                 }
         else:
index 1d49c10..4d82e85 100644 (file)
@@ -43,8 +43,9 @@
             <field name="view_mode">tree,form</field>
             <field name="view_id" ref="view_shop_tree"/>
         </record>
+
         <menuitem action="action_shop_form" id="menu_action_shop_form"
-            parent="base.menu_base_config" sequence="70"
+            parent="product.prod_config_main" sequence="0"
             groups="base.group_extended"/>
 
         <record id="view_sale_order_calendar" model="ir.ui.view">
             <field name="type">search</field>
             <field name="arch" type="xml">
                 <search string="Search Sales Order">
-                    <filter icon="terp-sale" string="Quotations" domain="[('state','=','draft')]"/>
-                    <filter icon="terp-sale" string="Running" domain="[('state','in',('manual','progress'))]"/>
-                    <filter icon="terp-sale" string="Sales To Invoice" domain="[('state','=','manual')]"/>
+                    <filter icon="terp-document-new" string="Quotations" domain="[('state','=','draft')]"/>
+                    <filter icon="terp-check" string="Running" domain="[('state','in',('manual','progress'))]"/>
+                    <filter icon="terp-gtk-go-back-rtl" string="Sales To Invoice" domain="[('state','=','manual')]"/>
                     <separator orientation="vertical"/>
                     <field name="name" select="1"/>
                     <field name="partner_id" select="1"/>
                     <field name="user_id" select="1" widget="selection"/>
                     <field name="date_order" select="1" string="Order date" />
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="11" col="11" groups="base.group_extended">
-                        <filter string="Customer" icon="terp-sale" domain="[]" context="{'group_by':'partner_id'}"/>
-                        <filter string="Salesman" icon="terp-sale" domain="[]" context="{'group_by':'user_id'}"/>
+                    <group expand="0" string="Group By..." colspan="11" col="11" groups="base.group_extended">
+                        <filter string="Customer" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
+                        <filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
                         <separator orientation="vertical"/>
-                        <filter string="Order Date" icon="terp-sale" domain="[]" context="{'group_by':'date_order'}"/>
-                        <filter string="State" icon="terp-sale" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                     </group>
                </search>
             </field>
             <field name="type">search</field>
             <field name="arch" type="xml">
                 <search string="Search Sales Order">
-                    <filter icon="terp-purchase" string="To Invoice" domain="[('invoiced','&lt;&gt;', 1),('state','=','done')]" separator="1"/>
+                    <filter icon="terp-gtk-go-back-rtl" string="To Invoice" domain="[('invoiced','&lt;&gt;', 1),('state','=','done')]" separator="1"/>
                     <separator orientation="vertical"/>
                     <field name="order_id"/>
                     <field name="order_partner_id"/>
                     <field name="product_id"/>
                     <field name="salesman_id" widget="selection">
-                        <filter icon="terp-sale" domain="[('salesman_id','=',uid)]" help="My Sale Order Lines"/>
-                        <filter icon="terp-sale" domain="[('salesman_id','child_of',[uid])]" help="My Departments Sale Order Lines"/>
+                        <filter icon="terp-dolar" domain="[('salesman_id','=',uid)]" help="My Sale Order Lines"/>
+                        <filter icon="terp-personal+" domain="[('salesman_id','child_of',[uid])]" help="My Departments Sale Order Lines"/>
                     </field>
                     <newline/>
                     <group expand="context.get('report',False)" string="Group By..." colspan="9" col="8">
-                        <filter string="Product" icon="terp-sale" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
                         <filter string="Order" icon="terp-sale" domain="[]" context="{'group_by':'order_id'}"/>
-                        <filter string="Salesman" icon="terp-sale" domain="[]" context="{'group_by':'salesman_id'}"/>
-                        <filter string="State" icon="terp-sale" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'salesman_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                     </group>
                 </search>
             </field>
             <field name="type">search</field>
             <field name="arch" type="xml">
                 <search string="Search Uninvoiced Lines">
-                    <filter icon="terp-purchase" string="Shipped"
+                    <filter icon="terp-accessories-archiver" string="Shipped"
                         domain="[('state','=','done')]"
                         name="unshipped"
                         />
-                    <filter icon="terp-purchase" string="Uninvoiced" name="uninvoiced"
+                    <filter icon="terp-dolar_ok!" string="Uninvoiced" name="uninvoiced"
                         domain="[('invoiced','&lt;&gt;', 1),('state','&lt;&gt;','draft'),('state','&lt;&gt;','cancel')]"
                         />
-                    <filter icon="terp-purchase" string="Sale Order"
+                    <filter icon="terp-dolar" string="Sale Order"
                         domain="[('state','=','confirmed')]"
                         name="sale order"
                         />
                     <field name="product_id"/>
                     <field name="state"/>
                     <newline />
-                    <group expand="1" string="Group By..." colspan="9" col="8">
-                        <filter string="Product" icon="terp-sale" domain="[]" context="{'group_by':'product_id'}"/>
-                        <filter string="Order" icon="terp-sale" domain="[]" context="{'group_by':'order_id'}"/>
-                        <filter string="State" icon="terp-sale" domain="[]" context="{'group_by':'state'}"/>
+                    <group expand="0" string="Group By..." colspan="9" col="8">
+                        <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
+                        <filter string="Order" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'order_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                     </group>
                 </search>
             </field>
index 3a703d1..bf5f1aa 100644 (file)
@@ -35,7 +35,7 @@
         <field name="arch" type="xml">
             <field name="date_order" position="after">
             <field name="section_id" default="context.get('section_id', False)" widget="selection" string="Sale Team" groups="base.group_extended">
-                    <filter icon="terp-crm"
+                    <filter icon="terp-personal+"
                             domain="[('section_id','=',context.get('section_id',False))]"
                             groups="base.group_extended"
                             help="My Sales Team"/>
index 9d4cdf3..aa0a9cf 100644 (file)
@@ -1,8 +1,8 @@
 <openerp>
    <data>
-   
+
    <!-- Sales by journal's view  -->
-   
+
            <record model="ir.ui.view" id="view_sale_journal_report_tree">
                <field name="name">sale.journal.report.tree</field>
                <field name="model">sale.journal.report</field>
@@ -19,9 +19,9 @@
                    </tree>
                </field>
            </record>
-           
+
            <!-- sales journal graph view -->
-           
+
            <record id="view_sale_journal_graph" model="ir.ui.view">
                <field name="name">sale.journal.report.graph</field>
             <field name="model">sale.journal.report</field>
@@ -33,9 +33,9 @@
               </graph>
            </field>
        </record>
-           
-         <!-- sales by journal search view -->  
-           
+
+         <!-- sales by journal search view -->
+
            <record model="ir.ui.view" id="view_sale_journal_report_search">
                <field name="name">sale.journal.report.search</field>
                <field name="model">sale.journal.report</field>
                <field name="arch" type="xml">
                    <search string="Sales by Journal">
                        <group col="8" colspan="4">
-                               <filter icon="terp-sale" string="This Year" domain="[('name','!=','')]" help="Sale journal in this year"/>
-                               <filter icon="terp-sale" string="This Month" domain="[('name','=',time.strftime('%%Y-%%m-01'))]" help="Sale journal in this month"/>
+                               <filter icon="terp-go-year" string="This Year" domain="[('name','!=','')]" help="Sale journal in this year"/>
+                               <filter icon="terp-go-month" string="This Month" domain="[('name','=',time.strftime('%%Y-%%m-01'))]" help="Sale journal in this month"/>
                                <separator orientation="vertical"/>
-                               <filter icon="terp-sale"
+                               <filter icon="terp-document-new"
                                        string="Quotations"
                                        domain="[('state','=','draft')]"/>
-                               <filter icon="terp-sale"
+                               <filter icon="terp-gtk-media-pause"
                                                string="Waiting Schedule"
                                                domain="[('state','=','waiting_date')]"/>
-                               <filter icon="terp-sale"
+                               <filter icon="terp-camera_test"
                                                string="In progress"
                                                domain="[('state','=','progress')]"/>
                                <separator orientation="vertical"/>
                                        </group>
                                        <newline/>
                                        <group expand="1" string="Group By..." colspan="4" col="12">
-                                               <filter string="journal" name="journal" icon="terp-sale" context="{'group_by':'journal_id'}"/>
-                                               <filter string="State" icon="terp-sale" context="{'group_by':'state'}"/>
+                                               <filter string="journal" name="journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/>
+                                               <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
                                        </group>
                    </search>
                </field>
            </record>
-       
+
        <!-- Action of sales by journal view-->
-       
+
            <record model="ir.actions.act_window" id="action_sale_journal_report_open_menu_all">
                <field name="name">Sales by Journal</field>
                <field name="res_model">sale.journal.report</field>
            </record>
 
            <menuitem name="Sales by Journal" id="menu_sale_journal_report_open_all" parent="base.next_id_64" action="action_sale_journal_report_open_menu_all"/>
-        
+
         <!-- picking by journal and invoice's tree view-->
 
-       
+
                <record model="ir.ui.view" id="view_sale_journal_picking_report_tree">
                        <field name="name">sale.journal.picking.report.tree</field>
                        <field name="model">sale.journal.picking.report</field>
                                </tree>
                        </field>
                </record>
-               
+
                <!-- picking journal's graph view -->
-               
+
                <record id="view_sale_journal_picking_graph" model="ir.ui.view">
                <field name="name">sale.journal.picking.report.graph</field>
             <field name="model">sale.journal.picking.report</field>
               </graph>
            </field>
        </record>
-       
+
        <!-- Picking journal search view -->
-               
+
                <record model="ir.ui.view" id="view_sale_journal_picking_report_search">
                        <field name="name">sale.journal.picking.report.search</field>
                        <field name="model">sale.journal.picking.report</field>
                        <field name="arch" type="xml">
                                <search string="Picking journal">
                                        <group col="8" colspan="4">
-                                               <filter icon="terp-sale" string="This Year" name="year" domain="[('name','=',time.strftime('%%Y'))]" help="Picking by invoice or by journal method in this year"/>
-                               <filter icon="terp-sale" string="This Month" name="month" domain="[('month','=',time.strftime('%%m'))]" help="Picking by invoice or by journal method in this month"/>
+                                               <filter icon="terp-go-year" string="This Year" name="year" domain="[('name','=',time.strftime('%%Y'))]" help="Picking by invoice or by journal method in this year"/>
+                               <filter icon="terp-go-month" string="This Month" name="month" domain="[('month','=',time.strftime('%%m'))]" help="Picking by invoice or by journal method in this month"/>
                                <separator orientation="vertical"/>
-                               <filter icon="terp-stock"
+                               <filter icon="terp-document-new"
                                        string="Draft"
                                        domain="[('state','=','draft')]"/>
-                               <filter icon="terp-stock"
+                               <filter icon="terp-gtk-media-pause"
                                                string="Pending"
                                                domain="[('state','=','waiting')]"/>
-                               <filter icon="terp-stock"
+                               <filter icon="terp-camera_test"
                                                string="Confirmed"
                                                domain="[('state','=','confirmed')]"/>
                                <separator orientation="vertical"/>
                                                <field name="month" select="1"/>
                                                <field name="invoice_state" select="1"/>
                                                <field name="state" select="1"/>
-                           </group>    
+                           </group>
                            <newline/>
                            <group expand="1" string="Group By..." colspan="4" col="12">
-                           <filter string="Journal" icon="terp-stock" context="{'group_by':'journal_id'}"/>
-                           <filter string="Invoice" icon="terp-stock" context="{'group_by':'invoice_type_id'}"/>
+                           <filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/>
+                           <filter string="Invoice" icon="terp-dolar" context="{'group_by':'invoice_type_id'}"/>
                            <separator orientation="vertical"/>
-                           <filter string="Invoice state" icon="terp-stock" context="{'group_by':'invoice_state'}"/>
-                           <filter string="state" icon="terp-stock" context="{'group_by':'state'}"/>
+                           <filter string="Invoice state" icon="terp-stock_effects-object-colorize" context="{'group_by':'invoice_state'}"/>
+                           <filter string="state" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
                                        </group>
                                </search>
                        </field>
                </record>
-               
+
                <record model="ir.actions.act_window" id="action_sale_journal_picking_report_open">
                        <field name="name">Statistics on picking to invoice</field>
                        <field name="res_model">sale.journal.picking.report</field>
                        <field name="view_mode">tree,form</field>
                        <field name="domain">[('invoice_state','=','2binvoiced'),('invoice_type_id','=',active_id)]</field>
                </record>
-       
+
        <!-- Action for picking journal view -->
-       
+
                <record model="ir.actions.act_window" id="action_sale_journal_picking_report_open_menu_all">
                        <field name="name">Picking Journal</field>
                        <field name="res_model">sale.journal.picking.report</field>
                        <field name="search_view_id" ref="view_sale_journal_picking_report_search"/>
                        <field name="context">{'search_default_month':1, 'group_by_no_leaf':1,'group_by':[]}</field>
                </record>
-               
+
                <menuitem name="Picking journal" id="menu_invoice_type_picking_stats_open_all" parent="stock.next_id_61" action="action_sale_journal_picking_report_open_menu_all"/>
-           
+
        </data>
 </openerp>
index 60161a1..7e4cc33 100644 (file)
@@ -1,8 +1,8 @@
 <openerp>
    <data>
-   
+
    <!--  sale journal invoice Type's Form  view -->
-   
+
            <record model="ir.ui.view" id="view_sale_journal_invoice_type_form">
                <field name="name">sale_journal.invoice.type.form</field>
                <field name="model">sale_journal.invoice.type</field>
@@ -17,9 +17,9 @@
                    </form>
                </field>
            </record>
-           
-         <!--  sale journal invoice Type's tree  view -->    
-           
+
+         <!--  sale journal invoice Type's tree  view -->
+
            <record model="ir.ui.view" id="view_sale_journal_invoice_type_tree">
                <field name="name">sale_journal.invoice.type.tree</field>
                <field name="model">sale_journal.invoice.type</field>
                    </tree>
                </field>
            </record>
-           
-         <!-- Action for sale journal invoice Type -->  
-            
+
+         <!-- Action for sale journal invoice Type -->
+
            <record model="ir.actions.act_window" id="action_definition_journal_invoice_type">
                <field name="res_model">sale_journal.invoice.type</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
            </record>
-       
+
        <!-- <menuitem name="Invoicing Methods" id="menu_definition_journal_invoice_type" parent="sale.menu_shop_configuration" action="action_definition_journal_invoice_type"/> -->
-       
+
        <!-- sale journal Form view  -->
-       
+
            <record model="ir.ui.view" id="view_sale_journal_form">
                <field name="name">sale_journal.sale.journal.form</field>
                <field name="model">sale_journal.sale.journal</field>
@@ -57,7 +57,7 @@
                            <field name="date" select="1"/>
                            <field name="date_created" select="1"/>
                            <field name="date_validation" select="1"/>
-                       </group>    
+                       </group>
                                        <notebook colspan="4">
                                <page string="Sales">
                                    <field name="sale_stats_ids" colspan="4" nolabel="1">
@@ -86,9 +86,9 @@
                    </form>
                </field>
            </record>
-           
-  <!-- Sale journal tree view -->          
-           
+
+  <!-- Sale journal tree view -->
+
            <record model="ir.ui.view" id="view_sale_journal_tree">
                <field name="name">sale_journal.sale.journal.tree</field>
                <field name="model">sale_journal.sale.journal</field>
                    </tree>
                </field>
            </record>
-       
-       <!-- Sale journal search view -->         
-       
+
+       <!-- Sale journal search view -->
+
            <record model="ir.ui.view" id="view_sale_journal_search">
                <field name="name">sale_journal.sale.journal.search</field>
                <field name="model">sale_journal.sale.journal</field>
                <field name="arch" type="xml">
                    <search string="Sales by Journal">
                        <group col="8" colspan="4">
-                               <filter icon="terp-sale" string="My Sale Journals" domain="[('user_id','=',uid)]" help="My Sale Journals"/>
-                               <filter icon="terp-sale" string="Open" domain="[('state','=','open')]" help="Open Sale Journals"/>
+                               <filter icon="terp-personal" string="My Sale Journals" domain="[('user_id','=',uid)]" help="My Sale Journals"/>
+                               <filter icon="terp-camera_test" string="Open" domain="[('state','=','open')]" help="Open Sale Journals"/>
                                <separator orientation="vertical"/>
                                <field name="name" select="1"/>
                                <field name="code" select="1"/>
                    </search>
                </field>
            </record>
-           
-      <!-- Action for sale journal view -->    
-       
+
+      <!-- Action for sale journal view -->
+
            <record model="ir.actions.act_window" id="action_definition_journal">
                <field name="res_model">sale_journal.sale.journal</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
                <field name="search_view_id" ref="view_sale_journal_search"/>
            </record>
-       
+
                <menuitem id="menu_definition_journal" name="Sales Journals" parent="base.menu_base_config"  action="action_definition_journal" sequence="60" />
-       
-       <!-- Inherit sales order form view -->  
-       
+
+       <!-- Inherit sales order form view -->
+
            <record model="ir.ui.view" id="sale_journal_sale_order">
                <field name="name">sale.order.journal.view.form</field>
                <field name="type">form</field>
                    </field>
                </field>
            </record>
-           
+
            <!-- Inherit sales order tree view-->
-           
+
            <record model="ir.ui.view" id="sale_journal_sale_order_tree">
                <field name="name">sale.order.journal.view.tree</field>
                <field name="type">tree</field>
                </field>
            </record>
 
-<!--  Inherit stock picking's form view  -->   
-       
+<!--  Inherit stock picking's form view  -->
+
            <record model="ir.ui.view" id="sale_journal_picking_order">
                <field name="name">stock.picking.journal.view.form</field>
                <field name="type">form</field>
                </field>
            </record>
 
-<!--  Inherit stock picking's tree view  -->   
-       
+<!--  Inherit stock picking's tree view  -->
+
            <record model="ir.ui.view" id="sale_journal_picking_order_tree">
                <field name="name">stock.picking.journal.view.tree</field>
                <field name="type">tree</field>
                    </field>
                </field>
            </record>
-       
+
        <!--  Inherit stock picking delivery's form  view.-->
-       
+
            <record model="ir.ui.view" id="sale_journal_picking_order_del">
                <field name="name">stock.picking.journal.view.form</field>
                <field name="type">form</field>
                    </field>
                </field>
            </record>
-       
+
        <!--  Inherit stock picking delivery's tree  view.-->
-       
+
            <record model="ir.ui.view" id="sale_journal_picking_order_tree_del">
                <field name="name">stock.picking.journal.view.tree</field>
                <field name="type">tree</field>
                    </field>
                </field>
            </record>
-       
+
            <record model="ir.ui.view" id="sale_journal_picking_order_in">
                <field name="name">stock.picking.journal.view.form</field>
                <field name="type">form</field>
                    </field>
                </field>
            </record>
-       
+
            <record model="ir.ui.view" id="sale_journal_picking_order_tree_in">
                <field name="name">stock.picking.journal.view.tree</field>
                <field name="type">tree</field>
                    </field>
                </field>
            </record>
-       
+
            <record model="ir.ui.view" id="sale_journal_picking_order_out">
                <field name="name">stock.picking.journal.view.form</field>
                <field name="type">form</field>
                    </field>
                </field>
            </record>
-       
+
            <record model="ir.ui.view" id="sale_journal_picking_order_tree_out">
                <field name="name">stock.picking.journal.view.tree</field>
                <field name="type">tree</field>
                    </field>
                </field>
            </record>
-           
-           <!-- Action of sale journal report in sale journal  --> 
-       
+
+           <!-- Action of sale journal report in sale journal  -->
+
            <act_window name="Monthly sales"
                domain="[('journal_id', '=', active_id)]"
                res_model="sale.journal.report"
                src_model="sale_journal.sale.journal"
                id="act_sale_journal_sale_journal_2_sale_journal_sale_stats"/>
-       
-          <!-- Action  of stock picking  in picking journal  --> 
-       
+
+          <!-- Action  of stock picking  in picking journal  -->
+
            <act_window name="Assigned picking"
                domain="[('journal_id', '=', active_id),('state', '=', 'assigned')]"
                res_model="stock.picking"
                src_model="sale_journal.picking.journal"
                id="act_sale_journal_picking_journal_2_stock_picking_assigned"/>
-               
-         <!-- Action  of stock picking  in picking journal  -->        
-       
+
+         <!-- Action  of stock picking  in picking journal  -->
+
            <act_window name="Confirmed picking"
                domain="[('journal_id', '=', active_id),('state', '=', 'confirmed')]"
                res_model="stock.picking"
                src_model="sale_journal.picking.journal"
                id="act_sale_journal_picking_journal_2_stock_picking_confirmed"/>
-               
-        <!-- Action  of stock picking  in sale journal  -->       
-               
+
+        <!-- Action  of stock picking  in sale journal  -->
+
            <act_window name="Assigned picking"
                domain="[('sale_journal_id', '=', active_id),('state', '=', 'assigned')]"
                res_model="stock.picking"
                id="act_sale_journal_sale_journal_2_stock_picking_confirmed"/>
 
        <!-- Action of sale order in sale journal -->
-       
+
            <act_window name="Draft sales"
                domain="[('journal_id', '=', active_id),('state', '=', 'draft')]"
                res_model="sale.order"
                src_model="sale_journal.sale.journal"
                id="act_sale_journal_sale_journal_2_sale_order_draft"/>
-               
-         <!-- Action  of sale order in sale journal -->      
-       
+
+         <!-- Action  of sale order in sale journal -->
+
            <act_window name="Approved sales"
                domain="[('journal_id', '=', active_id),('state', '=', 'approved')]"
                res_model="sale.order"
                src_model="sale_journal.sale.journal"
                id="act_sale_journal_sale_journal_2_sale_order_approved"/>
-       
+
            <record id="view_partner_property_form" model="ir.ui.view">
                <field name="name">res.partner.journal.property.form.inherit</field>
                <field name="model">res.partner</field>
                    </page>
                </field>
            </record>
-           
+
        <!--=====================================================-->
        <!-- picking journal view-->
        <!--=====================================================    -->
-       
+
            <record model="ir.ui.view" id="view_picking_journal_form">
                <field name="name">sale_journal.picking.journal.form</field>
                <field name="model">sale_journal.picking.journal</field>
                            <field name="date" select="1"/>
                            <field name="date_created" select="1"/>
                            <field name="date_validation" select="1"/>
-                       </group>    
+                       </group>
                                        <notebook colspan="4">
                                <page string="Picking">
                                    <field name="picking_stats_ids" colspan="4" nolabel="1"/>
                    </form>
                </field>
            </record>
-           
+
            <record model="ir.ui.view" id="view_picking_journal_tree">
                <field name="name">sale_journal.picking.journal.tree</field>
                <field name="model">sale_journal.picking.journal</field>
                </field>
            </record>
 
-       <!-- Picking journal tree view  -->     
-       
+       <!-- Picking journal tree view  -->
+
            <record model="ir.ui.view" id="view_picking_journal_search">
                <field name="name">sale_journal.picking.journal.search</field>
                <field name="model">sale_journal.picking.journal</field>
                <field name="arch" type="xml">
                    <search string="Picking Journals">
                        <group col="8" colspan="4">
-                           <filter icon="terp-hr" string="My Picking Journals" domain="[('user_id','=',uid)]" help="My Picking Journals"/>
-                           <filter icon="terp-hr" string="Open" domain="[('state','=','open')]" help="Open Picking Journals"/>
+                           <filter icon="terp-personal" string="My Picking Journals" domain="[('user_id','=',uid)]" help="My Picking Journals"/>
+                           <filter icon="terp-camera_test" string="Open" domain="[('state','=','open')]" help="Open Picking Journals"/>
                            <separator orientation="vertical"/>
                            <field name="name" select="1"/>
                            <field name="code" select="1"/>
                    </search>
                </field>
            </record>
-           
-<!-- Action of Picking journals -->        
-           
+
+<!-- Action of Picking journals -->
+
            <record model="ir.actions.act_window" id="action_definition_picking_journal">
                <field name="name">Picking Journals</field>
                <field name="res_model">sale_journal.picking.journal</field>
                <field name="view_mode">tree,form</field>
                <field name="search_view_id" ref="view_picking_journal_search"/>
            </record>
-       
+
            <menuitem name="Picking Journals" id="menu_definition_journal_picking" parent="stock.menu_stock_configuration" action="action_definition_picking_journal"/>
-       
+
            <record model="ir.actions.act_window" id="action_invoice_type_tree">
                <field name="name">Picking by invoice_method</field>
                <field name="res_model">sale_journal.invoice.type</field>
                <field name="type">ir.actions.act_window</field>
                <field name="view_type">tree</field>
            </record>
-       
+
            <record model="ir.actions.act_window" id="action_invoice_type_picking_open">
                <field name="name">Picking to invoice</field>
                <field name="res_model">stock.picking</field>
                <field name="view_mode">tree,form</field>
                <field name="domain">[('state','=','done'),('invoice_state','=','2binvoiced'),('invoice_type_id','=',active_id)]</field>
            </record>
-           
+
            <record model="ir.values" id="ir_open_invoice_type">
                <field name="key2">tree_but_open</field>
                <field name="model">sale_journal.invoice.type</field>
index 9d3d970..54e9dd5 100644 (file)
@@ -29,7 +29,7 @@ class scrum_project(osv.osv):
     _inherit = 'project.project'
     _columns = {
         'product_owner_id': fields.many2one('res.users', 'Product Owner'),
-        'sprint_size': fields.integer('Sprint Days'),
+        'sprint_size': fields.integer('Sprint Days',help="Number of days allocated for sprint"),
         'scrum': fields.integer('Is a Scrum Project'),
     }
     _defaults = {
@@ -96,7 +96,7 @@ class scrum_sprint(osv.osv):
         'date_start': fields.date('Starting Date', required=True),
         'date_stop': fields.date('Ending Date', required=True),
         'project_id': fields.many2one('project.project', 'Project', required=True, domain=[('scrum','=',1)], help="If you have [?] in the project name, it means there are no analytic account linked to this project."),
-        'product_owner_id': fields.many2one('res.users', 'Product Owner', required=True),
+        'product_owner_id': fields.many2one('res.users', 'Product Owner', required=True,help="The person who is responsible for the product"),
         'scrum_master_id': fields.many2one('res.users', 'Scrum Manager', required=True),
         'meeting_ids': fields.one2many('scrum.meeting', 'sprint_id', 'Daily Scrum'),
         'review': fields.text('Sprint Review'),
@@ -236,7 +236,7 @@ class scrum_task(osv.osv):
                 result[task.id] = True
         return result.keys()
     _columns = {
-        'product_backlog_id': fields.many2one('scrum.product.backlog', 'Product Backlog'),
+        'product_backlog_id': fields.many2one('scrum.product.backlog', 'Product Backlog',help="Related product backlog that contains this task. Used in SCRUM methodology"),
         'sprint_id': fields.related('product_backlog_id','sprint_id', type='many2one', relation='scrum.sprint', string='Sprint',
             store={
                 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['product_backlog_id'], 10),
index edb7e1f..764f2e6 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
     <data noupdate="1">
-        
+
         <!-- Resource: project.project -->
-        
+
         <record id="scrum_project_1" model="project.project">
             <!-- FIXME !!! -->
             <field name="tasks">[24, 25, 28, 26, 27, 29, 30, 31, 32, 33, 34, 35, 37, 36, 38]</field>
@@ -12,9 +12,9 @@
             <field name="name">Open ERP - dev branch</field>
             <field model="res.users" name="product_owner_id" search="[('login','=','demo')]"/>
         </record>
-        
+
         <!-- Resource: scrum.sprint -->
-        
+
         <record id="scrum_sprint_0" model="scrum.sprint">
             <field name="date_stop">2005-12-20</field>
             <field name="name">Sprint for V3.2.0</field>
@@ -23,9 +23,9 @@
             <field name="project_id" ref="scrum_project_1"/>
             <field name="state">open</field>
         </record>
-        
+
         <!-- Resource: project.product.backlog -->
-        
+
         <record id="scrum_product_backlog_0" model="scrum.product.backlog">
             <field name="priority">3</field>
             <field name="name">Automatic migration system</field>
@@ -75,9 +75,9 @@
             <field name="sprint_id" ref="scrum_sprint_0"/>
             <field name="project_id" ref="scrum_project_1"/>
         </record>
-        
+
         <!-- Resource: project.task -->
-        
+
         <record id="scrum_task_3" model="project.task">
             <field name="planned_hours">4.0</field>
             <field model="res.users" name="user_id" search="[('login','=','demo')]"/>
             <field name="name">Editable trees</field>
             <field name="product_backlog_id" ref="scrum_product_backlog_7"/>
         </record>
-        
+               <record id="scrum_meeting_1" model="scrum.meeting">
+                   <field name="question_blocks">Need more specification for improvements for
+- mrp
+- mrp procurement</field>
+                       <field name="question_yesterday">Completed improvemets in Project modules</field>
+                       <field name="question_today">Improvements in Mrp modules</field>
+                       <field name="date">2010-05-28</field>
+                       <field name="sprint_id" ref="scrum.scrum_sprint_0"/>
+                       <field eval="[(6,0,[])]" name="task_ids"/>
+               </record>
     </data>
 </openerp>
index 08c0473..702a385 100644 (file)
@@ -33,7 +33,7 @@
             <field name="model">scrum.product.backlog</field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
-                <tree string="Product Backlog">
+                <tree colors="grey:state in ('cancel','done');blue:state in ('pending')" string="Product Backlog">
                     <field name="sequence" invisible="1"/>
                     <field name="name"/>
                     <field name="project_id"/>
                 <search string="Product Backlogs">
                     <group col="10" colspan="4">
                         <filter default="1"
-                            icon="terp-project"
+                            icon="terp-check"
                             string="Current"
                             domain="['|','&amp;',('sprint_id.date_start','&lt;=',time.strftime('%%Y-%%m-%%d')), ('sprint_id.date_stop','&gt;=',time.strftime('%%Y-%%m-%%d')), ('state','in',['draft','open'])]"
                             help="Current Backlogs"/>
                         <separator orientation="vertical"/>
-                        <filter icon="terp-project" string="Draft" domain="[('state','=','draft')]" help="Draft Backlogs"/>
-                        <filter icon="terp-project" string="Open" domain="[('state','=','open')]" help="Open Backlogs"/>
+                        <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Backlogs"/>
+                        <filter icon="terp-camera_test" string="Open" domain="[('state','=','open')]" help="Open Backlogs"/>
                         <separator orientation="vertical"/>
                         <field name="name"/>
                         <field name="project_id" widget="selection"/>
                         <field name="user_id" widget="selection"/>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="4" col="20" groups="base.group_extended">
-                        <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
+                    <group expand="0" string="Group By..." colspan="4" col="20" groups="base.group_extended">
+                        <filter string="Project" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}"/>
                         <filter string="Sprint" icon="terp-project" domain="[]" context="{'group_by':'sprint_id'}"/>
-                        <filter string="Responsible" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
-                        <filter string="State" icon="terp-project" domain="[]" context="{'group_by':'state'}"/>
+                        <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                     </group>
 
                 </search>
             <field name="model">scrum.sprint</field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
-                <tree string="Scrum Sprint">
+               <tree colors="blue:state in ('pending');grey:state in ('cancel','done')" string="Scrum Sprint">
                     <field name="name"/>
                     <field name="project_id"/>
                     <field name="scrum_master_id"/>
             <field name="arch" type="xml">
                 <search string="Sprints">
                     <group col="10" colspan="4">
-                        <filter name="filter_current" icon="terp-project" string="Current" domain="[('state','in',('draft','open'))]" help="Draft and open Sprints"/>
-                        <filter icon="terp-project" string="Draft" domain="[('state','=','draft')]" help="Draft Sprints"/>
-                        <filter icon="terp-project" string="Open" domain="[('state','=','open')]" help="Open Sprints"/>
+                        <filter name="filter_current" icon="terp-check" string="Current" domain="[('state','in',('draft','open'))]" help="Draft and open Sprints"/>
+                        <separator orientation="vertical"/>
+                        <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Sprints"/>
+                        <filter icon="terp-camera_test" string="Open" domain="[('state','=','open')]" help="Open Sprints"/>
                         <separator orientation="vertical"/>
                         <field name="name"/>
                         <field name="project_id" widget="selection"/>
                         <field name="date_start"/>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="4" col="20">
-                        <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
-                        <filter string="Masters" icon="terp-project" domain="[]"  context="{'group_by':'scrum_master_id'}"/>
-                        <filter string="Product owner" icon="terp-project" domain="[]" context="{'group_by':'product_owner_id'}"/>
-                        <filter string="State" icon="terp-project" domain="[]" context="{'group_by':'state'}"/>
+                    <group expand="0" string="Group By..." colspan="4" col="20">
+                        <filter string="Project" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}"/>
+                        <filter string="Managers" icon="terp-personal" domain="[]"  context="{'group_by':'scrum_master_id'}"/>
+                        <filter string="Product owner" icon="terp-personal" domain="[]" context="{'group_by':'product_owner_id'}"/>
+                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                         <separator orientation="vertical"/>
-                        <filter string="Start Date" icon="terp-project" domain="[]" context="{'group_by':'date_start'}"/>
+                        <filter string="Start Date" icon="terp-gtk-jump-to-ltr" domain="[]" context="{'group_by':'date_start'}"/>
                     </group>
                 </search>
             </field>
             <field name="arch" type="xml">
                 <search string="Scrum Sprint">
                     <group col="10" colspan="4">
-                        <filter name="scrum_daily" icon="terp-project" string="Daily" domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]" help="Daily Meetings"/>
+                        <filter name="scrum_daily" icon="terp-go-today" string="Daily" domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]" help="Daily Meetings"/>
                         <separator orientation="vertical"/>
                         <field name="sprint_id" widget="selection">
-                            <filter icon="terp-project" string="Current" domain="[('sprint_id.state','in',('draft','open'))]" help="Current Sprints" default="1"/>
+                            <filter icon="terp-check" string="Current" domain="[('sprint_id.state','in',('draft','open'))]" help="Current Sprints" default="1"/>
                         </field>
                         <field name="project_id" widget="selection"/>
                         <field name="date"/>
                     </group>
                     <newline/>
-                    <group expand="1" string="Group By..." colspan="4" col="20">
+                    <group expand="0" string="Group By..." colspan="4" col="20">
                         <filter string="Sprint" icon="terp-project" domain="[]" context="{'group_by':'sprint_id'}"/>
-                        <filter string="Date" icon="terp-project" domain="[]" context="{'group_by':'date'}"/>
+                        <filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date'}"/>
                     </group>
                 </search>
             </field>
             <field name="type">search</field>
             <field name="inherit_id" ref="project.view_task_search_form"/>
             <field name="arch" type="xml">
-                <field name="project_id" position="after">
+                <field name="user_id" position="after">
                     <field name="sprint_id" widget="selection" context="{'sprint_invisible':False}">
                         <filter icon="terp-project" string="Current" context="{'sprint_invisible':False}" domain="[('sprint_id.state','in',('draft','open'))]" help="Current Sprints"/>
                     </field>
index 94d20f7..6c3d09f 100644 (file)
@@ -350,7 +350,7 @@ stock_location()
 class stock_tracking(osv.osv):
     _name = "stock.tracking"
     _description = "Stock Tracking Lots"
-    
+
     def get_create_tracking_lot(self, cr, uid, ids, tracking_lot):
         tracking_lot_list = self.search(cr, uid, [('name', '=', tracking_lot)],
                                             limit=1)
@@ -893,7 +893,7 @@ class stock_picking(osv.osv):
         move_obj = self.pool.get('stock.move')
         if not context:
             context = {}
-            
+
         for pick in self.browse(cr, uid, ids, context=context):
             if pick.state in ['done','cancel']:
                 raise osv.except_osv(_('Error'), _('You cannot remove the picking which is in %s state !')%(pick.state,))
@@ -906,7 +906,7 @@ class stock_picking(osv.osv):
                     move_obj.action_cancel(cr, uid, ids2, ctx)
                 #Removing the move
                 move_obj.unlink(cr, uid, ids2, ctx)
-                    
+
         return super(stock_picking, self).unlink(cr, uid, ids, context=context)
 
     def do_partial(self, cr, uid, ids, partial_datas, context={}):
@@ -1219,7 +1219,7 @@ class stock_move(osv.osv):
         'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
 
         'product_qty': fields.float('Quantity', required=True),
-        'product_uom': fields.many2one('product.uom', 'Product UOM', required=True),
+        'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True),
         'product_uos_qty': fields.float('Quantity (UOS)'),
         'product_uos': fields.many2one('product.uom', 'Product UOS'),
         'product_packaging': fields.many2one('product.packaging', 'Packaging', help="It specifies attributes of packaging like type, quantity of packaging,etc."),
@@ -1294,7 +1294,7 @@ class stock_move(osv.osv):
         'date_planned': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
         'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
         'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.move', context=c),
-        'date_expected': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),        
+        'date_expected': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
     }
 
     def copy(self, cr, uid, id, default=None, context={}):
@@ -1648,14 +1648,14 @@ class stock_move(osv.osv):
                         'line_id': lines,
                         'ref': ref,
                     })
-        tracking_lot = False                    
+        tracking_lot = False
         if context:
             tracking_lot = context.get('tracking_lot', False)
             if tracking_lot:
                 rec_id = context and context.get('active_id', False)
                 tracking = self.pool.get('stock.tracking')
-                tracking_lot = tracking.get_create_tracking_lot(cr, uid,[rec_id], tracking_lot)        
-                 
+                tracking_lot = tracking.get_create_tracking_lot(cr, uid,[rec_id], tracking_lot)
+
         self.write(cr, uid, ids, {'state': 'done', 'date_planned': time.strftime('%Y-%m-%d %H:%M:%S'), 'tracking_id': tracking_lot or False})
         picking_obj = self.pool.get('stock.picking')
         for pick in picking_obj.browse(cr, uid, picking_ids):
@@ -1669,7 +1669,7 @@ class stock_move(osv.osv):
 
     def unlink(self, cr, uid, ids, context=None):
         if context is None:
-            context = {}        
+            context = {}
         for move in self.browse(cr, uid, ids, context=context):
             if move.state != 'draft':
                 raise osv.except_osv(_('UserError'),
@@ -1877,7 +1877,7 @@ class stock_move(osv.osv):
         address_id = partial_datas.get('address_id', False)
         delivery_date = partial_datas.get('delivery_date', False)
         tracking_lot = context.get('tracking_lot', False)
-        
+
         new_moves = []
 
         complete, too_many, too_few = [], [], []
index 8eca737..9265350 100644 (file)
                     <field name="location_dest_id" />
                     <field name="date" />
                     <field name="date_planned" string="Date"/>
-                     <field name="date_expected" string="Date Expected"/>                    
+                     <field name="date_expected" string="Date Expected"/>
                     <field name="state"/>
                 </tree>
             </field>
                                             <field colspan="4" invisible="1" name="name"/>
                                             <field invisible="1" name="date"/>
                                             <field name="date_planned"/>
-                                             <field name="date_expected" string="Date Expected"/>                                            
+                                             <field name="date_expected" string="Date Expected"/>
                                             <field name="address_id" context="{'contact_display':'partner'}"/>
                                             <field groups="base.group_extended" name="product_packaging" domain="[('product_id','=',product_id)]"/>
                                             <field name="prodlot_id" groups="base.group_extended"
                                     <field name="location_id"/>
                                     <field name="location_dest_id"/>
                                     <field name="date_planned"/>
-                                     <field name="date_expected" string="Date Expected"/>                                    
+                                     <field name="date_expected" string="Date Expected"/>
                                     <field name="state"/>
                                     <button
                                            name="%(stock.track_line)d"
                                             <field colspan="4" invisible="1" name="name"/>
                                             <field invisible="1" name="date"/>
                                             <field name="date_planned"/>
-                                             <field name="date_expected"  string="Date Expected"/>                                            
+                                             <field name="date_expected"  string="Date Expected"/>
                                             <field groups="base.group_extended" name="product_packaging"  domain="[('product_id','=',product_id)]"/>
                                             <field name="prodlot_id" groups="base.group_extended"
                                                 context="{'location_id':location_id, 'product_id':product_id}"
                                     <field name="location_id"/>
                                     <field name="location_dest_id"/>
                                     <field name="date_planned"/>
-                                     <field name="date_expected" string="Date Expected"/>                                    
+                                     <field name="date_expected" string="Date Expected"/>
                                     <field name="state"/>
                                     <button
                                            name="%(stock.track_line)d"
                                             <field colspan="4" invisible="1" name="name"/>
                                             <field invisible="1" name="date"/>
                                             <field name="date_planned"/>
-                                             <field name="date_expected"  string="Date Expected"/>                                            
+                                             <field name="date_expected"  string="Date Expected"/>
                                             <field groups="base.group_extended" name="product_packaging" domain="[('product_id','=',product_id)]"/>
                                             <field name="prodlot_id" groups="base.group_extended"
                                                 context="{'location_id':location_id, 'product_id':product_id}"
                                             <field groups="product.group_uos" name="product_uos_qty"/>
                                             <field colspan="4" invisible="1" name="name" />
                                             <field groups="base.group_extended" name="date_planned"/>
-                                             <field name="date_expected" groups="base.group_extended" string="Date Expected"/>                                            
+                                             <field name="date_expected" groups="base.group_extended" string="Date Expected"/>
                                             <newline/>
                                             <newline/>
                                             <field groups="base.group_extended" name="product_packaging" domain="[('product_id','=',product_id)]"/>
                         <separator orientation="vertical"/>
                         <field name="name"/>
                         <field name="address_id"/>
+                        <field name="origin"/>
                         <field name="company_id" widget="selection" groups="base.group_multi_company" />
                     </group>
                     <newline/>
                         <separator orientation="vertical" />
                         <filter string="Order Date" icon="terp-stock" domain="[]"  context="{'group_by':'date'}"/>
                         <filter string="Expected Date" icon="terp-stock" domain="[]"  context="{'group_by':'min_date'}"/>
-                        <separator orientation="vertical" />
-                        <filter string="Origin" icon="terp-stock" domain="[]" context="{'group_by':'origin'}"/>
                     </group>
                 </search>
             </field>
                                 <separator string="Dates &amp; Priority" colspan="2" />
                                 <field name="date"/>
                                 <field name="date_planned"/>
-                                <field name="date_expected"/>                                
+                                <field name="date_expected"/>
                                 <field name="priority"/>
                             </group>
 
                     <notebook colspan="4">
                         <page string="General Information">
                             <separator colspan="4" string="Move Information"/>
-                            <field name="location_id"/>
-                            <field name="location_dest_id"/>
+                            <field name="location_id" widget="selection"/>
+                            <field name="location_dest_id" widget="selection"/>
                             <field colspan="4" name="product_id" on_change="onchange_product_id(product_id, location_id, location_dest_id, parent.address_id)"/>
                             <field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
-                            <field name="product_uom"/>
-                            <field name="product_uos"/>
+                            <field name="product_uom" widget="selection"/>
+                            <field name="product_uos" widget="selection" groups="base.group_extended"/>
                             <field colspan="4" name="name"/>
                             <field name="date"/>
                             <field name="company_id" groups="base.group_multi_company" widget="selection"/>
                                 on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
                             <field name="tracking_id"/>
                             <newline/>
-                            <label/>
-                            <button name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill"/>
+                            <group col="2" colspan="2">
+                                <label/>
+                                <button name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill"/>
+                            </group>
                             <separator colspan="4" string="Move State"/>
                             <field name="state"/>
                             <group col="5" colspan="2">
                     <group expand="1" string="Group By..." colspan="4" col="8">
                         <filter string="Product" icon="terp-stock" domain="[]" context="{'group_by':'product_id'}"/>
                         <filter string="State" icon="terp-stock" domain="[]" context="{'group_by':'state'}"/>
-                        <filter string="Date" icon="terp-stock" domain="[]" context="{'group_by':'date'}"/>
+                        <separator orientation="vertical"/>
+                        <filter string="Order Date" icon="terp-stock" domain="[]" context="{'group_by':'date'}"/>
+                        <filter string="Expected Date" icon="terp-stock" domain="[]" context="{'group_by':'date_expected'}" />
                     </group>
                 </search>
             </field>
index b1b1401..ac8e951 100644 (file)
@@ -3,6 +3,7 @@
 #
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -640,10 +641,17 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
 
     def load_test(cr, module_name, id_map, mode):
         cr.commit()
-        try:
-            _load_data(cr, module_name, id_map, mode, 'test')
-        finally:
-            cr.rollback()
+        if not tools.config.options['test-disable']:
+            try:
+                _load_data(cr, module_name, id_map, mode, 'test')
+            except Exception, e:
+                logger.notifyChannel('ERROR', netsvc.LOG_TEST, e)
+                pass
+            finally:
+                if tools.config.options['test-commit']:
+                    cr.commit()
+                else:
+                    cr.rollback()
 
     def _load_data(cr, module_name, id_map, mode, kind):
         noupdate = (kind == 'demo')
@@ -709,14 +717,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
             for kind in ('init', 'update'):
                 if package.state=='to upgrade':
                     # upgrading the module information
-                    modobj.write(cr, 1, [mid], {
-                    'description': package.data.get('description', ''),
-                    'shortdesc': package.data.get('name', ''),
-                    'author': package.data.get('author', 'Unknown'),
-                    'website': package.data.get('website', ''),
-                    'license': package.data.get('license', 'GPL-2'),
-                    'certificate': package.data.get('certificate') or None,
-                    })
+                    modobj.write(cr, 1, [mid], modobj.get_values_from_terp(package.data))
                 load_init_update_xml(cr, m, idref, mode, kind)
             load_data(cr, m, idref, mode)
             if hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed'):
@@ -757,6 +758,15 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
     return has_updates
 
 def load_modules(db, force_demo=False, status=None, update_module=False):
+
+    def check_module_name(cr, mods, state):
+        for mod in mods:
+            id = modobj.search(cr, 1, ['&', ('state', '=', state), ('name', '=', mod)])
+            if id:
+                getattr(modobj, states[state])(cr, 1, id)
+            elif mod != 'all':
+                logger.notifyChannel('init', netsvc.LOG_WARNING, 'module %s: invalid module name!' % (mod))
+
     if not status:
         status = {}
     cr = db.cursor()
@@ -787,21 +797,16 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
             return
         if update_module:
             modobj = pool.get('ir.module.module')
+            states = {'installed': 'button_upgrade', 'uninstalled': 'button_install'}
             logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list')
             if ('base' in tools.config['init']) or ('base' in tools.config['update']):
                 modobj.update_list(cr, 1)
 
             mods = [k for k in tools.config['init'] if tools.config['init'][k]]
-            if mods:
-                ids = modobj.search(cr, 1, ['&', ('state', '=', 'uninstalled'), ('name', 'in', mods)])
-                if ids:
-                    modobj.button_install(cr, 1, ids)
+            check_module_name(cr, mods, 'uninstalled')
 
             mods = [k for k in tools.config['update'] if tools.config['update'][k]]
-            if mods:
-                ids = modobj.search(cr, 1, ['&', ('state', '=', 'installed'), ('name', 'in', mods)])
-                if ids:
-                    modobj.button_upgrade(cr, 1, ids)
+            check_module_name(cr, mods, 'installed')
 
             cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base'))
 
diff --git a/bin/addons/base/__openerp__.py b/bin/addons/base/__openerp__.py
new file mode 100644 (file)
index 0000000..2308ecf
--- /dev/null
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+    'name': 'Base',
+    'version': '1.2',
+    'category': 'Generic Modules/Base',
+    'description': """The kernel of OpenERP, needed for all installation.""",
+    'author': 'OpenERP s.a.',
+    'maintainer': 'OpenERP s.a.',
+    'website': 'http://www.openerp.com',
+    'depends': [],
+    'init_xml': [
+        'base_data.xml',
+        'security/base_security.xml',
+        'base_menu.xml',
+        'res/res_security.xml',
+        'res/res_config.xml',
+        'maintenance/maintenance_security.xml',
+        'data/res.country.state.csv'
+    ],
+    'update_xml': [
+        'base_update.xml',
+        'ir/wizard/wizard_menu_view.xml',
+        'ir/ir.xml',
+        'ir/workflow/workflow_view.xml',
+        'module/module_wizard.xml',
+        'module/module_view.xml',
+        'module/module_web_view.xml',
+        'module/module_data.xml',
+        'module/module_report.xml',
+        'res/res_request_view.xml',
+        'res/res_lang_view.xml',
+        'res/res_log_view.xml',
+        'res/res_company_view.xml',
+        'res/partner/partner_report.xml',
+        'res/partner/partner_view.xml',
+        'res/partner/partner_wizard.xml',
+        'res/bank_view.xml',
+        'res/country_view.xml',
+        'res/res_currency_view.xml',
+        'res/partner/crm_view.xml',
+        'res/partner/wizard/partner_sms_send_view.xml',
+        'res/partner/partner_data.xml',
+        'res/ir_property_view.xml',
+        'security/base_security.xml',
+        'maintenance/maintenance_view.xml',
+        'security/ir.model.access.csv'
+
+    ],
+    'demo_xml': [
+        'base_demo.xml',
+        'res/partner/partner_demo.xml',
+        'res/partner/crm_demo.xml',
+    ],
+    'test': [
+        'test/base_test.xml',
+        'test/test_context.xml',
+        'bug_lp541545.xml',
+    ],
+    'installable': True,
+    'active': True,
+    'certificate': '0076807797149',
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/bin/addons/base/__terp__.py b/bin/addons/base/__terp__.py
deleted file mode 100644 (file)
index 3f50b31..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU Affero General Public License as
-#    published by the Free Software Foundation, either version 3 of the
-#    License, or (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU Affero General Public License for more details.
-#
-#    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-
-{
-    'name': 'Base',
-    'version': '1.1',
-    'category': 'Generic Modules/Base',
-    'description': """The kernel of OpenERP, needed for all installation.""",
-    'author': 'Tiny',
-    'website': 'http://www.openerp.com',
-    'depends': [],
-    'init_xml': [
-        'base_data.xml',
-        'security/base_security.xml',
-        'base_menu.xml',
-        'res/res_security.xml',
-        'res/res_config.xml',
-        'maintenance/maintenance_security.xml',
-        'data/res.country.state.csv'
-    ],
-    'update_xml': [
-        'base_update.xml',
-        'ir/wizard/wizard_menu_view.xml',
-        'ir/ir.xml',
-        'ir/workflow/workflow_view.xml',
-        'module/module_wizard.xml',
-        'module/module_view.xml',
-        'module/module_web_view.xml',
-        'module/module_data.xml',
-        'module/module_report.xml',
-        'res/res_request_view.xml',
-        'res/res_lang_view.xml',
-        'res/res_company_view.xml',
-        'res/partner/partner_report.xml',
-        'res/partner/partner_view.xml',
-        'res/partner/partner_wizard.xml',
-        'res/bank_view.xml',
-        'res/country_view.xml',
-        'res/res_currency_view.xml',
-        'res/partner/crm_view.xml',
-        'res/partner/partner_data.xml',
-        'res/ir_property_view.xml',
-        'security/base_security.xml',
-        'maintenance/maintenance_view.xml',
-        'security/ir.model.access.csv'
-
-    ],
-    'demo_xml': ['base_demo.xml', 'res/partner/partner_demo.xml', 'res/partner/crm_demo.xml','test/base_test.xml'],
-    'installable': True,
-    'active': True,
-    'certificate': '0076807797149',
-}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 411a405..3bc6e4d 100644 (file)
             <test expr="currency_id.code == 'eur'.upper()"/>
             <test expr="name">OpenERP S.A.</test>
         </assert>
-        <record id="user_admin" model="res.users">
+
+        <record model="res.users" id="base.user_root">
+            <field name="signature">Administrator</field>
+            <field name="address_id" ref="main_address"/>
             <field name="company_id" ref="main_company"/>
+            <field name="company_ids" eval="[(4, ref('main_company'))]"/>
+            <field name="action_id" ref="action_menu_admin"/>
+            <field name="menu_id" ref="action_menu_admin"/>
         </record>
+
         <record id="main_partner" model="res.partner">
             <field name="company_id" ref="main_company"/>
         </record>
             <field name="currency_id" ref="INR"/>
             <field eval="time.strftime('%Y-01-01')" name="name"/>
         </record>
-        
+
+        <record id="rateINR2001" model="res.currency.rate">
+            <field name="rate">0.631</field>
+            <field name="currency_id" ref="INR"/>
+            <field name="name">2001-01-01</field>
+        </record>
+        <record id="rateINR2002" model="res.currency.rate">
+            <field name="rate">0.632</field>
+            <field name="currency_id" ref="INR"/>
+            <field name="name">2002-01-01</field>
+        </record>
+
         <record id="AUD" model="res.currency">
             <field name="name">AUD</field>
             <field name="code">AUD</field>
index 17952ea..04d07ef 100644 (file)
@@ -78,7 +78,7 @@
                 <form string="Users">
                     <notebook colspan="4">
                         <page string="Current Activity">
-                            <field name="company_id" widget="selection" readonly="0" context="{'user_prefence':True}"/>
+                            <field name="company_id" widget="selection" readonly="0" context="{'user_preference':True}"/>
                             <newline/>
                             <separator colspan="4" string="Preferences"/>
                         </page>
@@ -87,6 +87,7 @@
                             <label colspan="4" string="Please note that you will have to logout and relog if you change your password."/>
                             <field name="context_lang" completion="1" readonly="0"/>
                             <field name="context_tz" completion="1" readonly="0" colspan="4"/>
+                            <field name="view" colspan="4" readonly="0" />
                             <newline/>
                             <field colspan="4" name="signature" readonly="0"/>
                           </page>
                     <notebook colspan="4">
                         <page string="User">
                             <field name="address_id" select="1"/>
+                            <field name="user_email" widget="email"/>
                             <field name="company_id" required="1"/>
                             <field name="action_id" required="True"/>
                             <field domain="[('usage','=','menu')]" name="menu_id" required="True"/>
                             <field name="context_lang"/>
                             <field name="context_tz"/>
+                            <field name="view" readonly="0" />
                             <group colspan="2" col="2">
                                 <separator string="Signature" colspan="2"/>
                                 <field colspan="2" name="signature" nolabel="1"/>
                             </group>
-                            <group colspan="2" col="2">
+                            <group colspan="2" col="2" expand="1">
                                 <separator string="Access Rights (groups)" colspan="2"/>
                                 <field colspan="2" nolabel="1" name="groups_id"/>
                             </group>
                 <tree string="Users">
                     <field name="name"/>
                     <field name="login"/>
+                    <field name="address_id" string="Address" />
                     <field name="company_id"/>
                 </tree>
             </field>
                 <search string="Users">
                     <field name="name" select="1"/>
                     <field name="login" select="1"/>
-                    <field name="address_id" select="1" string="Partner"/>
+                    <field name="address_id" select="1" string="Address"/>
                     <field name="company_ids" select="1" string="Company"/>
                 </search>
             </field>
             <field name="arch" type="xml">
               <data>
                 <form position="attributes">
-                  <attribute name="string">Select your Interface</attribute>
+                  <attribute name="string">Choose Your Interface</attribute>
                 </form>
-
-                <group string="res_config_contents" position="replace">
-                  <label colspan="4" align="0.0" string="Choose between the simplified interface and the extended one."/>
-                  <newline/>
-                  <label colspan="4" align="0.0" string="If you are testing OpenERP or using it for the first time, we suggest you use the simplified interface. It has less options and fields but is easier to understand."/>
-                  <newline/>
-                  <label colspan="4" align="0.0" string="You will be able to switch to the extended interface later."/>
-                  <separator string="Choose Your Interface" colspan="4"/>
-                  <field colspan="2" name="view" nolabel="1"/>
-                </group>
+                               <xpath expr="//label[@string='description']"
+                        position="attributes">
+                   <attribute name="string">Choose between the simplified interface and the extended one. We suggest you use the simplified interface. It has less options and fields but is easier to understand. You will be able to switch to the extended interface later.</attribute>
+                 </xpath>
+                 <xpath expr='//separator[@string="title"]' position='attributes'>
+                         <attribute name='string'>Choose Your Interface</attribute>
+                 </xpath>
+                 <xpath expr='//separator[@string="vsep"]' position='attributes'>
+                         <attribute name='string'></attribute>
+                         <attribute name='rowspan'>12</attribute>
+                     </xpath>
+               <group string="res_config_contents" position="replace">
+                       <group colspan="4">
+                               <field colspan="4" name="view" nolabel="1"/>
+                                       </group>
+               </group>
                 <xpath expr='//button[@name="action_skip"]' position='replace'/>
                 <xpath expr='//button[@name="action_next"]' position='attributes'>
                   <attribute name='string'>Set</attribute>
             <field name="action_id" ref="action_config_simple_view_form"/>
             <field name="sequence">1</field>
         </record>
-
     </data>
 </openerp>
index bdcb745..d6b902e 100644 (file)
@@ -1,52 +1,52 @@
-"country_id:id","name","code"
-us,"Alabama","AL"
-us,"Alaska","AK"
-us,"Arizona","AZ"
-us,"Arkansas","AR"
-us,"California","CA"
-us,"Colorado","CO"
-us,"Connecticut","CT"
-us,"Delaware","DE"
-us,"District of Columbia","DC"
-us,"Florida","FL"
-us,"Georgia","GA"
-us,"Hawaii","HI"
-us,"Idaho","ID"
-us,"Illinois","IL"
-us,"Indiana","IN"
-us,"Iowa","IA"
-us,"Kansas","KS"
-us,"Kentucky","KY"
-us,"Louisiana","LA"
-us,"Maine","ME"
-us,"Montana","MT"
-us,"Nebraska","NE"
-us,"Nevada","NV"
-us,"New Hampshire","NH"
-us,"New Jersey","NJ"
-us,"New Mexico","NM"
-us,"New York","NY"
-us,"North Carolina","NC"
-us,"North Dakota","ND"
-us,"Ohio","OH"
-us,"Oklahoma","OK"
-us,"Oregon","OR"
-us,"Maryland","MD"
-us,"Massachusetts","MA"
-us,"Michigan","MI"
-us,"Minnesota","MN"
-us,"Mississippi","MS"
-us,"Missouri","MO"
-us,"Pennsylvania","PA"
-us,"Rhode Island","RI"
-us,"South Carolina","SC"
-us,"South Dakota","SD"
-us,"Tennessee","TN"
-us,"Texas","TX"
-us,"Utah","UT"
-us,"Vermont","VT"
-us,"Virginia","VA"
-us,"Washington","WA"
-us,"West Virginia","WV"
-us,"Wisconsin","WI"
-us,"Wyoming","WY"
+"id","country_id:id","name","code"
+state_us_1,us,"Alabama","AL"
+state_us_2,us,"Alaska","AK"
+state_us_3,us,"Arizona","AZ"
+state_us_4,us,"Arkansas","AR"
+state_us_5,us,"California","CA"
+state_us_6,us,"Colorado","CO"
+state_us_7,us,"Connecticut","CT"
+state_us_8,us,"Delaware","DE"
+state_us_9,us,"District of Columbia","DC"
+state_us_10,us,"Florida","FL"
+state_us_11,us,"Georgia","GA"
+state_us_12,us,"Hawaii","HI"
+state_us_13,us,"Idaho","ID"
+state_us_14,us,"Illinois","IL"
+state_us_15,us,"Indiana","IN"
+state_us_16,us,"Iowa","IA"
+state_us_17,us,"Kansas","KS"
+state_us_18,us,"Kentucky","KY"
+state_us_19,us,"Louisiana","LA"
+state_us_20,us,"Maine","ME"
+state_us_21,us,"Montana","MT"
+state_us_22,us,"Nebraska","NE"
+state_us_23,us,"Nevada","NV"
+state_us_24,us,"New Hampshire","NH"
+state_us_25,us,"New Jersey","NJ"
+state_us_26,us,"New Mexico","NM"
+state_us_27,us,"New York","NY"
+state_us_28,us,"North Carolina","NC"
+state_us_29,us,"North Dakota","ND"
+state_us_30,us,"Ohio","OH"
+state_us_31,us,"Oklahoma","OK"
+state_us_32,us,"Oregon","OR"
+state_us_33,us,"Maryland","MD"
+state_us_34,us,"Massachusetts","MA"
+state_us_35,us,"Michigan","MI"
+state_us_36,us,"Minnesota","MN"
+state_us_37,us,"Mississippi","MS"
+state_us_38,us,"Missouri","MO"
+state_us_39,us,"Pennsylvania","PA"
+state_us_40,us,"Rhode Island","RI"
+state_us_41,us,"South Carolina","SC"
+state_us_42,us,"South Dakota","SD"
+state_us_43,us,"Tennessee","TN"
+state_us_44,us,"Texas","TX"
+state_us_45,us,"Utah","UT"
+state_us_46,us,"Vermont","VT"
+state_us_47,us,"Virginia","VA"
+state_us_48,us,"Washington","WA"
+state_us_49,us,"West Virginia","WV"
+state_us_50,us,"Wisconsin","WI"
+state_us_51,us,"Wyoming","WY"
index 62308b5..a582e65 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 5408d6d..5606cb1 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 53fb7ae..3fe3225 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-21 04:53+0000\n"
-"Last-Translator: OpenERP Administrators <Unknown>\n"
+"PO-Revision-Date: 2010-05-17 05:31+0000\n"
+"Last-Translator: Boris <boris.t.ivanov@gmail.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-22 03:42+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -83,7 +83,7 @@ msgstr "Създадени изгледи"
 #. module: base
 #: view:workflow.activity:0
 msgid "Outgoing transitions"
-msgstr "Изходящи промени"
+msgstr "Изходящи преходи"
 
 #. module: base
 #: selection:ir.report.custom,frequency:0
@@ -1754,7 +1754,7 @@ msgstr "XSL"
 #: code:addons/base/module/module.py:0
 #, python-format
 msgid "Can not upgrade module '%s'. It is not installed."
-msgstr "Не може да бъде обновен модул '%s'. Той не е инсталиран."
+msgstr "Модул '%s' не може да бъде обновен. Той не е инсталиран."
 
 #. module: base
 #: model:res.country,name:base.cu
@@ -2039,7 +2039,7 @@ msgstr "Извличане на език"
 #. module: base
 #: selection:maintenance.contract.wizard,state:0
 msgid "Unvalidated"
-msgstr "Непроверен"
+msgstr "Невалидирано"
 
 #. module: base
 #: model:ir.ui.menu,name:base.next_id_9
@@ -2066,7 +2066,7 @@ msgstr "Също така може да вмъкнете \".po\" файлове.
 #: code:addons/base/maintenance/maintenance.py:0
 #, python-format
 msgid "Unable to find a valid contract"
-msgstr "Не може да се намери валиден договор"
+msgstr "Не е намерeн валиден договор"
 
 #. module: base
 #: code:addons/base/ir/ir_actions.py:0
@@ -5002,7 +5002,7 @@ msgstr "Python код"
 #: code:addons/base/module/wizard/wizard_module_import.py:0
 #, python-format
 msgid "Can not create the module file: %s !"
-msgstr "Модулния файл: %s, не можеда да бъде създаден  !"
+msgstr "Модулния файл: %s, не можеда да бъде създаден !"
 
 #. module: base
 #: model:ir.module.module,description:base.module_meta_information
@@ -5028,7 +5028,7 @@ msgstr "Откажи"
 #: code:addons/base/ir/ir_actions.py:0
 #, python-format
 msgid "Please specify server option --smtp-from !"
-msgstr "Моля укажете опцията на сървъра --smtp-from !"
+msgstr "Моля укажете опция на сървъра --smtp-from !"
 
 #. module: base
 #: selection:wizard.module.lang.export,format:0
@@ -6225,7 +6225,7 @@ msgstr "Извличане на файл с превод"
 #. module: base
 #: field:ir.ui.view_sc,user_id:0
 msgid "User Ref."
-msgstr "Справка за потребител"
+msgstr "Потребителска справка"
 
 #. module: base
 #: model:ir.ui.menu,name:base.menu_base_config
@@ -6812,7 +6812,7 @@ msgstr "RML съдържание"
 #. module: base
 #: view:workflow.activity:0
 msgid "Incoming transitions"
-msgstr "Входящи промени"
+msgstr "Входящи преходи"
 
 #. module: base
 #: model:res.country,name:base.cn
@@ -7277,7 +7277,7 @@ msgstr "Оригинал"
 #. module: base
 #: help:res.partner.address,partner_id:0
 msgid "Keep empty for a private address, not related to partner."
-msgstr "Оставете празно за личен адрес несвързан с партньора"
+msgstr "Оставете празно за личен адрес нямащ отношение към партньора."
 
 #. module: base
 #: model:res.country,name:base.vu
@@ -7296,8 +7296,8 @@ msgid ""
 "Save this document to a .tgz file. This archive containt UTF-8 %s files and "
 "may be uploaded to launchpad."
 msgstr ""
-"Запази документа като .tgz файл. Този архив съдържа %s UTF-8 файлове и може "
-"да бъде качен в launchpad."
+"Запазете документа като .tgz файл. Този архив съдържа %s UTF-8 файлове и "
+"може да бъде качен в launchpad."
 
 #. module: base
 #: wizard_button:module.upgrade,end,config:0
@@ -7728,7 +7728,7 @@ msgid ""
 "invoice, then `object.invoice_address_id.mobile` is the field which gives "
 "the correct mobile number"
 msgstr ""
-"Оказва полетата които ще се използват за доставяне на мобилен номер, напр., "
+"Указва полетата които ще се използват за доставяне на мобилен номер, напр., "
 "когато изберете фактура, тогава 'object.invoice_address_id.mobile' е полето "
 "което дава правилния мобилен номер"
 
@@ -8080,7 +8080,7 @@ msgstr "полски / Język polski"
 #. module: base
 #: field:ir.exports,name:0
 msgid "Export Name"
-msgstr "Име на извлечането"
+msgstr "Име на изнасянето"
 
 #. module: base
 #: help:res.partner.address,type:0
index 97ab6b5..c5297c4 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index e64daf5..014c691 100644 (file)
@@ -7,14 +7,14 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-02-07 05:09+0000\n"
-"Last-Translator: Jordi Esteve - http://www.zikzakmedia.com "
+"PO-Revision-Date: 2010-05-02 05:54+0000\n"
+"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
 "<jesteve@zikzakmedia.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -109,7 +109,7 @@ msgid ""
 msgstr ""
 "Escolliu entre la \"Interfície simplificada\" o \"Interfície estesa\".\n"
 "Si esteu examinant o utilitzant OpenERP per la primera vegada,\n"
-"us suggerim per utilitzar la interfície simplificada, que té menys\n"
+"us suggerim que utilitzeu la interfície simplificada, que té menys\n"
 "opcions i camps però és més fàcil d'entendre. Més tard podreu\n"
 "canviar a la vista estesa.\n"
 "            "
@@ -388,8 +388,8 @@ msgid ""
 "If you check this, then the second time the user prints with same attachment "
 "name, it returns the previous report."
 msgstr ""
-"Si marca aquesta opció, quan l'usuari imprimeixi el mateix nom d'adjunt per "
-"segona vegada, tornarà l'informe anterior."
+"Si marqueu aquesta opció, quan l'usuari imprimeixi el mateix nom d'adjunt "
+"per segona vegada, obtindrá l'informe anterior."
 
 #. module: base
 #: help:res.lang,iso_code:0
@@ -433,7 +433,7 @@ msgid ""
 "The ISO country code in two chars.\n"
 "You can use this field for quick search."
 msgstr ""
-"EL codi ISO del país en dos caràcters.\n"
+"EL codi ISO del país de dos caràcters.\n"
 "Podeu utilitzar aquest camp per la cerca ràpida."
 
 #. module: base
@@ -474,7 +474,7 @@ msgstr "Interfície estesa"
 #: code:addons/base/ir/ir_model.py:0
 #, python-format
 msgid "Custom fields must have a name that starts with 'x_' !"
-msgstr "Els camps personalitzats han de tenir un nom que comença con 'x_'!"
+msgstr "Els camps personalitzats han de tenir un nom que comenci amb 'x_'!"
 
 #. module: base
 #: help:ir.actions.server,action_id:0
@@ -913,7 +913,7 @@ msgstr "STOCK_MISSING_IMAGE"
 #. module: base
 #: view:res.users:0
 msgid "Define New Users"
-msgstr "Defineix nous usuaris"
+msgstr "Definiu nous usuaris"
 
 #. module: base
 #: selection:ir.ui.menu,icon:0
@@ -1489,7 +1489,7 @@ msgstr "Menú"
 #. module: base
 #: field:res.currency,rate:0
 msgid "Current Rate"
-msgstr "Tasa"
+msgstr "Taxa"
 
 #. module: base
 #: selection:module.lang.install,init,lang:0
@@ -3124,7 +3124,7 @@ msgid ""
 "any."
 msgstr ""
 "L'usuari intern que s'encarrega de comunicar-se amb aquesta empresa, si "
-"n'hi ha."
+"n'hi hagués."
 
 #. module: base
 #: field:res.partner,parent_id:0
@@ -5073,8 +5073,8 @@ msgstr "Islàndia"
 #: view:res.users:0
 msgid "Roles are used to defined available actions, provided by workflows."
 msgstr ""
-"Els rols s'utilitzen per definir les accions disponibles, de les que "
-"proveeixen els fluxos."
+"Els rols s'utilitzen per definir les accions disponibles dins d'un flux de "
+"treball."
 
 #. module: base
 #: model:res.country,name:base.de
@@ -5437,7 +5437,7 @@ msgstr "Dia de l'any: %(doy)s"
 #. module: base
 #: model:res.country,name:base.nt
 msgid "Neutral Zone"
-msgstr "Zona Neutral"
+msgstr "Zona neutral"
 
 #. module: base
 #: view:ir.model:0
@@ -5828,7 +5828,7 @@ msgstr "Companyia per defecte per objecte"
 #. module: base
 #: view:ir.actions.configuration.wizard:0
 msgid "Next Configuration Step"
-msgstr "Següent pas configuració"
+msgstr "Següent pas de la configuració"
 
 #. module: base
 #: field:res.groups,comment:0
@@ -6645,8 +6645,8 @@ msgid ""
 "Access all the fields related to the current object using expression in "
 "double brackets, i.e. [[ object.partner_id.name ]]"
 msgstr ""
-"Accedeix a tots els camps relacionats amb l'objecte actual mitjançant una "
-"expressió en claudàtors dobles, per exemple [[ object.partner_id.name ]]"
+"Podeu accedir a tots els camps relacionats amb l'objecte actual mitjançant "
+"una expressió en claudàtors dobles, per exemple [[ object.partner_id.name ]]"
 
 #. module: base
 #: field:res.request.history,body:0
@@ -8088,7 +8088,7 @@ msgstr ""
 #. module: base
 #: wizard_view:module.lang.install,init:0
 msgid "Choose a language to install:"
-msgstr "Selecciona un idioma per instal·lar:"
+msgstr "Seleccioneu un idioma a instal·lar:"
 
 #. module: base
 #: model:res.country,name:base.lk
index 3e891f2..080f51b 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 92fd677..73d2ab0 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 61db443..7738b9f 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 0650344..d811aee 100644 (file)
@@ -12,7 +12,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 "X-Poedit-Country: GREECE\n"
 "X-Poedit-Language: Greek\n"
diff --git a/bin/addons/base/i18n/en_GB.po b/bin/addons/base/i18n/en_GB.po
new file mode 100644 (file)
index 0000000..c3001b3
--- /dev/null
@@ -0,0 +1,7983 @@
+# English (United Kingdom) translation for openobject-server
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the openobject-server package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-server\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2009-12-18 08:39+0000\n"
+"PO-Revision-Date: 2010-05-31 04:09+0000\n"
+"Last-Translator: Sharoon Thomas http://openlabs.co.in "
+"<sharoonthomas@teagarden.in>\n"
+"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#. module: base
+#: model:res.country,name:base.sh
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#. module: base
+#: wizard_view:res.partner.sms_send,init:0
+msgid "SMS - Gateway: clickatell"
+msgstr "SMS - Gateway: clickatell"
+
+#. module: base
+#: view:res.lang:0
+msgid "%j - Day of the year as a decimal number [001,366]."
+msgstr "%j - Day of the year as a decimal number [001,366]."
+
+#. module: base
+#: field:ir.values,meta_unpickle:0
+msgid "Metadata"
+msgstr "Metadata"
+
+#. module: base
+#: field:ir.ui.view,arch:0
+#: field:ir.ui.view.custom,arch:0
+msgid "View Architecture"
+msgstr "View Architecture"
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "You can not create this kind of document! (%s)"
+msgstr "You can not create this kind of document! (%s)"
+
+#. module: base
+#: wizard_field:module.lang.import,init,code:0
+msgid "Code (eg:en__US)"
+msgstr "Code (eg:en__US)"
+
+#. module: base
+#: view:workflow:0
+#: field:workflow.activity,wkf_id:0
+#: field:workflow.instance,wkf_id:0
+msgid "Workflow"
+msgstr "Workflow"
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "To browse official translations, you can visit this link: "
+msgstr "To browse official translations, you can visit this link: "
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Hungarian / Magyar"
+msgstr "Hungarian / Magyar"
+
+#. module: base
+#: field:ir.actions.server,wkf_model_id:0
+msgid "Workflow On"
+msgstr "Workflow On"
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Created Views"
+msgstr "Created Views"
+
+#. module: base
+#: view:workflow.activity:0
+msgid "Outgoing transitions"
+msgstr "Outgoing transitions"
+
+#. module: base
+#: selection:ir.report.custom,frequency:0
+msgid "Yearly"
+msgstr "Yearly"
+
+#. module: base
+#: field:ir.actions.act_window,target:0
+msgid "Target Window"
+msgstr "Target Window"
+
+#. module: base
+#: model:ir.actions.todo,note:base.config_wizard_simple_view
+msgid ""
+"Choose between the \"Simplified Interface\" or the extended one.\n"
+"If you are testing or using OpenERP for the first time, we suggest you to "
+"use\n"
+"the simplified interface, which has less options and fields but is easier "
+"to\n"
+"understand. You will be able to switch to the extended view later.\n"
+"            "
+msgstr ""
+"Choose between the \"Simplified Interface\" or the extended one.\n"
+"If you are testing or using OpenERP for the first time, we suggest you to "
+"use\n"
+"the simplified interface, which has less options and fields but is easier "
+"to\n"
+"understand. You will be able to switch to the extended view later.\n"
+"            "
+
+#. module: base
+#: field:ir.rule,operand:0
+msgid "Operand"
+msgstr "Operand"
+
+#. module: base
+#: model:res.country,name:base.kr
+msgid "South Korea"
+msgstr "South Korea"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_workflow_transition_form
+#: model:ir.ui.menu,name:base.menu_workflow_transition
+#: view:workflow.activity:0
+msgid "Transitions"
+msgstr "Transitions"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_ui_view_custom
+msgid "ir.ui.view.custom"
+msgstr "ir.ui.view.custom"
+
+#. module: base
+#: model:res.country,name:base.sz
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_report_custom
+#: selection:ir.ui.menu,action:0
+msgid "ir.actions.report.custom"
+msgstr "ir.actions.report.custom"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CANCEL"
+msgstr "STOCK_CANCEL"
+
+#. module: base
+#: field:ir.report.custom,sortby:0
+msgid "Sorted By"
+msgstr "Sorted By"
+
+#. module: base
+#: field:ir.sequence,number_increment:0
+msgid "Increment Number"
+msgstr "Increment Number"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_res_company_tree
+#: model:ir.ui.menu,name:base.menu_action_res_company_tree
+msgid "Company's Structure"
+msgstr "Company's Structure"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_report_custom_fields
+msgid "ir.report.custom.fields"
+msgstr "ir.report.custom.fields"
+
+#. module: base
+#: view:res.partner:0
+msgid "Search Partner"
+msgstr "Search Partner"
+
+#. module: base
+#: code:addons/base/module/wizard/wizard_export_lang.py:0
+#, python-format
+msgid "new"
+msgstr "new"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GOTO_TOP"
+msgstr "STOCK_GOTO_TOP"
+
+#. module: base
+#: field:ir.actions.report.custom,multi:0
+#: field:ir.actions.report.xml,multi:0
+msgid "On multiple doc."
+msgstr "On multiple doc."
+
+#. module: base
+#: field:ir.module.category,module_nr:0
+msgid "Number of Modules"
+msgstr "Number of Modules"
+
+#. module: base
+#: field:res.partner.bank.type.field,size:0
+msgid "Max. Size"
+msgstr "Max. Size"
+
+#. module: base
+#: field:res.partner.address,name:0
+msgid "Contact Name"
+msgstr "Contact Name"
+
+#. module: base
+#: code:addons/base/module/wizard/wizard_export_lang.py:0
+#, python-format
+msgid ""
+"Save this document to a %s file and edit it with a specific software or a "
+"text editor. The file encoding is UTF-8."
+msgstr ""
+"Save this document to a %s file and edit it with a specific software or a "
+"text editor. The file encoding is UTF-8."
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DELETE"
+msgstr "STOCK_DELETE"
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "Password mismatch !"
+msgstr "Passwords do not match !"
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid "This url '%s' must provide an html file with links to zip modules"
+msgstr ""
+"This url '%s' must provide an html file with the links to zip modules"
+
+#. module: base
+#: selection:res.request,state:0
+msgid "active"
+msgstr "active"
+
+#. module: base
+#: field:ir.actions.wizard,wiz_name:0
+msgid "Wizard Name"
+msgstr "Wizard Name"
+
+#. module: base
+#: view:res.lang:0
+msgid "%y - Year without century as a decimal number [00,99]."
+msgstr "%y - Year without century as a decimal number [00,99]."
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GOTO_FIRST"
+msgstr "STOCK_GOTO_FIRST"
+
+#. module: base
+#: help:ir.rule.group,rules:0
+msgid "The rule is satisfied if at least one test is True"
+msgstr "The rule is satisfied if at least one test is True"
+
+#. module: base
+#: selection:ir.report.custom.fields,operation:0
+msgid "Get Max"
+msgstr "Get Max"
+
+#. module: base
+#: help:ir.actions.act_window,limit:0
+msgid "Default limit for the list view"
+msgstr "Default limit for the list view"
+
+#. module: base
+#: field:ir.model.data,date_update:0
+msgid "Update Date"
+msgstr "Update Date"
+
+#. module: base
+#: field:ir.actions.act_window,src_model:0
+msgid "Source Object"
+msgstr "Source Object"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.act_ir_actions_todo_form
+#: view:ir.actions.todo:0
+#: model:ir.ui.menu,name:base.menu_ir_actions_todo_form
+msgid "Config Wizard Steps"
+msgstr "Configuration Wizard Steps"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_ui_view_sc
+msgid "ir.ui.view_sc"
+msgstr "ir.ui.view_sc"
+
+#. module: base
+#: field:ir.model.access,group_id:0
+#: field:ir.rule,rule_group:0
+msgid "Group"
+msgstr "Group"
+
+#. module: base
+#: field:ir.exports.line,name:0
+#: field:ir.translation,name:0
+#: field:res.partner.bank.type.field,name:0
+msgid "Field Name"
+msgstr "Field Name"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.open_module_tree_uninstall
+#: model:ir.ui.menu,name:base.menu_module_tree_uninstall
+msgid "Uninstalled modules"
+msgstr "Uninstalled modules"
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "txt"
+msgstr "txt"
+
+#. module: base
+#: wizard_view:server.action.create,init:0
+#: wizard_field:server.action.create,init,type:0
+msgid "Select Action Type"
+msgstr "Select Action Type"
+
+#. module: base
+#: selection:ir.actions.todo,type:0
+msgid "Configure"
+msgstr "Configure"
+
+#. module: base
+#: model:res.country,name:base.tv
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#. module: base
+#: selection:ir.model,state:0
+#: selection:ir.model.grid,state:0
+msgid "Custom Object"
+msgstr "Custom Object"
+
+#. module: base
+#: field:res.lang,date_format:0
+msgid "Date Format"
+msgstr "Date Format"
+
+#. module: base
+#: field:res.bank,email:0
+#: field:res.partner.address,email:0
+msgid "E-Mail"
+msgstr "e-Mail"
+
+#. module: base
+#: model:res.country,name:base.an
+msgid "Netherlands Antilles"
+msgstr "Netherlands Antilles"
+
+#. module: base
+#: code:addons/base/res/res_user.py:0
+#, python-format
+msgid ""
+"You can not remove the admin user as it is used internally for resources "
+"created by OpenERP (updates, module installation, ...)"
+msgstr ""
+"You can not remove the user 'admin' as it is used internally for resources "
+"created by OpenERP (updates, module installation etc)"
+
+#. module: base
+#: model:res.country,name:base.gf
+msgid "French Guyana"
+msgstr "French Guyana"
+
+#. module: base
+#: field:ir.ui.view.custom,ref_id:0
+msgid "Original View"
+msgstr "Original View"
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Bosnian / bosanski jezik"
+msgstr "Bosnian / bosanski jezik"
+
+#. module: base
+#: help:ir.actions.report.xml,attachment_use:0
+msgid ""
+"If you check this, then the second time the user prints with same attachment "
+"name, it returns the previous report."
+msgstr "On checking this successive reports are generated from cache."
+
+#. module: base
+#: help:res.lang,iso_code:0
+msgid "This ISO code is the name of po files to use for translations"
+msgstr "PO files must use this ISO code for transalations"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_REWIND"
+msgstr "STOCK_MEDIA_REWIND"
+
+#. module: base
+#: field:ir.actions.todo,note:0
+msgid "Text"
+msgstr "Text"
+
+#. module: base
+#: field:res.country,name:0
+msgid "Country Name"
+msgstr "Country Name"
+
+#. module: base
+#: model:res.country,name:base.coreturn
+msgid "Colombia"
+msgstr "Colombia"
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Schedule Upgrade"
+msgstr "Schedule Upgrade"
+
+#. module: base
+#: field:ir.actions.report.custom,report_id:0
+msgid "Report Ref."
+msgstr "Report Ref."
+
+#. module: base
+#: help:res.country,code:0
+msgid ""
+"The ISO country code in two chars.\n"
+"You can use this field for quick search."
+msgstr ""
+"The ISO country code in two chars.\n"
+"You can use this field for quick search."
+
+#. module: base
+#: selection:workflow.activity,join_mode:0
+#: selection:workflow.activity,split_mode:0
+msgid "Xor"
+msgstr "Xor"
+
+#. module: base
+#: view:res.partner:0
+msgid "Sales & Purchases"
+msgstr "Sales & Purchases"
+
+#. module: base
+#: view:ir.actions.wizard:0
+#: field:wizard.ir.model.menu.create.line,wizard_id:0
+msgid "Wizard"
+msgstr "Wizard"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CUT"
+msgstr "STOCK_CUT"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_action_wizard
+#: view:ir.actions.wizard:0
+#: model:ir.ui.menu,name:base.menu_ir_action_wizard
+msgid "Wizards"
+msgstr "Wizards"
+
+#. module: base
+#: selection:res.config.view,view:0
+msgid "Extended Interface"
+msgstr "Extended Interface"
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "Custom fields must have a name that starts with 'x_' !"
+msgstr "The name of custom fields must begin with 'x_' !"
+
+#. module: base
+#: help:ir.actions.server,action_id:0
+msgid "Select the Action Window, Report, Wizard to be executed."
+msgstr "Select the Action Window, Report, Wizard to be executed."
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "Export done"
+msgstr "Export completed"
+
+#. module: base
+#: view:ir.model:0
+msgid "Model Description"
+msgstr "Model Description"
+
+#. module: base
+#: field:workflow.transition,trigger_expr_id:0
+msgid "Trigger Expression"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.jo
+msgid "Jordan"
+msgstr "Jordan"
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "You can not remove the model '%s' !"
+msgstr "You cannot remove the model '%s' !"
+
+#. module: base
+#: model:res.country,name:base.er
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#. module: base
+#: view:res.config.view:0
+msgid "Configure simple view"
+msgstr "Configure simple view"
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Bulgarian / български"
+msgstr "Bulgarian / български"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_actions
+msgid "ir.actions.actions"
+msgstr "ir.actions.actions"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_report_custom
+#: view:ir.report.custom:0
+msgid "Custom Report"
+msgstr "Custom Report"
+
+#. module: base
+#: selection:ir.report.custom,type:0
+msgid "Bar Chart"
+msgstr "Bar Chart"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DIALOG_ERROR"
+msgstr "STOCK_DIALOG_ERROR"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_INDEX"
+msgstr "STOCK_INDEX"
+
+#. module: base
+#: model:res.country,name:base.rs
+msgid "Serbia"
+msgstr "Serbia"
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "Wizard View"
+msgstr "Wizard View"
+
+#. module: base
+#: model:res.country,name:base.kh
+msgid "Cambodia, Kingdom of"
+msgstr "Cambodia, Kingdom of"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_sequence_form
+#: view:ir.sequence:0
+#: model:ir.ui.menu,name:base.menu_ir_sequence_form
+#: model:ir.ui.menu,name:base.next_id_5
+msgid "Sequences"
+msgstr "Sequences"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DIALOG_QUESTION"
+msgstr "STOCK_DIALOG_QUESTION"
+
+#. module: base
+#: model:res.country,name:base.pg
+msgid "Papua New Guinea"
+msgstr "Papua New Guinea"
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_4
+msgid "Basic Partner"
+msgstr "Basic Partner"
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid ","
+msgstr ","
+
+#. module: base
+#: view:res.partner:0
+msgid "My Partners"
+msgstr "My Partners"
+
+#. module: base
+#: model:res.country,name:base.es
+msgid "Spain"
+msgstr "Spain"
+
+#. module: base
+#: wizard_view:module.upgrade,end:0
+#: wizard_view:module.upgrade,start:0
+msgid "You may have to reinstall some language pack."
+msgstr "You may have to re-install a language pack."
+
+#. module: base
+#: field:res.partner.address,mobile:0
+msgid "Mobile"
+msgstr "Mobile"
+
+#. module: base
+#: model:res.country,name:base.om
+msgid "Oman"
+msgstr "Oman"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_payterm_form
+#: model:ir.model,name:base.model_res_payterm
+msgid "Payment term"
+msgstr "Payment term"
+
+#. module: base
+#: model:res.country,name:base.nu
+msgid "Niue"
+msgstr "Niue"
+
+#. module: base
+#: selection:ir.cron,interval_type:0
+msgid "Work Days"
+msgstr "Work Days"
+
+#. module: base
+#: help:ir.values,action_id:0
+msgid "This field is not used, it only helps you to select the right action."
+msgstr ""
+"This field is not used, it only helps you to select the right action."
+
+#. module: base
+#: model:ir.actions.act_window,name:base.act_menu_create
+#: view:wizard.ir.model.menu.create:0
+msgid "Create Menu"
+msgstr "Create Menu"
+
+#. module: base
+#: model:res.country,name:base.in
+msgid "India"
+msgstr "India"
+
+#. module: base
+#: model:ir.model,name:base.model_maintenance_contract_module
+msgid "maintenance contract modules"
+msgstr "maintenance contract modules"
+
+#. module: base
+#: view:ir.values:0
+msgid "client_action_multi, client_action_relate"
+msgstr "client_action_multi, client_action_relate"
+
+#. module: base
+#: model:res.country,name:base.ad
+msgid "Andorra, Principality of"
+msgstr "Andorra, Principality of"
+
+#. module: base
+#: field:ir.module.category,child_ids:0
+#: field:res.partner.category,child_ids:0
+msgid "Child Categories"
+msgstr "Child Categories"
+
+#. module: base
+#: selection:wizard.module.lang.export,format:0
+msgid "TGZ Archive"
+msgstr "TGZ Archive"
+
+#. module: base
+#: field:res.partner.som,factor:0
+msgid "Factor"
+msgstr "Factor"
+
+#. module: base
+#: view:res.lang:0
+msgid "%B - Full month name."
+msgstr "%B - Full month name."
+
+#. module: base
+#: field:ir.actions.report.xml,report_type:0
+#: field:ir.actions.todo,type:0
+#: field:ir.server.object.lines,type:0
+#: field:ir.translation,type:0
+#: field:ir.values,key:0
+#: view:res.partner:0
+msgid "Type"
+msgstr "Type"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_FILE"
+msgstr "STOCK_FILE"
+
+#. module: base
+#: model:res.country,name:base.gu
+msgid "Guam (USA)"
+msgstr "Guam (USA)"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_model_grid
+msgid "Objects Security Grid"
+msgstr "Objects Security Grid"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GO_DOWN"
+msgstr "STOCK_GO_DOWN"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_OK"
+msgstr "STOCK_OK"
+
+#. module: base
+#: selection:ir.actions.server,state:0
+#: selection:workflow.activity,kind:0
+msgid "Dummy"
+msgstr "Dummy"
+
+#. module: base
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Invalid XML code in Arch fields of View!"
+
+#. module: base
+#: model:res.country,name:base.ky
+msgid "Cayman Islands"
+msgstr "Cayman Islands"
+
+#. module: base
+#: model:res.country,name:base.ir
+msgid "Iran"
+msgstr "Iran"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_request-act
+#: model:ir.ui.menu,name:base.menu_res_request_act
+msgid "My Requests"
+msgstr "My Requests"
+
+#. module: base
+#: field:ir.sequence,name:0
+#: field:ir.sequence.type,name:0
+msgid "Sequence Name"
+msgstr "Sequence Name"
+
+#. module: base
+#: model:res.country,name:base.td
+msgid "Chad"
+msgstr "Chad"
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Spanish (AR) / Español (AR)"
+msgstr "Spanish (AR) / Español (AR)"
+
+#. module: base
+#: model:res.country,name:base.ug
+msgid "Uganda"
+msgstr "Uganda"
+
+#. module: base
+#: model:res.country,name:base.ne
+msgid "Niger"
+msgstr "Niger"
+
+#. module: base
+#: model:res.country,name:base.ba
+msgid "Bosnia-Herzegovina"
+msgstr "Bosnia-Herzegovina"
+
+#. module: base
+#: field:ir.report.custom.fields,alignment:0
+msgid "Alignment"
+msgstr "Alignment"
+
+#. module: base
+#: selection:ir.rule,operator:0
+msgid ">="
+msgstr ">="
+
+#. module: base
+#: view:res.lang:0
+msgid ""
+"%W - Week number of the year (Monday as the first day of the week) as a "
+"decimal number [00,53]. All days in a new year preceding the first Monday "
+"are considered to be in week 0."
+msgstr ""
+"%W - Week number of the year (Monday as the first day of the week) as a "
+"decimal number [00,53]. All days in a new year preceding the first Monday "
+"are considered to be in week 0."
+
+#. module: base
+#: field:res.partner.event,planned_cost:0
+msgid "Planned Cost"
+msgstr "Planned Cost"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_model_config
+msgid "ir.model.config"
+msgstr "ir.model.config"
+
+#. module: base
+#: field:ir.module.module,website:0
+#: field:res.partner,website:0
+msgid "Website"
+msgstr "Website"
+
+#. module: base
+#: field:ir.rule.group,rules:0
+msgid "Tests"
+msgstr "Tests"
+
+#. module: base
+#: view:ir.module.repository:0
+msgid "Repository"
+msgstr "Repository"
+
+#. module: base
+#: model:res.country,name:base.gs
+msgid "S. Georgia & S. Sandwich Isls."
+msgstr "S. Georgia & S. Sandwich Isls."
+
+#. module: base
+#: field:ir.actions.url,url:0
+msgid "Action URL"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_JUSTIFY_FILL"
+msgstr "STOCK_JUSTIFY_FILL"
+
+#. module: base
+#: model:res.country,name:base.mh
+msgid "Marshall Islands"
+msgstr "Marshall Islands"
+
+#. module: base
+#: model:res.country,name:base.ht
+msgid "Haiti"
+msgstr "Haiti"
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "RML"
+msgstr "RML"
+
+#. module: base
+#: selection:ir.ui.view,type:0
+msgid "Search"
+msgstr "Search"
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Pie charts need exactly two fields"
+msgstr "Pie charts need exactly two fields"
+
+#. module: base
+#: help:wizard.module.lang.export,lang:0
+msgid "To export a new language, do not select a language."
+msgstr "To export a new language, do not select a language."
+
+#. module: base
+#: model:res.country,name:base.md
+msgid "Moldavia"
+msgstr "Moldavia"
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Features"
+msgstr "Features"
+
+#. module: base
+#: field:ir.report.custom,frequency:0
+msgid "Frequency"
+msgstr "Frequency"
+
+#. module: base
+#: field:ir.report.custom.fields,fc0_op:0
+#: field:ir.report.custom.fields,fc1_op:0
+#: field:ir.report.custom.fields,fc2_op:0
+#: field:ir.report.custom.fields,fc3_op:0
+msgid "Relation"
+msgstr "Relation"
+
+#. module: base
+#: field:ir.model.access,perm_read:0
+msgid "Read Access"
+msgstr "Read Access"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_exports
+msgid "ir.exports"
+msgstr "ir.exports"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MISSING_IMAGE"
+msgstr "STOCK_MISSING_IMAGE"
+
+#. module: base
+#: view:res.users:0
+msgid "Define New Users"
+msgstr "Define New Users"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_REMOVE"
+msgstr "STOCK_REMOVE"
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "raw"
+msgstr "raw"
+
+#. module: base
+#: help:ir.actions.server,email:0
+msgid ""
+"Provides the fields that will be used to fetch the email address, e.g. when "
+"you select the invoice, then `object.invoice_address_id.email` is the field "
+"which gives the correct address"
+msgstr ""
+"Provides the fields that will be used to fetch the email address, e.g. when "
+"you select the invoice, then `object.invoice_address_id.email` is the field "
+"which gives the correct address"
+
+#. module: base
+#: field:res.roles,name:0
+msgid "Role Name"
+msgstr "Role Name"
+
+#. module: base
+#: field:res.partner,user_id:0
+msgid "Dedicated Salesman"
+msgstr "Dedicated Salesman"
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "-"
+msgstr "-"
+
+#. module: base
+#: field:res.payterm,name:0
+msgid "Payment Term (short name)"
+msgstr "Payment Term (short name)"
+
+#. module: base
+#: model:ir.model,name:base.model_res_bank
+#: view:res.bank:0
+#: field:res.partner.bank,bank:0
+msgid "Bank"
+msgstr "Bank"
+
+#. module: base
+#: view:res.lang:0
+msgid "Examples"
+msgstr "Examples"
+
+#. module: base
+#: field:ir.module.module,reports_by_module:0
+msgid "Reports"
+msgstr "Reports"
+
+#. module: base
+#: field:workflow,on_create:0
+msgid "On Create"
+msgstr "On Create"
+
+#. module: base
+#: wizard_view:base.module.import,init:0
+msgid "Please give your module .ZIP file to import."
+msgstr "Please give your module in compressed (.ZIP) format to import."
+
+#. module: base
+#: field:ir.default,value:0
+msgid "Default Value"
+msgstr "Default Value"
+
+#. module: base
+#: wizard_field:res.partner.sms_send,init,user:0
+#: field:res.users,login:0
+msgid "Login"
+msgstr "Login"
+
+#. module: base
+#: view:maintenance.contract:0
+#: field:maintenance.contract,module_ids:0
+msgid "Covered Modules"
+msgstr "Covered Modules"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_COPY"
+msgstr "STOCK_COPY"
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "Model %s Does not Exist !"
+msgstr "Model %s Does not Exist !"
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid ""
+"You try to install the module '%s' that depends on the module:'%s'.\n"
+"But this module is not available in your system."
+msgstr ""
+"You try to install the module '%s' that depends on the module:'%s'.\n"
+"But this module is not available in your system."
+
+#. module: base
+#: model:ir.model,name:base.model_res_request_link
+msgid "res.request.link"
+msgstr "res.request.link"
+
+#. module: base
+#: wizard_button:module.module.update,init,update:0
+msgid "Check new modules"
+msgstr "Check new modules"
+
+#. module: base
+#: model:res.country,name:base.km
+msgid "Comoros"
+msgstr "Comoros"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_server_action
+#: view:ir.actions.server:0
+#: model:ir.ui.menu,name:base.menu_server_action
+msgid "Server Actions"
+msgstr "Server Actions"
+
+#. module: base
+#: model:res.country,name:base.tp
+msgid "East Timor"
+msgstr "East Timor"
+
+#. module: base
+#: view:ir.rule:0
+msgid "Simple domain setup"
+msgstr ""
+
+#. module: base
+#: field:res.currency,accuracy:0
+msgid "Computational Accuracy"
+msgstr "Computational Accuracy"
+
+#. module: base
+#: model:res.country,name:base.kg
+msgid "Kyrgyz Republic (Kyrgyzstan)"
+msgstr "Kyrgyz Republic (Kyrgyzstan)"
+
+#. module: base
+#: model:ir.model,name:base.model_wizard_ir_model_menu_create_line
+msgid "wizard.ir.model.menu.create.line"
+msgstr "wizard.ir.model.menu.create.line"
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Day: %(day)s"
+msgstr "Day: %(day)s"
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "You can not read this document! (%s)"
+msgstr "You are not permitted to access this document! (%s)"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_FIND_AND_REPLACE"
+msgstr "STOCK_FIND_AND_REPLACE"
+
+#. module: base
+#: model:res.country,name:base.mv
+msgid "Maldives"
+msgstr "Maldives"
+
+#. module: base
+#: help:ir.values,res_id:0
+msgid "Keep 0 if the action must appear on all resources."
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_rule
+msgid "ir.rule"
+msgstr "ir.rule"
+
+#. module: base
+#: selection:ir.cron,interval_type:0
+msgid "Days"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,width:0
+msgid "Fixed Width"
+msgstr "Fixed Width"
+
+#. module: base
+#: model:res.company,overdue_msg:base.main_company
+msgid ""
+"Would your payment have been carried out after this mail was sent, please "
+"consider the present one as void. Do not hesitate to contact our accounting "
+"department at (+32).81.81.37.00."
+msgstr ""
+"Would your payment have been carried out after this mail was sent, please "
+"consider the present one as void. Do not hesitate to contact our accounting "
+"department at (+32).81.81.37.00."
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-calendar"
+msgstr "terp-calendar"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_YES"
+msgstr "STOCK_YES"
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_action_report_custom
+#: model:ir.ui.menu,name:base.menu_ir_action_report_custom
+msgid "Report Custom"
+msgstr "Custom Report"
+
+#. module: base
+#: code:addons/base/res/partner/partner.py:0
+#: code:addons/base/res/res_company.py:0
+#: code:addons/base/res/res_user.py:0
+#, python-format
+msgid " (copy)"
+msgstr " (copy)"
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Year without century: %(y)s"
+msgstr "Year without century: %(y)s"
+
+#. module: base
+#: view:res.lang:0
+msgid "7.  %H:%M:%S      ==> 18:25:20"
+msgstr "7.  %H:%M:%S      ==> 18:25:20"
+
+#. module: base
+#: help:res.users,company_id:0
+msgid "The company this user is currently working on."
+msgstr "The company this user is currently working on."
+
+#. module: base
+#: help:ir.actions.server,message:0
+msgid ""
+"Specify the message. You can use the fields from the object. e.g. `Dear [[ "
+"object.partner_id.name ]]`"
+msgstr ""
+"Specify the message. You can use the fields from the object. e.g. `Dear [[ "
+"object.partner_id.name ]]`"
+
+#. module: base
+#: field:ir.actions.server,trigger_name:0
+msgid "Trigger Name"
+msgstr "Trigger Name"
+
+#. module: base
+#: model:ir.model,name:base.model_ir_model_access
+msgid "ir.model.access"
+msgstr "ir.model.access"
+
+#. module: base
+#: field:ir.cron,priority:0
+#: field:ir.ui.view,priority:0
+#: field:res.request,priority:0
+#: field:res.request.link,priority:0
+msgid "Priority"
+msgstr "Priority"
+
+#. module: base
+#: field:workflow.transition,act_from:0
+msgid "Source Activity"
+msgstr "Source Activity"
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Legend (for prefix, suffix)"
+msgstr "Legend (for prefix, suffix)"
+
+#. module: base
+#: selection:ir.server.object.lines,type:0
+msgid "Formula"
+msgstr "Formula"
+
+#. module: base
+#: code:addons/base/res/res_user.py:0
+#, python-format
+msgid "Can not remove root user!"
+msgstr "Can not remove root user!"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_JUSTIFY_LEFT"
+msgstr "STOCK_JUSTIFY_LEFT"
+
+#. module: base
+#: model:res.country,name:base.mw
+msgid "Malawi"
+msgstr "Malawi"
+
+#. module: base
+#: field:res.partner.address,type:0
+msgid "Address Type"
+msgstr "Address Type"
+
+#. module: base
+#: selection:ir.actions.todo,start_on:0
+msgid "Auto"
+msgstr "Auto"
+
+#. module: base
+#: view:res.request:0
+msgid "End of Request"
+msgstr "End of Request"
+
+#. module: base
+#: view:res.request:0
+msgid "References"
+msgstr "References"
+
+#. module: base
+#: view:res.lang:0
+msgid ""
+"%U - Week number of the year (Sunday as the first day of the week) as a "
+"decimal number [00,53]. All days in a new year preceding the first Sunday "
+"are considered to be in week 0."
+msgstr ""
+"%U - Week number of the year (Sunday as the first day of the week) as a "
+"decimal number [00,53]. All days in a new year preceding the first Sunday "
+"are considered to be in week 0."
+
+#. module: base
+#: wizard_view:module.lang.install,init:0
+msgid "Note that this operation may take a few minutes."
+msgstr "Note that this operation may take a few minutes."
+
+#. module: base
+#: help:ir.sequence,condition:0
+msgid ""
+"If set, sequence will only be used in case this python expression matches, "
+"and will precede other sequences."
+msgstr ""
+"If set, sequence will only be used in case this python expression matches, "
+"and will precede other sequences."
+
+#. module: base
+#: selection:ir.actions.act_window,view_type:0
+#: selection:ir.actions.act_window.view,view_mode:0
+#: selection:ir.ui.view,type:0
+#: selection:wizard.ir.model.menu.create.line,view_type:0
+msgid "Tree"
+msgstr "Tree"
+
+#. module: base
+#: view:maintenance.contract.wizard:0
+msgid "Could you check your contract information ?"
+msgstr "Could you check your contract information ?"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CLEAR"
+msgstr "STOCK_CLEAR"
+
+#. module: base
+#: help:res.users,password:0
+msgid ""
+"Keep empty if you don't want the user to be able to connect on the system."
+msgstr ""
+"Keep empty if you don't want the user to be able to connect on the system."
+
+#. module: base
+#: field:ir.actions.act_window,view_mode:0
+#: field:res.config.view,view:0
+msgid "View Mode"
+msgstr "View Mode"
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Spanish / Español"
+msgstr "Spanish / Español"
+
+#. module: base
+#: field:res.company,logo:0
+msgid "Logo"
+msgstr "Logo"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_PROPERTIES"
+msgstr "STOCK_PROPERTIES"
+
+#. module: base
+#: view:res.partner.address:0
+msgid "Search Contact"
+msgstr "Search Contact"
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Uninstall (beta)"
+msgstr "Uninstall (beta)"
+
+#. module: base
+#: selection:ir.actions.act_window,target:0
+#: selection:ir.actions.url,target:0
+msgid "New Window"
+msgstr "New Window"
+
+#. module: base
+#: model:res.country,name:base.bs
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#. module: base
+#: selection:res.partner.event,partner_type:0
+msgid "Commercial Prospect"
+msgstr "Commercial Prospect"
+
+#. module: base
+#: code:addons/base/res/partner/partner.py:0
+#, python-format
+msgid ""
+"Couldn't generate the next id because some partners have an alphabetic id !"
+msgstr ""
+"Couldn't generate the next id because some partners have an alphabetic id !"
+
+#. module: base
+#: view:ir.attachment:0
+msgid "Attachment"
+msgstr "Attachment"
+
+#. module: base
+#: model:res.country,name:base.ie
+msgid "Ireland"
+msgstr "Ireland"
+
+#. module: base
+#: wizard_field:module.module.update,update,update:0
+msgid "Number of modules updated"
+msgstr "Number of modules updated"
+
+#. module: base
+#: field:ir.actions.act_window,groups_id:0
+#: model:ir.actions.act_window,name:base.action_res_groups
+#: field:ir.actions.report.xml,groups_id:0
+#: field:ir.actions.todo,groups_id:0
+#: field:ir.actions.wizard,groups_id:0
+#: field:ir.model.fields,groups:0
+#: field:ir.rule.group,groups:0
+#: field:ir.ui.menu,groups_id:0
+#: model:ir.ui.menu,name:base.menu_action_res_groups
+#: view:res.groups:0
+#: view:res.users:0
+#: field:res.users,groups_id:0
+msgid "Groups"
+msgstr "Groups"
+
+#. module: base
+#: constraint:res.users:0
+msgid "This user can not connect using this company !"
+msgstr "This user can not connect using this company !"
+
+#. module: base
+#: model:res.country,name:base.bz
+msgid "Belize"
+msgstr "Belize"
+
+#. module: base
+#: model:res.country,name:base.ge
+msgid "Georgia"
+msgstr "Georgia"
+
+#. module: base
+#: model:res.country,name:base.pl
+msgid "Poland"
+msgstr "Poland"
+
+#. module: base
+#: selection:ir.module.module,state:0
+#: selection:ir.module.module.dependency,state:0
+msgid "To be removed"
+msgstr "To be removed"
+
+#. module: base
+#: field:ir.values,meta:0
+msgid "Meta Datas"
+msgstr "Meta Datas"
+
+#. module: base
+#: view:wizard.module.update_translations:0
+msgid ""
+"This wizard will detect new terms in the application so that you can update "
+"them manually."
+msgstr ""
+"This wizard will detect new terms in the application so that you can update "
+"them manually."
+
+#. module: base
+#: help:ir.actions.server,expression:0
+msgid ""
+"Enter the field/expression that will return the list. E.g. select the sale "
+"order in Object, and you can have loop on the sales order line. Expression = "
+"`object.order_line`."
+msgstr ""
+"Enter the field/expression that will return the list. E.g. select the sale "
+"order in Object, and you can have loop on the sales order line. Expression = "
+"`object.order_line`."
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "Wizard Field"
+msgstr "Wizard Field"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SELECT_COLOR"
+msgstr "STOCK_SELECT_COLOR"
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_NO"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.st
+msgid "Saint Tome (Sao Tome) and Principe"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.address,type:0
+msgid "Invoice"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_REDO"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bb
+msgid "Barbados"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mg
+msgid "Madagascar"
+msgstr ""
+
+#. module: base
+#: constraint:ir.model:0
+msgid ""
+"The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base
+#: help:ir.rule.group,global:0
+msgid "Make the rule global, otherwise it needs to be put on a group"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_menu_admin
+#: field:ir.report.custom,menu_id:0
+#: view:ir.ui.menu:0
+#: field:ir.ui.menu,name:0
+msgid "Menu"
+msgstr ""
+
+#. module: base
+#: field:res.currency,rate:0
+msgid "Current Rate"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Greek / Ελληνικά"
+msgstr ""
+
+#. module: base
+#: view:ir.values:0
+msgid "Action To Launch"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,fc0_op:0
+#: selection:ir.report.custom.fields,fc1_op:0
+#: selection:ir.report.custom.fields,fc2_op:0
+#: selection:ir.report.custom.fields,fc3_op:0
+#: selection:ir.rule,operator:0
+msgid "in"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.url,target:0
+msgid "Action Target"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ai
+msgid "Anguilla"
+msgstr ""
+
+#. module: base
+#: field:ir.model.config,password_check:0
+msgid "Confirmation"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Enter at least one field !"
+msgstr ""
+
+#. module: base
+#: field:ir.ui.view_sc,name:0
+msgid "Shortcut Name"
+msgstr ""
+
+#. module: base
+#: field:res.partner,credit_limit:0
+msgid "Credit Limit"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,write_id:0
+msgid ""
+"Provide the field name that the record id refers to for the write operation. "
+"If it is empty it will refer to the active id of the object."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.zw
+msgid "Zimbabwe"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_translation_export
+msgid "Import / Export"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_config_user_form
+#: view:res.users:0
+msgid "Configure User"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,email:0
+msgid "Email Address"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "French (BE) / Français (BE)"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "You can not write in this document! (%s)"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+#: field:workflow.activity,action_id:0
+msgid "Server Action"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tt
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lv
+msgid "Latvia"
+msgstr ""
+
+#. module: base
+#: view:ir.values:0
+msgid "Values"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Field Mappings"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_request-closed
+#: model:ir.ui.menu,name:base.next_id_12_close
+msgid "My Closed Requests"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_custom
+msgid "Customization"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.py
+msgid "Paraguay"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,alignment:0
+msgid "left"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_act_window_close
+msgid "ir.actions.act_window_close"
+msgstr ""
+
+#. module: base
+#: field:ir.server.object.lines,col1:0
+msgid "Destination"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lt
+msgid "Lithuania"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_PRINT_PREVIEW"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.si
+msgid "Slovenia"
+msgstr ""
+
+#. module: base
+#: view:res.partner.canal:0
+#: field:res.partner.event,canal_id:0
+msgid "Channel"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%p - Equivalent of either AM or PM."
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Iteration Actions"
+msgstr ""
+
+#. module: base
+#: field:maintenance.contract,date_stop:0
+msgid "Ending Date"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.nz
+msgid "New Zealand"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_7
+msgid "Openstuff.net"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.nf
+msgid "Norfolk Island"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_PLAY"
+msgstr ""
+
+#. module: base
+#: field:ir.rule,operator:0
+msgid "Operator"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.install,start:0
+msgid "Installation Done"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_OPEN"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,action_id:0
+#: selection:ir.actions.server,state:0
+msgid "Client Action"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,alignment:0
+msgid "right"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bd
+msgid "Bangladesh"
+msgstr ""
+
+#. module: base
+#: constraint:res.company:0
+msgid "Error! You can not create recursive companies."
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract,state:0
+msgid "Valid"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "You can not delete this document! (%s)"
+msgstr ""
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "XSL"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid "Can not upgrade module '%s'. It is not installed."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cu
+msgid "Cuba"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%S - Second as a decimal number [00,61]."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.am
+msgid "Armenia"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Year with century: %(year)s"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,frequency:0
+msgid "Daily"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.se
+msgid "Sweden"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.act_window.view,view_mode:0
+#: selection:ir.ui.view,type:0
+#: selection:wizard.ir.model.menu.create.line,view_type:0
+msgid "Gantt"
+msgstr ""
+
+#. module: base
+#: view:ir.property:0
+msgid "Property"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_bank_type
+#: view:res.partner.bank.type:0
+msgid "Bank Account Type"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-project"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Iteration Action Configuration"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.at
+msgid "Austria"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.act_window.view,view_mode:0
+#: selection:ir.ui.view,type:0
+#: selection:wizard.ir.model.menu.create.line,view_type:0
+msgid "Calendar"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,signal_send:0
+msgid "Signal (subflow.*)"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_module_module_dependency
+msgid "Module dependency"
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract.wizard,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_JUSTIFY_CENTER"
+msgstr ""
+
+#. module: base
+#: view:res.config.view:0
+msgid "Choose Your Mode"
+msgstr ""
+
+#. module: base
+#: field:res.company,rml_footer1:0
+msgid "Report Footer 1"
+msgstr ""
+
+#. module: base
+#: field:res.company,rml_footer2:0
+msgid "Report Footer 2"
+msgstr ""
+
+#. module: base
+#: view:ir.model.access:0
+#: model:ir.ui.menu,name:base.menu_security_access
+#: view:res.groups:0
+#: field:res.groups,model_access:0
+msgid "Access Controls"
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+#: field:ir.module.module,dependencies_id:0
+msgid "Dependencies"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,bgcolor:0
+msgid "Background Color"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid ""
+"If you use a formula type, use a python expression using the variable "
+"'object'."
+msgstr ""
+
+#. module: base
+#: field:res.partner.address,birthdate:0
+msgid "Birthdate"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_title_contact
+#: model:ir.ui.menu,name:base.menu_partner_title_contact
+msgid "Contact Titles"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_som
+msgid "res.partner.som"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_workflow_activity
+msgid "workflow.activity"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,select_level:0
+msgid "Searchable"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.uy
+msgid "Uruguay"
+msgstr ""
+
+#. module: base
+#: view:res.partner.event:0
+msgid "Document Link"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_title
+msgid "res.partner.title"
+msgstr ""
+
+#. module: base
+#: field:ir.sequence,prefix:0
+msgid "Prefix"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,loop_action:0
+msgid "Loop Action"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "German / Deutsch"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,trigger_name:0
+msgid "Select the Signal name that is to be used as the trigger."
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Fields Mapping"
+msgstr ""
+
+#. module: base
+#: model:res.partner.title,name:base.res_partner_title_sir
+msgid "Sir"
+msgstr ""
+
+#. module: base
+#: wizard_button:module.upgrade,next,start:0
+msgid "Start Upgrade"
+msgstr ""
+
+#. module: base
+#: field:ir.default,ref_id:0
+msgid "ID Ref."
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "French / Français"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mt
+msgid "Malta"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,fields_lines:0
+msgid "Field Mappings."
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_module_module
+#: field:ir.model.data,module:0
+#: view:ir.module.module:0
+#: field:ir.module.module.dependency,module_id:0
+#: rml:ir.module.reference:0
+msgid "Module"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_res_bank_form
+#: model:ir.ui.menu,name:base.menu_action_res_bank_form
+msgid "Bank List"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,description:0
+#: field:ir.module.module,description:0
+#: view:res.partner:0
+#: field:res.partner.bank,name:0
+#: view:res.partner.event:0
+#: field:res.partner.event,description:0
+#: view:res.request:0
+msgid "Description"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_workflow_instance_form
+#: model:ir.ui.menu,name:base.menu_workflow_instance
+msgid "Instances"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_attachment
+msgid "ir.attachment"
+msgstr ""
+
+#. module: base
+#: field:res.users,action_id:0
+msgid "Home Action"
+msgstr ""
+
+#. module: base
+#: field:res.lang,grouping:0
+msgid "Separator Format"
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "Export language"
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract.wizard,state:0
+msgid "Unvalidated"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.next_id_9
+msgid "Database Structure"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.res_partner_mass_mailing_wizard
+#: wizard_view:res.partner.spam_send,init:0
+msgid "Mass Mailing"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.yt
+msgid "Mayotte"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.import,init:0
+msgid "You can also import .po files."
+msgstr ""
+
+#. module: base
+#: code:addons/base/maintenance/maintenance.py:0
+#, python-format
+msgid "Unable to find a valid contract"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_actions.py:0
+#, python-format
+msgid "Please specify an action to launch !"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_JUSTIFY_RIGHT"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_function
+msgid "Function of the contact"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.open_module_tree_upgrade
+#: model:ir.ui.menu,name:base.menu_module_tree_upgrade
+msgid "Modules to be installed, upgraded or removed"
+msgstr ""
+
+#. module: base
+#: view:res.payterm:0
+msgid "Payment Term"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom,footer:0
+msgid "Report Footer"
+msgstr ""
+
+#. module: base
+#: selection:res.lang,direction:0
+msgid "Right-to-Left"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.import,init:0
+msgid "Import language"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_cron_act
+#: view:ir.cron:0
+#: model:ir.ui.menu,name:base.menu_ir_cron_act
+msgid "Scheduled Actions"
+msgstr ""
+
+#. module: base
+#: field:res.partner,title:0
+#: field:res.partner.address,title:0
+#: field:res.partner.title,name:0
+msgid "Title"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SAVE"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-account"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid "Recursion error in modules dependencies !"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+msgid "Create a Menu"
+msgstr ""
+
+#. module: base
+#: help:res.partner,vat:0
+msgid ""
+"Value Added Tax number. Check the box if the partner is subjected to the "
+"VAT. Used by the VAT legal statement."
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_module_category_tree
+#: model:ir.ui.menu,name:base.menu_action_module_category_tree
+msgid "Categories of Modules"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Ukrainian / украї́нська мо́ва"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,state:0
+msgid "Not Started"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ru
+msgid "Russian Federation"
+msgstr ""
+
+#. module: base
+#: field:res.company,name:0
+msgid "Company Name"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_res_roles_form
+#: model:ir.ui.menu,name:base.menu_action_res_roles_form
+#: view:res.roles:0
+#: view:res.users:0
+#: field:res.users,roles_id:0
+msgid "Roles"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_country
+#: model:ir.ui.menu,name:base.menu_country_partner
+msgid "Countries"
+msgstr ""
+
+#. module: base
+#: view:ir.rule.group:0
+msgid "Record rules"
+msgstr ""
+
+#. module: base
+#: field:res.partner,vat:0
+msgid "VAT"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "12. %w              ==> 5 ( Friday is the 6th day)"
+msgstr ""
+
+#. module: base
+#: constraint:res.partner.category:0
+msgid "Error ! You can not create recursive categories."
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%x - Appropriate date representation."
+msgstr ""
+
+#. module: base
+#: help:ir.module.repository,filter:0
+msgid ""
+"Regexp to search module on the repository webpage:\n"
+"- The first parenthesis must match the name of the module.\n"
+"- The second parenthesis must match the whole version number.\n"
+"- The last parenthesis must match the extension of the module."
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%M - Minute as a decimal number [00,59]."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tj
+msgid "Tajikistan"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.act_values_form_action
+#: model:ir.ui.menu,name:base.menu_values_form_action
+msgid "Connect Actions To Client Events"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,license:0
+msgid "GPL-2 or later version"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.event,type:0
+msgid "Prospect Contact"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_wizard
+#: selection:ir.ui.menu,action:0
+msgid "ir.actions.wizard"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.nr
+msgid "Nauru"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_property
+msgid "ir.property"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.act_window,view_type:0
+#: selection:ir.actions.act_window.view,view_mode:0
+#: selection:ir.ui.view,type:0
+#: selection:wizard.ir.model.menu.create.line,view_type:0
+msgid "Form"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.me
+msgid "Montenegro"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_QUIT"
+msgstr ""
+
+#. module: base
+#: view:ir.cron:0
+msgid "Technical Data"
+msgstr ""
+
+#. module: base
+#: view:res.partner:0
+#: field:res.partner,category_id:0
+msgid "Categories"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.res_partner_send_sms_wizard
+#: wizard_button:res.partner.sms_send,init,send:0
+msgid "Send SMS"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,state:0
+#: selection:ir.module.module.dependency,state:0
+msgid "To be upgraded"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ly
+msgid "Libya"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-purchase"
+msgstr ""
+
+#. module: base
+#: wizard_field:module.module.update,init,repositories:0
+msgid "Repositories"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cf
+msgid "Central African Republic"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.li
+msgid "Liechtenstein"
+msgstr ""
+
+#. module: base
+#: model:res.partner.title,name:base.res_partner_title_ltd
+msgid "Ltd"
+msgstr ""
+
+#. module: base
+#: field:res.partner,ean13:0
+msgid "EAN13"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pt
+msgid "Portugal"
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract,state:0
+msgid "Unvalid"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,certificate:0
+msgid "Quality Certificate"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "6.  %d, %m         ==> 05, 12"
+msgstr ""
+
+#. module: base
+#: help:res.partner,customer:0
+msgid "Check this box if the partner is a customer."
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_lang_act_window
+#: model:ir.model,name:base.model_res_lang
+#: model:ir.ui.menu,name:base.menu_res_lang_act_window
+#: view:res.lang:0
+msgid "Languages"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pw
+msgid "Palau"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ec
+msgid "Ecuador"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/wizard/wizard_export_lang.py:0
+#, python-format
+msgid ""
+"Save this document to a .CSV file and open it with your favourite "
+"spreadsheet software. The file encoding is UTF-8. You have to translate the "
+"latest column before reimporting it."
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_customer_form
+#: view:res.partner:0
+msgid "Customers"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.au
+msgid "Australia"
+msgstr ""
+
+#. module: base
+#: help:res.partner,lang:0
+msgid ""
+"If the selected language is loaded in the system, all documents related to "
+"this partner will be printed in this language. If not, it will be english."
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Menu :"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,state:0
+msgid "Base Field"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.module.update,update:0
+msgid "New modules"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_sxw_content:0
+#: field:ir.actions.report.xml,report_sxw_content_data:0
+msgid "SXW content"
+msgstr ""
+
+#. module: base
+#: view:ir.cron:0
+msgid "Action to Trigger"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,fc0_operande:0
+#: field:ir.report.custom.fields,fc1_operande:0
+#: field:ir.report.custom.fields,fc2_operande:0
+#: field:ir.report.custom.fields,fc3_operande:0
+#: selection:ir.translation,type:0
+msgid "Constraint"
+msgstr ""
+
+#. module: base
+#: selection:ir.values,key:0
+#: selection:res.partner.address,type:0
+msgid "Default"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,required:0
+#: field:res.partner.bank.type.field,required:0
+msgid "Required"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,domain:0
+#: field:ir.rule,domain:0
+#: field:res.partner.title,domain:0
+msgid "Domain"
+msgstr ""
+
+#. module: base
+#: field:res.request.history,name:0
+msgid "Summary"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,subject:0
+msgid ""
+"Specify the subject. You can use fields from the object, e.g. `Hello [[ "
+"object.partner_id.name ]]`"
+msgstr ""
+
+#. module: base
+#: view:res.company:0
+msgid "Header/Footer"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lb
+msgid "Lebanon"
+msgstr ""
+
+#. module: base
+#: wizard_field:module.lang.import,init,name:0
+msgid "Language name"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.va
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,condition:0
+msgid ""
+"Condition that is to be tested before action is executed, e.g. "
+"object.list_price > object.cost_price"
+msgstr ""
+
+#. module: base
+#: wizard_field:base.module.import,init,module_file:0
+msgid "Module .ZIP file"
+msgstr ""
+
+#. module: base
+#: field:res.roles,child_id:0
+msgid "Children"
+msgstr ""
+
+#. module: base
+#: field:workflow.transition,trigger_model:0
+msgid "Trigger Object"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,state:0
+msgid "Subscribed"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.install,init:0
+#: wizard_view:module.upgrade,next:0
+msgid "System Upgrade"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,in_transitions:0
+msgid "Incoming Transitions"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sr
+msgid "Suriname"
+msgstr ""
+
+#. module: base
+#: field:ir.values,key2:0
+#: view:res.partner.event.type:0
+#: field:res.partner.event.type,name:0
+msgid "Event Type"
+msgstr ""
+
+#. module: base
+#: view:res.partner.bank:0
+#: model:res.partner.bank.type,name:base.bank_normal
+msgid "Bank account"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence.type:0
+msgid "Sequence Type"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid ""
+"You try to upgrade a module that depends on the module: %s.\n"
+"But this module is not available in your system."
+msgstr ""
+
+#. module: base
+#: view:res.partner.address:0
+msgid "Partner Address"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,license:0
+msgid "License"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Invalid operation"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SAVE_AS"
+msgstr ""
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "SQL Constraint"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,srcmodel_id:0
+msgid "Model"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window.view,view_id:0
+#: field:ir.default,page:0
+#: selection:ir.translation,type:0
+#: field:wizard.ir.model.menu.create.line,view_id:0
+msgid "View"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.act_window:0
+msgid "Open a Window"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gq
+msgid "Equatorial Guinea"
+msgstr ""
+
+#. module: base
+#: wizard_view:base.module.import,init:0
+msgid "Module Import"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "You can not remove the field '%s' !"
+msgstr ""
+
+#. module: base
+#: field:res.bank,zip:0
+#: field:res.partner.address,zip:0
+#: field:res.partner.bank,zip:0
+msgid "Zip"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,author:0
+msgid "Author"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mk
+msgid "FYROM"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_UNDELETE"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%c - Appropriate date and time representation."
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Finland / Suomi"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bo
+msgid "Bolivia"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gh
+msgid "Ghana"
+msgstr ""
+
+#. module: base
+#: field:res.lang,direction:0
+msgid "Direction"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_wizard_module_update_translations
+msgid "wizard.module.update_translations"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.act_window:0
+#: model:ir.actions.act_window,name:base.action_ui_view
+#: field:ir.actions.act_window,view_ids:0
+#: field:ir.actions.act_window,views:0
+#: field:ir.module.module,views_by_module:0
+#: model:ir.ui.menu,name:base.menu_action_ui_view
+#: view:ir.ui.view:0
+#: view:wizard.ir.model.menu.create:0
+#: field:wizard.ir.model.menu.create,view_ids:0
+msgid "Views"
+msgstr ""
+
+#. module: base
+#: view:res.groups:0
+#: field:res.groups,rule_groups:0
+#: field:res.users,rules_id:0
+msgid "Rules"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid "You try to remove a module that is installed or will be installed"
+msgstr ""
+
+#. module: base
+#: help:ir.values,key2:0
+msgid ""
+"The kind of action or button in the client side that will trigger the action."
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_PASTE"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gt
+msgid "Guatemala"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_workflow_form
+#: model:ir.ui.menu,name:base.menu_workflow
+msgid "Workflows"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_config_wizard_form
+#: model:ir.ui.menu,name:base.menu_config_module
+msgid "Configuration Wizard"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_roles
+msgid "res.roles"
+msgstr ""
+
+#. module: base
+#: help:ir.cron,priority:0
+msgid ""
+"0=Very Urgent\n"
+"10=Not urgent"
+msgstr ""
+
+#. module: base
+#: view:res.users:0
+msgid "Skip"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_request_link-act
+#: model:ir.ui.menu,name:base.menu_res_request_link_act
+msgid "Accepted Links in Requests"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ls
+msgid "Lesotho"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ke
+msgid "Kenya"
+msgstr ""
+
+#. module: base
+#: view:res.config.view:0
+msgid ""
+"Choose the simplified interface if you are testing OpenERP for the first "
+"time. Less used options or fields are automatically hidden. You will be able "
+"to change this, later, through the Administration menu."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sm
+msgid "San Marino"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bm
+msgid "Bermuda"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pe
+msgid "Peru"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,on_delete:0
+msgid "Set NULL"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,som:0
+#: field:res.partner.som,name:0
+msgid "State of Mind"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bj
+msgid "Benin"
+msgstr ""
+
+#. module: base
+#: view:ir.rule.group:0
+msgid "The rule is satisfied if all test are True (AND)"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CONNECT"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,select_level:0
+msgid "Not Searchable"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event.type,key:0
+msgid "Key"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,nextcall:0
+msgid "Next Call Date"
+msgstr ""
+
+#. module: base
+#: field:res.company,rml_header:0
+msgid "RML Header"
+msgstr ""
+
+#. module: base
+#: wizard_field:res.partner.sms_send,init,app_id:0
+msgid "API ID"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mu
+msgid "Mauritius"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.module.update,init:0
+msgid "Scan for new modules"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.act_window:0
+#: model:ir.ui.menu,name:base.menu_security
+msgid "Security"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Using a relation field which uses an unknown object"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.za
+msgid "South Africa"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_wizard_module_lang_export
+msgid "wizard.module.lang.export"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,state:0
+#: selection:ir.module.module.dependency,state:0
+msgid "Installed"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sn
+msgid "Senegal"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.hu
+msgid "Hungary"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_groups
+msgid "res.groups"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.br
+msgid "Brazil"
+msgstr ""
+
+#. module: base
+#: field:ir.sequence,number_next:0
+msgid "Next Number"
+msgstr ""
+
+#. module: base
+#: view:res.currency:0
+#: field:res.currency,rate_ids:0
+msgid "Rates"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Albanian / Shqipëri"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sy
+msgid "Syria"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "======================================================"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,field_child2:0
+msgid "Field child2"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,field_child3:0
+msgid "Field child3"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,field_child0:0
+msgid "Field child0"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,field_child1:0
+msgid "Field child1"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,selection:0
+msgid "Field Selection"
+msgstr ""
+
+#. module: base
+#: selection:res.request,state:0
+msgid "draft"
+msgstr ""
+
+#. module: base
+#: field:res.currency,date:0
+#: field:res.currency.rate,name:0
+#: field:res.partner,date:0
+#: field:res.partner.event,date:0
+#: field:res.request,date_sent:0
+msgid "Date"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_sxw:0
+msgid "SXW path"
+msgstr ""
+
+#. module: base
+#: view:ir.attachment:0
+#: field:ir.attachment,datas:0
+msgid "Data"
+msgstr ""
+
+#. module: base
+#: view:res.users:0
+msgid "Groups are used to defined access rights on each screen and menu."
+msgstr ""
+
+#. module: base
+#: field:ir.ui.menu,parent_id:0
+#: field:wizard.ir.model.menu.create,menu_id:0
+msgid "Parent Menu"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.act_window.view,multi:0
+#: help:ir.actions.report.custom,multi:0
+#: help:ir.actions.report.xml,multi:0
+msgid ""
+"If set to true, the action will not be displayed on the right toolbar of a "
+"form view."
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_custom_multicompany
+msgid "Multi company"
+msgstr ""
+
+#. module: base
+#: view:ir.attachment:0
+msgid "Attached To"
+msgstr ""
+
+#. module: base
+#: field:res.lang,decimal_point:0
+msgid "Decimal Separator"
+msgstr ""
+
+#. module: base
+#: view:res.partner:0
+#: view:res.request:0
+#: field:res.request,history:0
+msgid "History"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,create_uid:0
+msgid "Creator"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mx
+msgid "Mexico"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Swedish / svenska"
+msgstr ""
+
+#. module: base
+#: field:res.company,child_ids:0
+msgid "Child Companies"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_users
+msgid "res.users"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ni
+msgid "Nicaragua"
+msgstr ""
+
+#. module: base
+#: view:res.partner.event:0
+msgid "General Description"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.event,type:0
+msgid "Sale Opportunity"
+msgstr ""
+
+#. module: base
+#: view:maintenance.contract.wizard:0
+msgid "Maintenance contract added !"
+msgstr ""
+
+#. module: base
+#: field:ir.rule,field_id:0
+#: selection:ir.translation,type:0
+#: field:multi_company.default,field_id:0
+msgid "Field"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ve
+msgid "Venezuela"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "9.  %j              ==> 340"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.zm
+msgid "Zambia"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_action_report_xml
+#: model:ir.ui.menu,name:base.menu_ir_action_report_xml
+msgid "Report Xml"
+msgstr ""
+
+#. module: base
+#: help:res.partner,user_id:0
+msgid ""
+"The internal user that is in charge of communicating with this partner if "
+"any."
+msgstr ""
+
+#. module: base
+#: field:res.partner,parent_id:0
+msgid "Parent Partner"
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Cancel Upgrade"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ci
+msgid "Ivory Coast (Cote D'Ivoire)"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.kz
+msgid "Kazakhstan"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,name:0
+#: field:ir.actions.todo,name:0
+#: field:ir.cron,name:0
+#: field:ir.model.access,name:0
+#: field:ir.model.fields,name:0
+#: field:ir.module.category,name:0
+#: field:ir.module.module,name:0
+#: field:ir.module.module.dependency,name:0
+#: rml:ir.module.reference:0
+#: field:ir.module.repository,name:0
+#: field:ir.property,name:0
+#: field:ir.report.custom.fields,name:0
+#: field:ir.rule.group,name:0
+#: field:ir.values,name:0
+#: field:maintenance.contract.module,name:0
+#: field:res.bank,name:0
+#: field:res.config.view,name:0
+#: field:res.lang,name:0
+#: field:res.partner,name:0
+#: field:res.partner.bank.type,name:0
+#: field:res.request.link,name:0
+#: field:res.users,name:0
+#: field:workflow,name:0
+#: field:workflow.activity,name:0
+msgid "Name"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ms
+msgid "Montserrat"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_translation_app
+msgid "Application Terms"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,operation:0
+msgid "Calculate Average"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,demo:0
+msgid "Demo data"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "English (UK)"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.aq
+msgid "Antarctica"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_3
+msgid "Starter Partner"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_act_window_view
+msgid "ir.actions.act_window.view"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Web"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "English (CA)"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,planned_revenue:0
+msgid "Planned Revenue"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.import,init:0
+msgid ""
+"You have to import a .CSV file wich is encoded in UTF-8.  Please check that "
+"the first line of your file is one of the following:"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.et
+msgid "Ethiopia"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%H - Hour (24-hour clock) as a decimal number [00,23]."
+msgstr ""
+
+#. module: base
+#: view:res.roles:0
+msgid "Role"
+msgstr ""
+
+#. module: base
+#: help:res.country.state,code:0
+msgid "The state code in three chars.\n"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sj
+msgid "Svalbard and Jan Mayen Islands"
+msgstr ""
+
+#. module: base
+#: view:ir.rule:0
+msgid "Test"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,groupby:0
+msgid "Group By"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid ""
+"\"%s\" contains too many dots. XML ids should not contain dots ! These are "
+"used to refer to other modules data, as in module.reference_id"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DIALOG_WARNING"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ZOOM_IN"
+msgstr ""
+
+#. module: base
+#: selection:res.request,state:0
+msgid "closed"
+msgstr ""
+
+#. module: base
+#: selection:wizard.module.lang.export,state:0
+msgid "get"
+msgstr ""
+
+#. module: base
+#: help:ir.model.fields,on_delete:0
+msgid "On delete property for many2one fields"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,write_id:0
+msgid "Write Id"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,domain:0
+msgid "Domain Value"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ITALIC"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "SMS Configuration"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_access_act
+#: model:ir.ui.menu,name:base.menu_ir_access_act
+msgid "Access Controls List"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.um
+msgid "USA Minor Outlying Islands"
+msgstr ""
+
+#. module: base
+#: field:res.partner.bank,state:0
+#: field:res.partner.bank.type.field,bank_type_id:0
+msgid "Bank Type"
+msgstr ""
+
+#. module: base
+#: code:addons/base/res/res_user.py:0
+#, python-format
+msgid "The name of the group can not start with \"-\""
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,end:0
+#: wizard_view:module.upgrade,start:0
+msgid "We suggest you to reload the menu tab (Ctrl+t Ctrl+r)."
+msgstr ""
+
+#. module: base
+#: view:ir.ui.view_sc:0
+#: field:res.partner.title,shortcut:0
+msgid "Shortcut"
+msgstr ""
+
+#. module: base
+#: field:ir.model.data,date_init:0
+msgid "Init Date"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,flow_start:0
+msgid "Flow Start"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+#: view:ir.model.fields:0
+msgid "Security on Groups"
+msgstr ""
+
+#. module: base
+#: view:res.partner.bank:0
+msgid "Bank Account Owner"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.act_values_form
+#: model:ir.ui.menu,name:base.menu_values_form
+msgid "Client Actions Connections"
+msgstr ""
+
+#. module: base
+#: field:ir.ui.view_sc,resource:0
+msgid "Resource Name"
+msgstr ""
+
+#. module: base
+#: selection:ir.cron,interval_type:0
+msgid "Hours"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gp
+msgid "Guadeloupe (French)"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,cumulate:0
+msgid "Accumulate"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Tree can only be used in tabular reports"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Directory"
+msgstr ""
+
+#. module: base
+#: field:wizard.ir.model.menu.create,name:0
+msgid "Menu Name"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom,title:0
+msgid "Report Title"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,fontcolor:0
+msgid "Font color"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SORT_DESCENDING"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.my
+msgid "Malaysia"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_request_history
+msgid "res.request.history"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Client Action Configuration"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_address_form
+#: model:ir.model,name:base.model_res_partner_address
+#: model:ir.ui.menu,name:base.menu_partner_address_form
+#: view:res.partner.address:0
+msgid "Partner Addresses"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Indonesian / Bahasa Indonesia"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cv
+msgid "Cape Verde"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid ""
+"Some installed modules depend on the module you plan to Uninstall :\n"
+" %s"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.act_res_partner_event
+#: field:res.partner,events:0
+#: field:res.partner.event,name:0
+msgid "Events"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_res_roles
+#: model:ir.ui.menu,name:base.menu_action_res_roles
+msgid "Roles Structure"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_url
+#: selection:ir.ui.menu,action:0
+msgid "ir.actions.url"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_STOP"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DND_MULTIPLE"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_addess_tree
+#: view:res.partner:0
+msgid "Partner Contacts"
+msgstr ""
+
+#. module: base
+#: wizard_field:module.module.update,update,add:0
+msgid "Number of modules added"
+msgstr ""
+
+#. module: base
+#: field:workflow.transition,role_id:0
+msgid "Role Required"
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Created Menus"
+msgstr ""
+
+#. module: base
+#: field:workflow.triggers,workitem_id:0
+msgid "Workitem"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DIALOG_AUTHENTICATION"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ZOOM_OUT"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window.view,act_window_id:0
+#: view:ir.actions.actions:0
+#: field:ir.actions.todo,action_id:0
+#: field:ir.ui.menu,action:0
+#: field:ir.values,action_id:0
+#: selection:ir.values,key:0
+msgid "Action"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Email Configuration"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_cron
+msgid "ir.cron"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-mrp"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,trigger_obj_id:0
+msgid "Trigger On"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.fj
+msgid "Fiji"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,size:0
+msgid "Size"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sd
+msgid "Sudan"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%m - Month as a decimal number [01,12]."
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "Export Data"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.fm
+msgid "Micronesia"
+msgstr ""
+
+#. module: base
+#: view:res.request.history:0
+msgid "Request History"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,menus:0
+#: field:ir.module.module,menus_by_module:0
+#: view:res.groups:0
+msgid "Menus"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.il
+msgid "Israel"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.wizard_server_action_create
+msgid "Create Action"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "HTML from HTML"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "html"
+msgstr ""
+
+#. module: base
+#: field:res.lang,time_format:0
+msgid "Time Format"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,next:0
+msgid "Your system will be upgraded."
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Defined Reports"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-tools"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.report.xml:0
+msgid "Report xml"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_module_open_categ
+#: model:ir.actions.act_window,name:base.open_module_tree
+#: view:ir.module.module:0
+#: model:ir.ui.menu,name:base.menu_module_tree
+#: field:wizard.module.lang.export,modules:0
+msgid "Modules"
+msgstr ""
+
+#. module: base
+#: selection:workflow.activity,kind:0
+#: field:workflow.activity,subflow_id:0
+#: field:workflow.workitem,subflow_id:0
+msgid "Subflow"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_UNDO"
+msgstr ""
+
+#. module: base
+#: field:workflow.transition,signal:0
+msgid "Signal (button Name)"
+msgstr ""
+
+#. module: base
+#: view:res.bank:0
+#: field:res.partner,bank_ids:0
+msgid "Banks"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-sale"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%d - Day of the month as a decimal number [01,31]."
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%I - Hour (12-hour clock) as a decimal number [01,12]."
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Romanian / limba română"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ADD"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,doall:0
+msgid "Repeat Missed"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,state:0
+msgid "Type of the Action that is to be executed"
+msgstr ""
+
+#. module: base
+#: field:ir.server.object.lines,server_id:0
+msgid "Object Mapping"
+msgstr ""
+
+#. module: base
+#: help:res.currency,rate:0
+#: help:res.currency.rate,rate:0
+msgid "The rate of the currency to the currency of rate 1"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.uk
+msgid "United Kingdom"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Create / Write"
+msgstr ""
+
+#. module: base
+#: help:res.partner.category,active:0
+msgid "The active field allows you to hide the category without removing it."
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Object:"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bw
+msgid "Botswana"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_title_partner
+#: model:ir.ui.menu,name:base.menu_partner_title_partner
+#: view:res.partner.title:0
+msgid "Partner Titles"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,type:0
+msgid "Service"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.act_window,auto_refresh:0
+msgid "Add an auto-refresh on the view"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,next:0
+#: wizard_field:module.upgrade,next,module_download:0
+msgid "Modules to download"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_workflow_workitem_form
+#: model:ir.ui.menu,name:base.menu_workflow_workitem
+msgid "Workitems"
+msgstr ""
+
+#. module: base
+#: field:wizard.module.lang.export,advice:0
+msgid "Advice"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Lithuanian / Lietuvių kalba"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,record_id:0
+msgid ""
+"Provide the field name where the record id is stored after the create "
+"operations. If it is empty, you can not track the new record."
+msgstr ""
+
+#. module: base
+#: field:ir.ui.view,inherit_id:0
+msgid "Inherited View"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_translation
+msgid "ir.translation"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_rule_group
+msgid "ir.rule.group"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.open_module_tree_install
+#: model:ir.ui.menu,name:base.menu_module_tree_install
+msgid "Installed modules"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lc
+msgid "Saint Lucia"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_maintenance_contract
+#: view:maintenance.contract:0
+msgid "Maintenance Contract"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,trigger_obj_id:0
+msgid "Select the object from the model on which the workflow will executed."
+msgstr ""
+
+#. module: base
+#: field:ir.model,state:0
+#: field:ir.model.fields,state:0
+#: field:ir.model.grid,state:0
+msgid "Manually Created"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,operation:0
+msgid "Calculate Count"
+msgstr ""
+
+#. module: base
+#: field:ir.model.access,perm_create:0
+msgid "Create Access"
+msgstr ""
+
+#. module: base
+#: field:res.partner.address,state_id:0
+msgid "Fed. State"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.io
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Field Mapping"
+msgstr ""
+
+#. module: base
+#: field:maintenance.contract,date_start:0
+msgid "Starting Date"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+#: field:ir.model.fields,ttype:0
+msgid "Field Type"
+msgstr ""
+
+#. module: base
+#: field:res.country.state,code:0
+msgid "State Code"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,on_delete:0
+msgid "On delete"
+msgstr ""
+
+#. module: base
+#: selection:res.lang,direction:0
+msgid "Left-to-Right"
+msgstr ""
+
+#. module: base
+#: field:res.lang,translatable:0
+msgid "Translatable"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.vn
+msgid "Vietnam"
+msgstr ""
+
+#. module: base
+#: field:res.users,signature:0
+msgid "Signature"
+msgstr ""
+
+#. module: base
+#: field:res.partner.category,complete_name:0
+msgid "Full Name"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mz
+msgid "Mozambique"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.grant_menu_access
+#: model:ir.ui.menu,name:base.menu_grant_menu_access
+msgid "Manage Menus"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,message:0
+#: wizard_field:res.partner.spam_send,init,text:0
+msgid "Message"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window.view,multi:0
+msgid "On Multiple Doc."
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_base_config_contact
+#: field:res.partner,address:0
+#: view:res.partner.address:0
+msgid "Contacts"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.fo
+msgid "Faroe Islands"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.wizard_upgrade
+#: model:ir.ui.menu,name:base.menu_wizard_upgrade
+msgid "Apply Scheduled Upgrades"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.maintenance
+msgid "Maintenance"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mp
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.import,init:0
+msgid "module,type,name,res_id,src,value"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_management
+msgid "Modules Management"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+#: field:maintenance.contract.module,version:0
+msgid "Version"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_wizard_ir_model_menu_create
+msgid "wizard.ir.model.menu.create"
+msgstr ""
+
+#. module: base
+#: view:workflow.transition:0
+msgid "Transition"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.todo,active:0
+#: field:ir.cron,active:0
+#: field:ir.module.repository,active:0
+#: field:ir.sequence,active:0
+#: field:res.bank,active:0
+#: field:res.currency,active:0
+#: field:res.lang,active:0
+#: field:res.partner,active:0
+#: field:res.partner.address,active:0
+#: field:res.partner.canal,active:0
+#: field:res.partner.category,active:0
+#: field:res.partner.event.type,active:0
+#: field:res.request,active:0
+#: field:res.users,active:0
+msgid "Active"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.na
+msgid "Namibia"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mn
+msgid "Mongolia"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_actions.py:0
+#: code:addons/base/ir/ir_model.py:0
+#: code:addons/base/maintenance/maintenance.py:0
+#: code:addons/base/module/module.py:0
+#: code:addons/base/res/res_currency.py:0
+#: code:addons/base/res/res_user.py:0
+#, python-format
+msgid "Error"
+msgstr ""
+
+#. module: base
+#: view:res.partner.som:0
+msgid "Partner State of Mind"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.view,type:0
+msgid "mdx"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bi
+msgid "Burundi"
+msgstr ""
+
+#. module: base
+#: wizard_button:base.module.import,import,open_window:0
+#: wizard_button:module.upgrade,end,end:0
+#: wizard_button:module.upgrade,start,end:0
+#: wizard_button:server.action.create,init,end:0
+#: wizard_button:server.action.create,step_1,end:0
+#: view:wizard.module.lang.export:0
+msgid "Close"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bt
+msgid "Bhutan"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_11
+msgid "Textile Suppliers"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.url,target:0
+msgid "This Window"
+msgstr ""
+
+#. module: base
+#: field:wizard.module.lang.export,format:0
+msgid "File Format"
+msgstr ""
+
+#. module: base
+#: field:res.lang,iso_code:0
+msgid "ISO code"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_config_view
+msgid "res.config.view"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_INDENT"
+msgstr ""
+
+#. module: base
+#: view:workflow.workitem:0
+msgid "Workflow Workitems"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.vc
+msgid "Saint Vincent & Grenadines"
+msgstr ""
+
+#. module: base
+#: field:ir.model.config,password:0
+#: field:maintenance.contract,password:0
+#: field:maintenance.contract.wizard,password:0
+#: wizard_field:res.partner.sms_send,init,password:0
+#: field:res.users,password:0
+msgid "Password"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_model_fields
+#: view:ir.model:0
+#: field:ir.model,field_id:0
+#: model:ir.model,name:base.model_ir_model_fields
+#: view:ir.model.fields:0
+#: field:ir.model.grid,field_id:0
+#: field:ir.property,fields_id:0
+#: field:ir.report.custom,fields_child0:0
+#: model:ir.ui.menu,name:base.ir_model_model_fields
+msgid "Fields"
+msgstr ""
+
+#. module: base
+#: wizard_view:base.module.import,import:0
+msgid "Module successfully imported !"
+msgstr ""
+
+#. module: base
+#: field:res.company,rml_header2:0
+msgid "RML Internal Header"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,print_format:0
+msgid "a4"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,search_view_id:0
+msgid "Search View Ref."
+msgstr ""
+
+#. module: base
+#: view:ir.rule.group:0
+msgid "Multiple rules on same objects are joined using operator OR"
+msgstr ""
+
+#. module: base
+#: model:res.partner.bank.type.field,name:base.bank_normal_field
+msgid "acc_number"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mm
+msgid "Myanmar"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Chinese (CN) / 简体中文"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_NEXT"
+msgstr ""
+
+#. module: base
+#: field:res.bank,street:0
+#: field:res.partner.address,street:0
+#: field:res.partner.bank,street:0
+msgid "Street"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.yu
+msgid "Yugoslavia"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,next:0
+msgid "Note that this operation my take a few minutes."
+msgstr ""
+
+#. module: base
+#: field:ir.model.data,name:0
+msgid "XML Identifier"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ca
+msgid "Canada"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_name:0
+msgid "Internal Name"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module.dependency,state:0
+msgid "Unknown"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_res_users_my
+msgid "Change My Preferences"
+msgstr ""
+
+#. module: base
+#: constraint:ir.actions.act_window:0
+msgid "Invalid model name in the action definition."
+msgstr ""
+
+#. module: base
+#: wizard_field:res.partner.sms_send,init,text:0
+msgid "SMS Message"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_EDIT"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cm
+msgid "Cameroon"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bf
+msgid "Burkina Faso"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_FORWARD"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,state:0
+msgid "Skipped"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,state:0
+msgid "Custom Field"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cc
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#. module: base
+#: field:workflow.instance,uid:0
+msgid "User ID"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid ""
+"Access all the fields related to the current object using expression in "
+"double brackets, i.e.[[ object.partner_id.name ]]"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "11. %U or %W       ==> 48 (49th week)"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_bank_type_field
+msgid "Bank type fields"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.import,init:0
+msgid "type,name,res_id,src,value"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Dutch / Nederlands"
+msgstr ""
+
+#. module: base
+#: wizard_view:server.action.create,step_1:0
+#: wizard_field:server.action.create,step_1,report:0
+msgid "Select Report"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,fc1_condition:0
+#: field:ir.report.custom.fields,fc2_condition:0
+#: field:ir.report.custom.fields,fc3_condition:0
+msgid "condition"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "1cm 28cm 20cm 28cm"
+msgstr ""
+
+#. module: base
+#: field:ir.sequence,suffix:0
+msgid "Suffix"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mo
+msgid "Macau"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.report.xml,name:base.res_partner_address_report
+msgid "Labels"
+msgstr ""
+
+#. module: base
+#: wizard_field:res.partner.spam_send,init,from:0
+msgid "Sender's email"
+msgstr ""
+
+#. module: base
+#: field:ir.default,field_name:0
+msgid "Object Field"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "French (CH) / Français (CH)"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_NEW"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,operation:0
+msgid "None"
+msgstr ""
+
+#. module: base
+#: view:ir.report.custom.fields:0
+msgid "Report Fields"
+msgstr ""
+
+#. module: base
+#: view:res.partner:0
+msgid "General"
+msgstr ""
+
+#. module: base
+#: field:workflow.transition,act_to:0
+msgid "Destination Activity"
+msgstr ""
+
+#. module: base
+#: view:ir.values:0
+msgid "Connect Events to Actions"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SORT_ASCENDING"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ABOUT"
+msgstr ""
+
+#. module: base
+#: field:ir.module.category,parent_id:0
+#: field:res.partner.category,parent_id:0
+msgid "Parent Category"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.fi
+msgid "Finland"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.address,type:0
+#: selection:res.partner.title,domain:0
+msgid "Contact"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_ui_menu
+msgid "ir.ui.menu"
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Cancel Uninstall"
+msgstr ""
+
+#. module: base
+#: view:res.bank:0
+#: view:res.partner:0
+#: view:res.partner.address:0
+msgid "Communication"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_server_object_lines
+msgid "ir.server.object.lines"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid "Module %s: Invalid Quality Certificate"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.kw
+msgid "Kuwait"
+msgstr ""
+
+#. module: base
+#: field:workflow.workitem,inst_id:0
+msgid "Instance"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.report.xml,attachment:0
+msgid ""
+"This is the filename of the attachment used to store the printing result. "
+"Keep empty to not save the printed reports. You can use a python expression "
+"with the object and time variables."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ng
+msgid "Nigeria"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_event
+msgid "res.partner.event"
+msgstr ""
+
+#. module: base
+#: field:res.company,user_ids:0
+msgid "Accepted Users"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_UNDERLINE"
+msgstr ""
+
+#. module: base
+#: view:ir.values:0
+msgid "Values for Event Type"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,select_level:0
+msgid "Always Searchable"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CLOSE"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.hk
+msgid "Hong Kong"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,name:0
+msgid "Easy to Refer action by name e.g. One Sales Order -> Many Invoices"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.next_id_10
+msgid "Scheduler"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_BOLD"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ph
+msgid "Philippines"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ma
+msgid "Morocco"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-graph"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "2.  %a ,%A         ==> Fri, Friday"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.install,start:0
+msgid ""
+"The selected language has been successfully installed. You must change the "
+"preferences of the user and open a new menu to view changes."
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_sequence
+msgid "ir.sequence"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_event_type
+#: model:ir.ui.menu,name:base.next_id_14
+#: view:res.partner.event:0
+msgid "Partner Events"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_workflow_transition
+msgid "workflow.transition"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%a - Abbreviated weekday name."
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Introspection report on objects"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pf
+msgid "Polynesia (French)"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.dm
+msgid "Dominica"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_currency_rate
+msgid "Currency Rate"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.np
+msgid "Nepal"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,event_ical_id:0
+msgid "iCal id"
+msgstr ""
+
+#. module: base
+#: wizard_view:res.partner.sms_send,init:0
+msgid "Bulk SMS send"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%Y - Year with century as a decimal number."
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,type:0
+msgid "Pie Chart"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Seconde: %(sec)s"
+msgstr ""
+
+#. module: base
+#: selection:ir.translation,type:0
+#: field:res.bank,code:0
+#: field:res.currency,code:0
+#: field:res.partner,ref:0
+#: field:res.partner.bank.type,code:0
+#: field:res.partner.function,code:0
+msgid "Code"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/module.py:0
+#, python-format
+msgid ""
+"Can not create the module file:\n"
+" %s"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.wizard_update
+#: model:ir.ui.menu,name:base.menu_module_update
+msgid "Update Modules List"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.configuration.wizard:0
+msgid "Continue"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Thai / ภาษาไทย"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_property_form
+#: model:ir.ui.menu,name:base.menu_ir_property_form
+msgid "Default Properties"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Slovenian / slovenščina"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,attachment_use:0
+msgid "Reload from Attachment"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bv
+msgid "Bouvet Island"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom,print_orientation:0
+msgid "Print orientation"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_wizard_lang_export
+#: model:ir.ui.menu,name:base.menu_wizard_lang_export
+msgid "Export a Translation File"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,name:0
+msgid "Attachment Name"
+msgstr ""
+
+#. module: base
+#: wizard_field:module.lang.import,init,data:0
+#: field:wizard.module.lang.export,data:0
+msgid "File"
+msgstr ""
+
+#. module: base
+#: view:res.users:0
+msgid "Add User"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_configuration_wizard
+msgid "ir.actions.configuration.wizard"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%b - Abbreviated month name."
+msgstr ""
+
+#. module: base
+#: field:res.partner,supplier:0
+#: model:res.partner.category,name:base.res_partner_category_8
+msgid "Supplier"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+#: selection:ir.actions.server,state:0
+msgid "Multi Actions"
+msgstr ""
+
+#. module: base
+#: view:maintenance.contract.wizard:0
+msgid "_Close"
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract,kind:0
+msgid "Full"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.as
+msgid "American Samoa"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_model_model
+#: model:ir.model,name:base.model_ir_model
+#: model:ir.ui.menu,name:base.ir_model_model_menu
+msgid "Objects"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,selectable:0
+msgid "Selectable"
+msgstr ""
+
+#. module: base
+#: view:res.request.link:0
+msgid "Request Link"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,url:0
+#: field:ir.module.repository,url:0
+msgid "URL"
+msgstr ""
+
+#. module: base
+#: help:res.country,name:0
+msgid "The full name of the country."
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.server,state:0
+msgid "Iteration"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-stock"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ae
+msgid "United Arab Emirates"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_RECORD"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.re
+msgid "Reunion (French)"
+msgstr ""
+
+#. module: base
+#: field:ir.rule.group,global:0
+msgid "Global"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cz
+msgid "Czech Republic"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sb
+msgid "Solomon Islands"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "AccessError"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "8.  %I:%M:%S %p  ==> 06:25:20 PM"
+msgstr ""
+
+#. module: base
+#: view:ir.translation:0
+#: model:ir.ui.menu,name:base.menu_translation
+msgid "Translations"
+msgstr ""
+
+#. module: base
+#: field:ir.sequence,padding:0
+msgid "Number padding"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ua
+msgid "Ukraine"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.to
+msgid "Tonga"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_module_category
+#: view:ir.module.category:0
+msgid "Module Category"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.us
+msgid "United States"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Reference Guide"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ml
+msgid "Mali"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_UNINDENT"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,interval_number:0
+msgid "Interval Number"
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract,kind:0
+msgid "Partial"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tk
+msgid "Tokelau"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_xsl:0
+msgid "XSL path"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bn
+msgid "Brunei Darussalam"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,view_type:0
+#: field:ir.actions.act_window.view,view_mode:0
+#: field:ir.ui.view,type:0
+#: field:wizard.ir.model.menu.create.line,view_type:0
+msgid "View Type"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.next_id_2
+msgid "User Interface"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DIALOG_INFO"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,create_date:0
+msgid "Date Created"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_todo
+msgid "ir.actions.todo"
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "Get file"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.module.update,init:0
+msgid ""
+"This function will check for new modules in the 'addons' path and on module "
+"repositories:"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GO_BACK"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.act_window:0
+msgid "General Settings"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.custom_shortcuts
+msgid "Custom Shortcuts"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.dz
+msgid "Algeria"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.be
+msgid "Belgium"
+msgstr ""
+
+#. module: base
+#: field:ir.translation,lang:0
+#: wizard_field:module.lang.install,init,lang:0
+#: field:res.partner,lang:0
+#: field:res.users,context_lang:0
+#: field:wizard.module.lang.export,lang:0
+#: field:wizard.module.update_translations,lang:0
+msgid "Language"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gm
+msgid "Gambia"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_res_company_form
+#: model:ir.ui.menu,name:base.menu_action_res_company_form
+#: model:ir.ui.menu,name:base.menu_res_company_global
+#: view:res.company:0
+msgid "Companies"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+#: field:ir.actions.server,code:0
+#: selection:ir.actions.server,state:0
+msgid "Python Code"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/wizard/wizard_module_import.py:0
+#, python-format
+msgid "Can not create the module file: %s !"
+msgstr ""
+
+#. module: base
+#: model:ir.module.module,description:base.module_meta_information
+msgid "The kernel of OpenERP, needed for all installation."
+msgstr ""
+
+#. module: base
+#: wizard_button:base.module.import,init,end:0
+#: selection:ir.actions.todo,state:0
+#: wizard_button:module.lang.import,init,end:0
+#: wizard_button:module.lang.install,init,end:0
+#: wizard_button:module.module.update,init,end:0
+#: wizard_button:module.upgrade,next,end:0
+#: wizard_button:res.partner.sms_send,init,end:0
+#: wizard_button:res.partner.spam_send,init,end:0
+#: view:wizard.ir.model.menu.create:0
+#: view:wizard.module.lang.export:0
+#: view:wizard.module.update_translations:0
+msgid "Cancel"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_actions.py:0
+#, python-format
+msgid "Please specify server option --smtp-from !"
+msgstr ""
+
+#. module: base
+#: selection:wizard.module.lang.export,format:0
+msgid "PO File"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SPELL_CHECK"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_category
+#: model:ir.ui.menu,name:base.menu_partner_category_main
+msgid "Partners by Categories"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_9
+msgid "Components Supplier"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,default_user_ids:0
+#: model:ir.actions.act_window,name:base.action_res_users
+#: field:ir.actions.todo,users_id:0
+#: field:ir.default,uid:0
+#: field:ir.rule.group,users:0
+#: model:ir.ui.menu,name:base.menu_action_res_users
+#: model:ir.ui.menu,name:base.menu_users
+#: view:res.groups:0
+#: field:res.groups,users:0
+#: field:res.roles,users:0
+#: view:res.users:0
+msgid "Users"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,published_version:0
+msgid "Published Version"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.is
+msgid "Iceland"
+msgstr ""
+
+#. module: base
+#: view:res.users:0
+msgid "Roles are used to defined available actions, provided by workflows."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.de
+msgid "Germany"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Week of the year: %(woy)s"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_14
+msgid "Bad customers"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_HARDDISK"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Reports :"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_APPLY"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_maintenance_contract_form
+#: model:ir.ui.menu,name:base.menu_maintenance_contract
+msgid "Your Maintenance Contracts"
+msgstr ""
+
+#. module: base
+#: view:res.users:0
+msgid ""
+"Please note that you will have to logout and relog if you change your "
+"password."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gy
+msgid "Guyana"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,license:0
+msgid "GPL-3"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,license:0
+msgid "GPL-2"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Portugese (BR) / português (BR)"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,record_id:0
+msgid "Create Id"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.hn
+msgid "Honduras"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.eg
+msgid "Egypt"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,model_id:0
+msgid ""
+"Select the object on which the action will work (read, write, create)."
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+msgid "Fields Description"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CDROM"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,readonly:0
+#: field:res.partner.bank.type.field,readonly:0
+msgid "Readonly"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,type:0
+msgid "Type of Event"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_sequence_type
+#: model:ir.ui.menu,name:base.menu_ir_sequence_type
+msgid "Sequence Types"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,state:0
+#: selection:ir.module.module.dependency,state:0
+msgid "To be installed"
+msgstr ""
+
+#. module: base
+#: model:ir.module.module,shortdesc:base.module_meta_information
+#: field:res.currency,base:0
+msgid "Base"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lr
+msgid "Liberia"
+msgstr ""
+
+#. module: base
+#: view:ir.attachment:0
+#: view:ir.model:0
+#: view:res.groups:0
+#: view:res.partner:0
+#: field:res.partner,comment:0
+#: field:res.partner.function,ref:0
+msgid "Notes"
+msgstr ""
+
+#. module: base
+#: field:ir.property,value:0
+#: selection:ir.server.object.lines,type:0
+#: field:ir.server.object.lines,value:0
+#: field:ir.values,value:0
+#: field:ir.values,value_unpickle:0
+msgid "Value"
+msgstr ""
+
+#. module: base
+#: view:wizard.module.update_translations:0
+msgid "Update Translations"
+msgstr ""
+
+#. module: base
+#: view:res.config.view:0
+msgid "Set"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mc
+msgid "Monaco"
+msgstr ""
+
+#. module: base
+#: selection:ir.cron,interval_type:0
+msgid "Minutes"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,end:0
+#: wizard_view:module.upgrade,start:0
+msgid "The modules have been upgraded / installed !"
+msgstr ""
+
+#. module: base
+#: selection:ir.translation,type:0
+#: view:wizard.module.lang.export:0
+msgid "Help"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_ui_view
+msgid "ir.ui.view"
+msgstr ""
+
+#. module: base
+#: wizard_button:server.action.create,step_1,create:0
+msgid "Create"
+msgstr ""
+
+#. module: base
+#: field:ir.exports,export_fields:0
+msgid "Export ID"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.fr
+msgid "France"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,flow_stop:0
+msgid "Flow Stop"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ar
+msgid "Argentina"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.af
+msgid "Afghanistan, Islamic State of"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/wizard/wizard_module_import.py:0
+#, python-format
+msgid "Error !"
+msgstr ""
+
+#. module: base
+#: model:res.partner.bank.type.field,name:base.bank_normal_field_contry
+msgid "country_id"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,interval_type:0
+msgid "Interval Unit"
+msgstr ""
+
+#. module: base
+#: field:maintenance.contract,kind:0
+#: field:workflow.activity,kind:0
+msgid "Kind"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,start_on:0
+msgid "Manual"
+msgstr ""
+
+#. module: base
+#: field:res.bank,fax:0
+#: field:res.partner.address,fax:0
+msgid "Fax"
+msgstr ""
+
+#. module: base
+#: field:res.lang,thousands_sep:0
+msgid "Thousands Separator"
+msgstr ""
+
+#. module: base
+#: field:res.request,create_date:0
+msgid "Created Date"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,type:0
+msgid "Line Plot"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,loop_action:0
+msgid ""
+"Select the action that will be executed. Loop action will not be avaliable "
+"inside loop."
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Chinese (TW) / 正體字"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GO_UP"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_request
+msgid "res.request"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "pdf"
+msgstr ""
+
+#. module: base
+#: field:ir.default,company_id:0
+#: field:ir.property,company_id:0
+#: field:ir.sequence,company_id:0
+#: field:ir.values,company_id:0
+#: view:res.company:0
+#: field:res.currency,company_id:0
+#: field:res.partner,company_id:0
+#: field:res.partner.address,company_id:0
+#: view:res.users:0
+#: field:res.users,company:0
+#: field:res.users,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pa
+msgid "Panama"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,state:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: base
+#: view:ir.attachment:0
+msgid "Preview"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.configuration.wizard:0
+msgid "Skip Step"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pn
+msgid "Pitcairn Island"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_partner_event_type-act
+#: model:ir.ui.menu,name:base.menu_res_partner_event_type-act
+msgid "Active Partner Events"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_function_form
+#: model:ir.ui.menu,name:base.menu_partner_function_form
+#: view:res.partner.function:0
+msgid "Contact Functions"
+msgstr ""
+
+#. module: base
+#: view:multi_company.default:0
+msgid "Multi Company"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Day of the year: %(doy)s"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.nt
+msgid "Neutral Zone"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+#: view:ir.model.fields:0
+#: view:ir.property:0
+#: model:ir.ui.menu,name:base.next_id_15
+msgid "Properties"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%A - Full weekday name."
+msgstr ""
+
+#. module: base
+#: selection:ir.cron,interval_type:0
+msgid "Months"
+msgstr ""
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "Selection"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,search_view:0
+msgid "Search View"
+msgstr ""
+
+#. module: base
+#: field:ir.rule,domain_force:0
+msgid "Force Domain"
+msgstr ""
+
+#. module: base
+#: help:ir.sequence,weight:0
+msgid "If two sequences match, the highest weight will be used."
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_attachment
+#: view:ir.attachment:0
+#: model:ir.ui.menu,name:base.menu_action_attachment
+msgid "Attachments"
+msgstr ""
+
+#. module: base
+#: view:maintenance.contract.wizard:0
+msgid "_Validate"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_maintenance_contract_wizard
+msgid "maintenance.contract.wizard"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,child_ids:0
+msgid "Other Actions"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,state:0
+msgid "Done"
+msgstr ""
+
+#. module: base
+#: selection:maintenance.contract.wizard,state:0
+msgid "Validated"
+msgstr ""
+
+#. module: base
+#: model:res.partner.title,name:base.res_partner_title_miss
+msgid "Miss"
+msgstr ""
+
+#. module: base
+#: field:ir.model.access,perm_write:0
+msgid "Write Access"
+msgstr ""
+
+#. module: base
+#: field:res.bank,city:0
+#: field:res.partner,city:0
+#: field:res.partner.address,city:0
+#: field:res.partner.bank,city:0
+msgid "City"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.qa
+msgid "Qatar"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.it
+msgid "Italy"
+msgstr ""
+
+#. module: base
+#: selection:ir.rule,operator:0
+msgid "<>"
+msgstr ""
+
+#. module: base
+#: selection:ir.rule,operator:0
+msgid "<="
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Estonian / Eesti keel"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Portugese / português"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,license:0
+msgid "GPL-3 or later version"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "HTML from HTML(Mako)"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,action:0
+msgid "Python Action"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "English (US)"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,probability:0
+msgid "Probability (0.50)"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom,repeat_header:0
+msgid "Repeat Header"
+msgstr ""
+
+#. module: base
+#: view:res.bank:0
+#: field:res.users,address_id:0
+msgid "Address"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,latest_version:0
+msgid "Installed version"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_workflow_root
+msgid "Workflow Definitions"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mr
+msgid "Mauritania"
+msgstr ""
+
+#. module: base
+#: view:workflow.activity:0
+#: field:workflow.workitem,act_id:0
+msgid "Activity"
+msgstr ""
+
+#. module: base
+#: view:res.partner:0
+#: view:res.partner.address:0
+msgid "Postal Address"
+msgstr ""
+
+#. module: base
+#: field:res.company,parent_id:0
+msgid "Parent Company"
+msgstr ""
+
+#. module: base
+#: field:res.currency.rate,rate:0
+msgid "Rate"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cg
+msgid "Congo"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_exports_line
+msgid "ir.exports.line"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_PAUSE"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_country_state
+msgid "Country state"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_property_form_all
+#: model:ir.ui.menu,name:base.menu_ir_property_form_all
+msgid "All Properties"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_action_window
+#: model:ir.ui.menu,name:base.menu_ir_action_window
+msgid "Window Actions"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.kn
+msgid "Saint Kitts & Nevis Anguilla"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_HOME"
+msgstr ""
+
+#. module: base
+#: field:ir.model,name:0
+#: field:ir.model.fields,model:0
+#: field:ir.model.grid,name:0
+#: field:ir.values,model:0
+msgid "Object Name"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,srcmodel_id:0
+msgid ""
+"Object in which you want to create / write the object. If it is empty then "
+"refer to the Object field."
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,state:0
+#: selection:ir.module.module.dependency,state:0
+msgid "Not Installed"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,out_transitions:0
+msgid "Outgoing Transitions"
+msgstr ""
+
+#. module: base
+#: field:ir.ui.menu,icon:0
+msgid "Icon"
+msgstr ""
+
+#. module: base
+#: wizard_button:module.lang.import,init,finish:0
+#: wizard_button:module.lang.install,start,end:0
+#: wizard_button:module.module.update,update,open_window:0
+msgid "Ok"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.mq
+msgid "Martinique (French)"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.next_id_12
+#: view:res.request:0
+msgid "Requests"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ye
+msgid "Yemen"
+msgstr ""
+
+#. module: base
+#: selection:workflow.activity,split_mode:0
+msgid "Or"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pk
+msgid "Pakistan"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.al
+msgid "Albania"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ws
+msgid "Samoa"
+msgstr ""
+
+#. module: base
+#: field:ir.ui.menu,child_id:0
+msgid "Child IDs"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_actions.py:0
+#, python-format
+msgid "Problem in configuration `Record Id` in Server Action!"
+msgstr ""
+
+#. module: base
+#: code:addons/base/maintenance/maintenance.py:0
+#, python-format
+msgid "This error occurs on database %s"
+msgstr ""
+
+#. module: base
+#: wizard_button:base.module.import,init,import:0
+#: model:ir.actions.wizard,name:base.wizard_base_module_import
+#: model:ir.ui.menu,name:base.menu_wizard_module_import
+msgid "Import module"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DISCONNECT"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.la
+msgid "Laos"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.server,state:0
+msgid "Email"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_wizard_update_translations
+#: model:ir.ui.menu,name:base.menu_wizard_update_translations
+msgid "Resynchronise Terms"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tg
+msgid "Togo"
+msgstr ""
+
+#. module: base
+#: selection:workflow.activity,kind:0
+msgid "Stop All"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "3.  %x ,%X         ==> 12/05/08, 18:25:20"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,on_delete:0
+msgid "Cascade"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Field %d should be a figure"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_inventory_form
+#: model:ir.ui.menu,name:base.menu_action_inventory_form
+msgid "Default Company per Object"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.configuration.wizard:0
+msgid "Next Configuration Step"
+msgstr ""
+
+#. module: base
+#: field:res.groups,comment:0
+msgid "Comment"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ro
+msgid "Romania"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_PREFERENCES"
+msgstr ""
+
+#. module: base
+#: field:res.country.state,name:0
+msgid "State Name"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,join_mode:0
+msgid "Join Mode"
+msgstr ""
+
+#. module: base
+#: field:res.users,context_tz:0
+msgid "Timezone"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GOTO_LAST"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_report_xml
+#: selection:ir.ui.menu,action:0
+msgid "ir.actions.report.xml"
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid ""
+"To improve some terms of the official translations of OpenERP, you should "
+"modify the terms directly on the launchpad interface. If you made lots of "
+"translations for your own module, you can also publish all your translation "
+"at once."
+msgstr ""
+
+#. module: base
+#: wizard_button:module.lang.install,init,start:0
+msgid "Start installation"
+msgstr ""
+
+#. module: base
+#: help:res.lang,code:0
+msgid "This field is used to set/get locales for user"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_2
+msgid "OpenERP Partners"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.by
+msgid "Belarus"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,name:0
+#: field:ir.actions.act_window_close,name:0
+#: field:ir.actions.actions,name:0
+#: field:ir.actions.server,name:0
+#: field:ir.actions.url,name:0
+msgid "Action Name"
+msgstr ""
+
+#. module: base
+#: selection:res.request,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: base
+#: field:res.bank,street2:0
+#: field:res.partner.address,street2:0
+msgid "Street2"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,user_id:0
+#: field:ir.ui.view.custom,user_id:0
+#: field:ir.values,user_id:0
+#: field:res.partner.event,user_id:0
+#: view:res.users:0
+msgid "User"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pr
+msgid "Puerto Rico"
+msgstr ""
+
+#. module: base
+#: code:addons/base/res/res_currency.py:0
+#, python-format
+msgid ""
+"No rate found \n"
+"' \\n                    'for the currency: %s \n"
+"' \\n                    'at the date: %s"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.act_window:0
+msgid "Open Window"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,filter:0
+#: field:ir.module.repository,filter:0
+msgid "Filter"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ch
+msgid "Switzerland"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gd
+msgid "Grenada"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Trigger Configuration"
+msgstr ""
+
+#. module: base
+#: selection:server.action.create,init,type:0
+msgid "Open Report"
+msgstr ""
+
+#. module: base
+#: field:res.currency,rounding:0
+msgid "Rounding factor"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_company
+msgid "res.company"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,end:0
+#: wizard_view:module.upgrade,start:0
+msgid "System upgrade done"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.so
+msgid "Somalia"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_config_simple_view_form
+msgid "Configure Simple View"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_13
+msgid "Important customers"
+msgstr ""
+
+#. module: base
+#: field:res.request,act_to:0
+#: field:res.request.history,act_to:0
+msgid "To"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,args:0
+msgid "Arguments"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "sxw"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,auto:0
+msgid "Automatic XSL:RML"
+msgstr ""
+
+#. module: base
+#: view:ir.rule:0
+msgid "Manual domain setup"
+msgstr ""
+
+#. module: base
+#: field:res.partner,customer:0
+#: model:res.partner.category,name:base.res_partner_category_0
+#: selection:res.partner.event,partner_type:0
+msgid "Customer"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.custom,name:0
+#: field:ir.report.custom,name:0
+msgid "Report Name"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,shortdesc:0
+msgid "Short Description"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,partner_type:0
+msgid "Partner Relation"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,context:0
+msgid "Context Value"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Hour 00->24: %(h24)s"
+msgstr ""
+
+#. module: base
+#: help:multi_company.default,field_id:0
+msgid "Select field property"
+msgstr ""
+
+#. module: base
+#: field:res.request.history,date_sent:0
+msgid "Date sent"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Month: %(month)s"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window.view,sequence:0
+#: field:ir.actions.server,sequence:0
+#: field:ir.actions.todo,sequence:0
+#: field:ir.module.repository,sequence:0
+#: field:ir.report.custom.fields,sequence:0
+#: view:ir.sequence:0
+#: field:ir.ui.menu,sequence:0
+#: field:ir.ui.view_sc,sequence:0
+#: field:res.partner.bank,sequence:0
+#: field:wizard.ir.model.menu.create.line,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tn
+msgid "Tunisia"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.wizard,name:0
+msgid "Wizard Info"
+msgstr ""
+
+#. module: base
+#: help:ir.cron,numbercall:0
+msgid ""
+"Number of time the function is called,\n"
+"a negative number indicates that the function will always be called"
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Cancel Install"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "Legends for Date and Time Formats"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,frequency:0
+msgid "Monthly"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_partner_som-act
+#: model:ir.ui.menu,name:base.menu_res_partner_som-act
+msgid "States of mind"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_country_state
+#: model:ir.ui.menu,name:base.menu_country_state_partner
+msgid "Fed. States"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+#: view:res.groups:0
+msgid "Access Rules"
+msgstr ""
+
+#. module: base
+#: field:ir.default,ref_table:0
+msgid "Table Ref."
+msgstr ""
+
+#. module: base
+#: field:res.roles,parent_id:0
+msgid "Parent"
+msgstr ""
+
+#. module: base
+#: view:multi_company.default:0
+msgid "Returning"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,res_model:0
+#: field:ir.actions.report.custom,model:0
+#: field:ir.actions.report.xml,model:0
+#: field:ir.actions.server,model_id:0
+#: field:ir.actions.wizard,model:0
+#: field:ir.cron,model:0
+#: field:ir.default,field_tbl:0
+#: view:ir.model:0
+#: field:ir.model,model:0
+#: field:ir.model.access,model_id:0
+#: field:ir.model.data,model:0
+#: field:ir.model.grid,model:0
+#: field:ir.report.custom,model_id:0
+#: field:ir.rule.group,model_id:0
+#: selection:ir.translation,type:0
+#: field:ir.ui.view,model:0
+#: field:ir.values,model_id:0
+#: field:res.request.link,object:0
+#: field:wizard.ir.model.menu.create,model_id:0
+#: field:workflow.triggers,model:0
+msgid "Object"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_default
+msgid "ir.default"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Minute: %(min)s"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ZOOM_100"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%w - Weekday as a decimal number [0(Sunday),6]."
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "Export translation file"
+msgstr ""
+
+#. module: base
+#: field:ir.ui.view_sc,user_id:0
+msgid "User Ref."
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_base_config
+#: model:ir.ui.menu,name:base.menu_config
+#: view:res.company:0
+msgid "Configuration"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,expression:0
+msgid "Loop Expression"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.event,partner_type:0
+msgid "Retailer"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,type:0
+msgid "Tabular"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.todo,start_on:0
+msgid "Start On"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_5
+msgid "Gold Partner"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner
+#: field:res.company,partner_id:0
+#: field:res.partner.address,partner_id:0
+#: field:res.partner.bank,partner_id:0
+#: field:res.partner.event,partner_id:0
+#: selection:res.partner.title,domain:0
+#: view:res.users:0
+msgid "Partner"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tr
+msgid "Turkey"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.fk
+msgid "Falkland Islands"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.report.xml,report_type:0
+msgid "odt"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.custom,type:0
+#: field:ir.actions.report.xml,type:0
+#: field:ir.report.custom,type:0
+msgid "Report Type"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.todo,state:0
+#: field:ir.module.module,state:0
+#: field:ir.module.module.dependency,state:0
+#: field:ir.report.custom,state:0
+#: field:maintenance.contract,state:0
+#: field:res.bank,state:0
+#: view:res.country.state:0
+#: field:res.partner.bank,state_id:0
+#: field:res.request,state:0
+#: field:workflow.instance,state:0
+#: field:workflow.workitem,state:0
+msgid "State"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,license:0
+msgid "Other proprietary"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-administration"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_translation
+#: model:ir.ui.menu,name:base.menu_action_translation
+msgid "All terms"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.no
+msgid "Norway"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "4.  %b, %B         ==> Dec, December"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.wizard_lang_install
+#: model:ir.ui.menu,name:base.menu_wizard_lang_install
+msgid "Load an Official Translation"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_10
+msgid "Open Source Service Company"
+msgstr ""
+
+#. module: base
+#: selection:res.request,state:0
+msgid "waiting"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,link:0
+msgid "Link"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_workflow_triggers
+msgid "workflow.triggers"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,report_id:0
+msgid "Report Ref"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-hr"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.wizard,multi:0
+msgid ""
+"If set to true, the wizard will not be displayed on the right toolbar of a "
+"form view."
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DND"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.hm
+msgid "Heard and McDonald Islands"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,view_id:0
+msgid "View Ref."
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Dutch (Belgium) / Nederlands (Belgïe)"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.open_repository_tree
+#: view:ir.module.repository:0
+#: model:ir.ui.menu,name:base.menu_module_repository_tree
+msgid "Repository list"
+msgstr ""
+
+#. module: base
+#: field:res.company,rml_header1:0
+msgid "Report Header"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,type:0
+#: field:ir.actions.act_window_close,type:0
+#: field:ir.actions.actions,type:0
+#: field:ir.actions.server,state:0
+#: field:ir.actions.server,type:0
+#: field:ir.actions.url,type:0
+#: field:ir.actions.wizard,type:0
+msgid "Action Type"
+msgstr ""
+
+#. module: base
+#: field:res.partner.bank.type,field_ids:0
+msgid "Type fields"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,category_id:0
+msgid "Category"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_FLOPPY"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,sms:0
+#: selection:ir.actions.server,state:0
+msgid "SMS"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cr
+msgid "Costa Rica"
+msgstr ""
+
+#. module: base
+#: code:addons/base/maintenance/maintenance.py:0
+#, python-format
+msgid "Your can't submit bug reports due to uncovered modules: %s"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_other_form
+msgid "Other Partners"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+#: view:res.request:0
+msgid "Status"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_currency_form
+#: model:ir.ui.menu,name:base.menu_action_currency_form
+#: view:res.currency:0
+msgid "Currencies"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Hour 00->12: %(h12)s"
+msgstr ""
+
+#. module: base
+#: help:res.partner.address,active:0
+msgid "Uncheck the active field to hide the contact."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.dk
+msgid "Denmark"
+msgstr ""
+
+#. module: base
+#: field:res.country,code:0
+msgid "Country Code"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_workflow_instance
+msgid "workflow.instance"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "10. %S              ==> 20"
+msgstr ""
+
+#. module: base
+#: model:res.partner.title,name:base.res_partner_title_madam
+msgid "Madam"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ee
+msgid "Estonia"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.nl
+msgid "Netherlands"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.next_id_4
+msgid "Low Level Objects"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_report_custom
+msgid "ir.report.custom"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.event,type:0
+msgid "Purchase Offer"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_values
+msgid "ir.values"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_ZOOM_FIT"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cd
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#. module: base
+#: view:res.request:0
+#: field:res.request,body:0
+#: field:res.request.history,req_id:0
+msgid "Request"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.jp
+msgid "Japan"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,numbercall:0
+msgid "Number of Calls"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.install,start:0
+msgid "Language file loaded."
+msgstr ""
+
+#. module: base
+#: wizard_view:module.upgrade,next:0
+#: wizard_field:module.upgrade,next,module_info:0
+msgid "Modules to update"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action2
+msgid "Company Architecture"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GOTO_BOTTOM"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,sequence:0
+msgid ""
+"Important when you deal with multiple actions, the execution order will be "
+"decided based on this, low number is higher priority."
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,header:0
+msgid "Add RML header"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gr
+msgid "Greece"
+msgstr ""
+
+#. module: base
+#: field:res.request,trigger_date:0
+msgid "Trigger Date"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Croatian / hrvatski jezik"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_GO_FORWARD"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,code:0
+msgid "Python code to be executed"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module.dependency,state:0
+msgid "Uninstallable"
+msgstr ""
+
+#. module: base
+#: view:res.partner.category:0
+msgid "Partner Category"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+#: selection:ir.actions.server,state:0
+msgid "Trigger"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,translate:0
+msgid "Translate"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid ""
+"Access all the fields related to the current object using expression in "
+"double brackets, i.e. [[ object.partner_id.name ]]"
+msgstr ""
+
+#. module: base
+#: field:res.request.history,body:0
+msgid "Body"
+msgstr ""
+
+#. module: base
+#: wizard_button:res.partner.spam_send,init,send:0
+msgid "Send Email"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_SELECT_FONT"
+msgstr ""
+
+#. module: base
+#: field:res.users,menu_id:0
+msgid "Menu Action"
+msgstr ""
+
+#. module: base
+#: selection:wizard.module.lang.export,state:0
+msgid "choose"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.act_window.view,view_mode:0
+#: selection:ir.ui.view,type:0
+#: selection:wizard.ir.model.menu.create.line,view_type:0
+msgid "Graph"
+msgstr ""
+
+#. module: base
+#: field:res.partner,child_ids:0
+#: field:res.request,ref_partner_id:0
+msgid "Partner Ref."
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom,print_format:0
+msgid "Print format"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_low_workflow
+msgid "Workflow Items"
+msgstr ""
+
+#. module: base
+#: field:res.request,ref_doc2:0
+msgid "Document Ref 2"
+msgstr ""
+
+#. module: base
+#: field:res.request,ref_doc1:0
+msgid "Document Ref 1"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ga
+msgid "Gabon"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_model_data
+msgid "ir.model.data"
+msgstr ""
+
+#. module: base
+#: view:ir.model:0
+#: view:res.groups:0
+msgid "Access Rights"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gl
+msgid "Greenland"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.report.xml,report_rml:0
+msgid ""
+"The .rml path of the file or NULL if the content is in report_rml_content"
+msgstr ""
+
+#. module: base
+#: field:res.partner.bank,acc_number:0
+msgid "Account Number"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "1.  %c              ==> Fri Dec  5 18:25:20 2008"
+msgstr ""
+
+#. module: base
+#: help:ir.ui.menu,groups_id:0
+msgid ""
+"If you have groups, the visibility of this menu will be based on these "
+"groups. If this field is empty, Open ERP will compute visibility based on "
+"the related object's read access."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.nc
+msgid "New Caledonia (French)"
+msgstr ""
+
+#. module: base
+#: field:res.partner.function,name:0
+msgid "Function Name"
+msgstr ""
+
+#. module: base
+#: view:maintenance.contract.wizard:0
+msgid "_Cancel"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cy
+msgid "Cyprus"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,subject:0
+#: wizard_field:res.partner.spam_send,init,subject:0
+#: field:res.request,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: base
+#: field:res.request,act_from:0
+#: field:res.request.history,act_from:0
+msgid "From"
+msgstr ""
+
+#. module: base
+#: wizard_button:server.action.create,init,step_1:0
+msgid "Next"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-report"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_rml_content:0
+#: field:ir.actions.report.xml,report_rml_content_data:0
+msgid "RML content"
+msgstr ""
+
+#. module: base
+#: view:workflow.activity:0
+msgid "Incoming transitions"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cn
+msgid "China"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_model.py:0
+#, python-format
+msgid "Password empty !"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.eh
+msgid "Western Sahara"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_workflow
+msgid "workflow"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.id
+msgid "Indonesia"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,start_on:0
+msgid "At Once"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.server,state:0
+msgid "Write Object"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bg
+msgid "Bulgaria"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ao
+msgid "Angola"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tf
+msgid "French Southern Territories"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid ""
+"Only one client action will be execute, last                                 "
+"clinent action will be consider in case of multiples clients actions"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_HELP"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_currency
+#: view:res.company:0
+#: field:res.company,currency_id:0
+#: field:res.company,currency_ids:0
+#: view:res.currency:0
+#: field:res.currency,name:0
+#: field:res.currency.rate,currency_id:0
+msgid "Currency"
+msgstr ""
+
+#. module: base
+#: field:res.partner.canal,name:0
+msgid "Channel Name"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "5.  %y, %Y         ==> 08, 2008"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,model_id:0
+#: field:ir.values,res_id:0
+msgid "Object ID"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,print_orientation:0
+msgid "Landscape"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_form
+#: model:ir.ui.menu,name:base.menu_base_config_partner
+#: model:ir.ui.menu,name:base.menu_base_partner
+#: model:ir.ui.menu,name:base.menu_partner_form
+#: view:res.partner:0
+#: view:res.partner.category:0
+#: field:res.partner.category,partner_ids:0
+msgid "Partners"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_administration
+msgid "Administration"
+msgstr ""
+
+#. module: base
+#: selection:ir.rule,operator:0
+msgid "child_of"
+msgstr ""
+
+#. module: base
+#: view:res.users:0
+#: field:res.users,company_ids:0
+msgid "Accepted Companies"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom.fields,operation:0
+#: field:ir.ui.menu,icon_pict:0
+#: field:wizard.module.lang.export,state:0
+msgid "unknown"
+msgstr ""
+
+#. module: base
+#: field:ir.ui.view_sc,res_id:0
+msgid "Resource Ref."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ki
+msgid "Kiribati"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.iq
+msgid "Iraq"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Action to Launch"
+msgstr ""
+
+#. module: base
+#: wizard_view:base.module.import,import:0
+#: wizard_view:base.module.import,init:0
+msgid "Module import"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_sequence_type
+msgid "ir.sequence.type"
+msgstr ""
+
+#. module: base
+#: selection:wizard.module.lang.export,format:0
+msgid "CSV File"
+msgstr ""
+
+#. module: base
+#: selection:ir.model,state:0
+#: selection:ir.model.grid,state:0
+msgid "Base Object"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-crm"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_STRIKETHROUGH"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,fc0_op:0
+#: selection:ir.report.custom.fields,fc1_op:0
+#: selection:ir.report.custom.fields,fc2_op:0
+#: selection:ir.report.custom.fields,fc3_op:0
+msgid "(year)="
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "Dependencies :"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-partner"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,field_description:0
+msgid "Field Label"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.dj
+msgid "Djibouti"
+msgstr ""
+
+#. module: base
+#: field:ir.translation,value:0
+msgid "Translation Value"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ag
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,condition:0
+#: field:ir.report.custom.fields,fc0_condition:0
+#: field:ir.sequence,condition:0
+#: view:multi_company.default:0
+#: field:workflow.transition,condition:0
+msgid "Condition"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.zr
+msgid "Zaire"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,res_id:0
+#: field:ir.model.data,res_id:0
+#: field:ir.translation,res_id:0
+#: field:workflow.instance,res_id:0
+#: field:workflow.triggers,res_id:0
+msgid "Resource ID"
+msgstr ""
+
+#. module: base
+#: view:ir.cron:0
+#: field:ir.model,info:0
+#: field:ir.model.grid,info:0
+#: view:maintenance.contract:0
+msgid "Information"
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid ""
+"The official translations pack of all OpenERP/OpenObjects module are managed "
+"through launchpad. We use their online interface to synchronize all "
+"translations efforts."
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_rml:0
+msgid "RML path"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.configuration.wizard,item_id:0
+msgid "Next Configuration Wizard"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.todo,type:0
+#: selection:res.partner.address,type:0
+msgid "Other"
+msgstr ""
+
+#. module: base
+#: view:res.request:0
+msgid "Reply"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Turkish / Türkçe"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_translation_untrans
+#: model:ir.ui.menu,name:base.menu_action_translation_untrans
+msgid "Untranslated terms"
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.import,init:0
+msgid "Import New Language"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_workflow_activity_form
+#: model:ir.ui.menu,name:base.menu_workflow_activity
+#: view:workflow:0
+#: field:workflow,activities:0
+msgid "Activities"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,auto_refresh:0
+msgid "Auto-Refresh"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,fc0_op:0
+#: selection:ir.report.custom.fields,fc1_op:0
+#: selection:ir.report.custom.fields,fc2_op:0
+#: selection:ir.report.custom.fields,fc3_op:0
+#: selection:ir.rule,operator:0
+msgid "="
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Second field should be figures"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_model_grid_security
+#: model:ir.ui.menu,name:base.menu_ir_access_grid
+msgid "Access Controls Grid"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.ir_sequence_actions
+#: model:ir.ui.menu,name:base.menu_custom_action
+#: model:ir.ui.menu,name:base.menu_ir_sequence_actions
+#: model:ir.ui.menu,name:base.next_id_6
+msgid "Actions"
+msgstr ""
+
+#. module: base
+#: selection:res.request,priority:0
+msgid "High"
+msgstr ""
+
+#. module: base
+#: field:ir.exports.line,export_id:0
+msgid "Export"
+msgstr ""
+
+#. module: base
+#: help:res.bank,bic:0
+msgid "Bank Identifier Code"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tm
+msgid "Turkmenistan"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.pm
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.report.xml,header:0
+msgid "Add or not the coporate RML header"
+msgstr ""
+
+#. module: base
+#: field:res.partner.event,document:0
+msgid "Document"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_REFRESH"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_STOP"
+msgstr ""
+
+#. module: base
+#: view:wizard.module.update_translations:0
+msgid "Update"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.report.xml,name:base.ir_module_reference_print
+msgid "Technical guide"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_CONVERT"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tz
+msgid "Tanzania"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Danish / Dansk"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cx
+msgid "Christmas Island"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.server:0
+msgid "Other Actions Configuration"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_EXECUTE"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.res_partner_canal-act
+#: model:ir.model,name:base.model_res_partner_canal
+#: model:ir.ui.menu,name:base.menu_res_partner_canal-act
+msgid "Channels"
+msgstr ""
+
+#. module: base
+#: view:ir.module.module:0
+msgid "Schedule for Installation"
+msgstr ""
+
+#. module: base
+#: selection:ir.model.fields,select_level:0
+msgid "Advanced Search"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_partner_bank
+#: view:res.partner.bank:0
+msgid "Bank Accounts"
+msgstr ""
+
+#. module: base
+#: view:res.request:0
+msgid "Send"
+msgstr ""
+
+#. module: base
+#: field:ir.translation,src:0
+msgid "Source"
+msgstr ""
+
+#. module: base
+#: help:res.partner.address,partner_id:0
+msgid "Keep empty for a private address, not related to partner."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.vu
+msgid "Vanuatu"
+msgstr ""
+
+#. module: base
+#: view:res.company:0
+msgid "Internal Header/Footer"
+msgstr ""
+
+#. module: base
+#: code:addons/base/module/wizard/wizard_export_lang.py:0
+#, python-format
+msgid ""
+"Save this document to a .tgz file. This archive containt UTF-8 %s files and "
+"may be uploaded to launchpad."
+msgstr ""
+
+#. module: base
+#: wizard_button:module.upgrade,end,config:0
+#: wizard_button:module.upgrade,start,config:0
+msgid "Start configuration"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Catalan / Català"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.do
+msgid "Dominican Republic"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_COLOR_PICKER"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sa
+msgid "Saudi Arabia"
+msgstr ""
+
+#. module: base
+#: code:addons/base/ir/ir_report_custom.py:0
+#, python-format
+msgid "Bar charts need at least two fields"
+msgstr ""
+
+#. module: base
+#: help:res.partner,supplier:0
+msgid ""
+"Check this box if the partner is a supplier. If it's not checked, purchase "
+"people will not see it when encoding a purchase order."
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,relation_field:0
+msgid "Relation Field"
+msgstr ""
+
+#. module: base
+#: field:workflow.triggers,instance_id:0
+msgid "Destination Instance"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.wizard,multi:0
+msgid "Action on Multiple Doc."
+msgstr ""
+
+#. module: base
+#: view:wizard.module.lang.export:0
+msgid "https://translations.launchpad.net/openobject"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.todo,start_date:0
+msgid "Start Date"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,report_xml:0
+msgid "XML path"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gn
+msgid "Guinea"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lu
+msgid "Luxembourg"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.todo,note:base.config_wizard_step_user
+msgid ""
+"Create your users.\n"
+"You will be able to assign groups to users. Groups define the access rights "
+"of each users on the different objects of the system.\n"
+"            "
+msgstr ""
+
+#. module: base
+#: selection:res.request,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: base
+#: view:ir.values:0
+msgid "tree_but_action, client_print_multi"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sv
+msgid "El Salvador"
+msgstr ""
+
+#. module: base
+#: field:res.bank,phone:0
+#: field:res.partner.address,phone:0
+msgid "Phone"
+msgstr ""
+
+#. module: base
+#: field:res.groups,menu_access:0
+msgid "Access Menu"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.th
+msgid "Thailand"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,fc0_op:0
+#: selection:ir.report.custom.fields,fc1_op:0
+#: selection:ir.report.custom.fields,fc2_op:0
+#: selection:ir.report.custom.fields,fc3_op:0
+msgid ">"
+msgstr ""
+
+#. module: base
+#: field:ir.model.access,perm_unlink:0
+msgid "Delete Permission"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_multi_company_default
+msgid "multi_company.default"
+msgstr ""
+
+#. module: base
+#: selection:workflow.activity,join_mode:0
+#: selection:workflow.activity,split_mode:0
+msgid "And"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,relation:0
+msgid "Object Relation"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_PRINT"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,fc0_op:0
+#: selection:ir.report.custom.fields,fc1_op:0
+#: selection:ir.report.custom.fields,fc2_op:0
+#: selection:ir.report.custom.fields,fc3_op:0
+msgid "<"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.uz
+msgid "Uzbekistan"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_act_window
+#: selection:ir.ui.menu,action:0
+msgid "ir.actions.act_window"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.vi
+msgid "Virgin Islands (USA)"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tw
+msgid "Taiwan"
+msgstr ""
+
+#. module: base
+#: view:ir.rule:0
+msgid "If you don't force the domain, it will use the simple domain setup"
+msgstr ""
+
+#. module: base
+#: field:ir.report.custom,field_parent:0
+#: field:ir.ui.view,field_parent:0
+msgid "Child Field"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,usage:0
+#: field:ir.actions.act_window_close,usage:0
+#: field:ir.actions.actions,usage:0
+#: field:ir.actions.report.custom,usage:0
+#: field:ir.actions.report.xml,usage:0
+#: field:ir.actions.server,usage:0
+#: field:ir.actions.wizard,usage:0
+msgid "Action Usage"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_workflow_workitem
+msgid "workflow.workitem"
+msgstr ""
+
+#. module: base
+#: selection:ir.module.module,state:0
+msgid "Not Installable"
+msgstr ""
+
+#. module: base
+#: rml:ir.module.reference:0
+msgid "View :"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,view_load:0
+msgid "View Auto-Load"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_supplier_form
+#: view:res.partner:0
+msgid "Suppliers"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_JUMP_TO"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.todo,end_date:0
+msgid "End Date"
+msgstr ""
+
+#. module: base
+#: field:ir.exports,resource:0
+#: field:ir.property,res_id:0
+msgid "Resource"
+msgstr ""
+
+#. module: base
+#: field:maintenance.contract,name:0
+#: field:maintenance.contract.wizard,name:0
+msgid "Contract ID"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,alignment:0
+msgid "center"
+msgstr ""
+
+#. module: base
+#: field:maintenance.contract.wizard,state:0
+msgid "States"
+msgstr ""
+
+#. module: base
+#: view:multi_company.default:0
+msgid "Matching"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.configuration.wizard,name:0
+msgid "Next Wizard"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,datas_fname:0
+#: field:wizard.module.lang.export,name:0
+msgid "Filename"
+msgstr ""
+
+#. module: base
+#: field:ir.model,access_ids:0
+#: field:ir.model.grid,access_ids:0
+msgid "Access"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sk
+msgid "Slovak Republic"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.aw
+msgid "Aruba"
+msgstr ""
+
+#. module: base
+#: selection:ir.cron,interval_type:0
+msgid "Weeks"
+msgstr ""
+
+#. module: base
+#: field:res.groups,name:0
+msgid "Group Name"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.bh
+msgid "Bahrain"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_12
+msgid "Segmentation"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_FIND"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_maintenance_contract_add_wizard
+#: model:ir.ui.menu,name:base.menu_maintenance_contract_add
+#: view:maintenance.contract.wizard:0
+msgid "Add Maintenance Contract"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Vietnam / Cộng hòa xã hội chủ nghĩa Việt Nam"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.act_window,limit:0
+#: field:ir.report.custom,limitt:0
+msgid "Limit"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,wkf_model_id:0
+msgid "Workflow to be executed on this model."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.jm
+msgid "Jamaica"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.az
+msgid "Azerbaijan"
+msgstr ""
+
+#. module: base
+#: code:addons/base/res/partner/partner.py:0
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Arabic / الْعَرَبيّة"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gi
+msgid "Gibraltar"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.vg
+msgid "Virgin Islands (British)"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_MEDIA_PREVIOUS"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Czech / Čeština"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.wf
+msgid "Wallis and Futuna Islands"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.rw
+msgid "Rwanda"
+msgstr ""
+
+#. module: base
+#: constraint:res.partner:0
+msgid "The VAT doesn't seem to be correct."
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom.fields,operation:0
+msgid "Calculate Sum"
+msgstr ""
+
+#. module: base
+#: view:ir.sequence:0
+msgid "Day of the week (0:Monday): %(weekday)s"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.ck
+msgid "Cook Islands"
+msgstr ""
+
+#. module: base
+#: help:ir.actions.server,mobile:0
+msgid ""
+"Provides fields that be used to fetch the mobile number, e.g. you select the "
+"invoice, then `object.invoice_address_id.mobile` is the field which gives "
+"the correct mobile number"
+msgstr ""
+
+#. module: base
+#: field:ir.model.data,noupdate:0
+msgid "Non Updatable"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Klingon"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sg
+msgid "Singapore"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.act_window,target:0
+msgid "Current Window"
+msgstr ""
+
+#. module: base
+#: view:ir.values:0
+msgid "Action Source"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_NETWORK"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_res_country
+#: field:res.bank,country:0
+#: view:res.country:0
+#: field:res.country.state,country_id:0
+#: field:res.partner,country:0
+#: field:res.partner.address,country_id:0
+#: field:res.partner.bank,country_id:0
+msgid "Country"
+msgstr ""
+
+#. module: base
+#: field:ir.model.fields,complete_name:0
+#: field:ir.ui.menu,complete_name:0
+msgid "Complete Name"
+msgstr ""
+
+#. module: base
+#: view:ir.report.custom:0
+msgid "Subscribe Report"
+msgstr ""
+
+#. module: base
+#: field:ir.values,object:0
+msgid "Is Object"
+msgstr ""
+
+#. module: base
+#: field:res.partner.category,name:0
+msgid "Category Name"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.act_window:0
+msgid "Select Groups"
+msgstr ""
+
+#. module: base
+#: field:ir.sequence,weight:0
+msgid "Weight"
+msgstr ""
+
+#. module: base
+#: view:res.lang:0
+msgid "%X - Appropriate time representation."
+msgstr ""
+
+#. module: base
+#: view:res.company:0
+msgid "Your Logo - Use a size of about 450x150 pixels."
+msgstr ""
+
+#. module: base
+#: help:res.lang,grouping:0
+msgid ""
+"The Separator Format should be like [,n] where 0 < n :starting from Unit "
+"digit.-1 will end the separation. e.g. [3,2,-1] will represent 106500 to be "
+"1,06,500;[1,2,-1] will represent it to be 106,50,0;[3] will represent it as "
+"106,500. Provided ',' as the thousand separator in each case."
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_customer_form_new
+msgid "New Partner"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,print_orientation:0
+msgid "Portrait"
+msgstr ""
+
+#. module: base
+#: selection:ir.translation,type:0
+msgid "Wizard Button"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_DIRECTORY"
+msgstr ""
+
+#. module: base
+#: field:ir.module.module,installed_version:0
+msgid "Latest version"
+msgstr ""
+
+#. module: base
+#: model:ir.model,name:base.model_ir_actions_server
+msgid "ir.actions.server"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_rule
+#: model:ir.ui.menu,name:base.menu_action_rule
+msgid "Record Rules"
+msgstr ""
+
+#. module: base
+#: view:ir.actions.report.custom:0
+msgid "Report custom"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.configuration.wizard,progress:0
+msgid "Configuration Progress"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.next_id_11
+msgid "Configuration Wizards"
+msgstr ""
+
+#. module: base
+#: field:res.lang,code:0
+msgid "Locale Code"
+msgstr ""
+
+#. module: base
+#: field:workflow.activity,split_mode:0
+msgid "Split Mode"
+msgstr ""
+
+#. module: base
+#: model:ir.ui.menu,name:base.menu_localisation
+msgid "Localisation"
+msgstr ""
+
+#. module: base
+#: selection:res.config.view,view:0
+msgid "Simplified Interface"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.cl
+msgid "Chile"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "STOCK_REVERT_TO_SAVED"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.wizard,name:base.wizard_lang_import
+#: model:ir.ui.menu,name:base.menu_wizard_lang_import
+msgid "Import a Translation File"
+msgstr ""
+
+#. module: base
+#: help:ir.values,model_id:0
+msgid "This field is not used, it only helps you to select a good model."
+msgstr ""
+
+#. module: base
+#: field:ir.ui.view,name:0
+msgid "View Name"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Italian / Italiano"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.report.xml,attachment:0
+msgid "Save As Attachment Prefix"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.hr
+msgid "Croatia"
+msgstr ""
+
+#. module: base
+#: field:ir.actions.server,mobile:0
+msgid "Mobile No"
+msgstr ""
+
+#. module: base
+#: model:ir.actions.act_window,name:base.action_partner_by_category
+#: model:ir.actions.act_window,name:base.action_partner_category_form
+#: model:ir.model,name:base.model_res_partner_category
+#: model:ir.ui.menu,name:base.menu_partner_category_form
+#: view:res.partner.category:0
+msgid "Partner Categories"
+msgstr ""
+
+#. module: base
+#: field:ir.sequence,code:0
+#: field:ir.sequence.type,code:0
+msgid "Sequence Code"
+msgstr ""
+
+#. module: base
+#: selection:ir.report.custom,print_format:0
+msgid "a5"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sc
+msgid "Seychelles"
+msgstr ""
+
+#. module: base
+#: code:addons/base/res/res_user.py:0
+#, python-format
+msgid "You can not have two users with the same login !"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.sl
+msgid "Sierra Leone"
+msgstr ""
+
+#. module: base
+#: view:res.company:0
+#: view:res.partner:0
+msgid "General Information"
+msgstr ""
+
+#. module: base
+#: selection:ir.ui.menu,icon:0
+msgid "terp-product"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.tc
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#. module: base
+#: field:res.partner.bank,owner_name:0
+msgid "Account Owner"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,res_model:0
+#: field:workflow,osv:0
+#: field:workflow.instance,res_type:0
+msgid "Resource Object"
+msgstr ""
+
+#. module: base
+#: field:ir.cron,function:0
+#: field:res.partner.address,function:0
+#: selection:workflow.activity,kind:0
+msgid "Function"
+msgstr ""
+
+#. module: base
+#: selection:res.partner.address,type:0
+msgid "Delivery"
+msgstr ""
+
+#. module: base
+#: field:ir.attachment,preview:0
+msgid "Image Preview"
+msgstr ""
+
+#. module: base
+#: model:res.partner.title,name:base.res_partner_title_pvt_ltd
+msgid "Corp."
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.gw
+msgid "Guinea Bissau"
+msgstr ""
+
+#. module: base
+#: view:workflow.instance:0
+msgid "Workflow Instances"
+msgstr ""
+
+#. module: base
+#: code:addons/base/res/partner/partner.py:0
+#, python-format
+msgid "Partners: "
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.kp
+msgid "North Korea"
+msgstr ""
+
+#. module: base
+#: view:ir.report.custom:0
+msgid "Unsubscribe Report"
+msgstr ""
+
+#. module: base
+#: selection:ir.actions.server,state:0
+msgid "Create Object"
+msgstr ""
+
+#. module: base
+#: field:res.bank,bic:0
+msgid "BIC/Swift code"
+msgstr ""
+
+#. module: base
+#: model:res.partner.category,name:base.res_partner_category_1
+msgid "Prospect"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Polish / Język polski"
+msgstr ""
+
+#. module: base
+#: field:ir.exports,name:0
+msgid "Export Name"
+msgstr ""
+
+#. module: base
+#: help:res.partner.address,type:0
+msgid ""
+"Used to select automatically the right address according to the context in "
+"sales and purchases documents."
+msgstr ""
+
+#. module: base
+#: wizard_view:module.lang.install,init:0
+msgid "Choose a language to install:"
+msgstr ""
+
+#. module: base
+#: model:res.country,name:base.lk
+msgid "Sri Lanka"
+msgstr ""
+
+#. module: base
+#: selection:module.lang.install,init,lang:0
+msgid "Russian / русский язык"
+msgstr "Russian / русский язык"
index 2303ddf..cfcfb68 100644 (file)
@@ -7,14 +7,14 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-02-07 05:11+0000\n"
-"Last-Translator: Jordi Esteve - http://www.zikzakmedia.com "
+"PO-Revision-Date: 2010-05-02 05:52+0000\n"
+"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
 "<jesteve@zikzakmedia.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -389,7 +389,7 @@ msgid ""
 "name, it returns the previous report."
 msgstr ""
 "Si marca esta opción, cuando el usuario imprima el mismo nombre de adjunto "
-"por segunda vez, devolverá el informe anterior."
+"por segunda vez, obtendrá el informe anterior."
 
 #. module: base
 #: help:res.lang,iso_code:0
@@ -434,8 +434,8 @@ msgid ""
 "The ISO country code in two chars.\n"
 "You can use this field for quick search."
 msgstr ""
-"EL código ISO del país en dos caracteres.\n"
-"Puede usar este campo para la búsqueda rápida."
+"EL código ISO del país de dos caracteres.\n"
+"Puede utilizar este campo para la búsqueda rápida."
 
 #. module: base
 #: selection:workflow.activity,join_mode:0
@@ -3127,7 +3127,8 @@ msgid ""
 "The internal user that is in charge of communicating with this partner if "
 "any."
 msgstr ""
-"El usuario interno que se encarga de comunicarse con esta empresa si hay."
+"El usuario interno que se encarga de comunicarse con esta empresa, si los "
+"hubiera."
 
 #. module: base
 #: field:res.partner,parent_id:0
@@ -5076,8 +5077,8 @@ msgstr "Islandia"
 #: view:res.users:0
 msgid "Roles are used to defined available actions, provided by workflows."
 msgstr ""
-"Los roles se utilizan para definir las acciones disponibles, que son "
-"proporcionadas por los flujos."
+"Los roles se utilizan para definir las acciones disponibles dentro de un "
+"flujo de trabajo."
 
 #. module: base
 #: model:res.country,name:base.de
@@ -5830,7 +5831,7 @@ msgstr "Compañía por defecto por objeto"
 #. module: base
 #: view:ir.actions.configuration.wizard:0
 msgid "Next Configuration Step"
-msgstr "Siguiente paso configuración"
+msgstr "Siguiente paso de la configuración"
 
 #. module: base
 #: field:res.groups,comment:0
index 80a3f8b..1d35414 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 20ee5cb..5354c94 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index c261d52..06da2bb 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index aaf3d1c..10c25bb 100644 (file)
@@ -9,7 +9,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:42+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 "X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
 "X-Poedit-Language: Persian\n"
index 5ab8546..1573f72 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 0de4977..05e3def 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-01-21 05:27+0000\n"
-"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
+"PO-Revision-Date: 2010-04-25 04:24+0000\n"
+"Last-Translator: OpenERP Administrators <Unknown>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -614,7 +614,7 @@ msgstr "Vous devrez réinstaller quelques packs de langue."
 #. module: base
 #: field:res.partner.address,mobile:0
 msgid "Mobile"
-msgstr "Téléphone mobile"
+msgstr "Port."
 
 #. module: base
 #: model:res.country,name:base.om
@@ -1121,6 +1121,9 @@ msgid ""
 "consider the present one as void. Do not hesitate to contact our accounting "
 "department at (+32).81.81.37.00."
 msgstr ""
+"Veuillez ne pas prendre en considération ce mail si votre paiement a été "
+"effectué après que nous vous l'ayons adressé. N'hésitez pas à contacter "
+"notre service comptable au (+ 32).81.81.37.00."
 
 #. module: base
 #: selection:ir.ui.menu,icon:0
@@ -3472,7 +3475,7 @@ msgstr "Configuration de l'action client"
 #: model:ir.ui.menu,name:base.menu_partner_address_form
 #: view:res.partner.address:0
 msgid "Partner Addresses"
-msgstr "Adresses des partenaires"
+msgstr "Carnet d'adresses"
 
 #. module: base
 #: selection:module.lang.install,init,lang:0
@@ -7421,7 +7424,7 @@ msgstr "Salvador"
 #: field:res.bank,phone:0
 #: field:res.partner.address,phone:0
 msgid "Phone"
-msgstr "Numéro de téléphone"
+msgstr "Tél."
 
 #. module: base
 #: field:res.groups,menu_access:0
index e12b615..521e7f8 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 8c423c9..0b23d95 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index b21fdb4..f994df7 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-22 07:17+0000\n"
+"PO-Revision-Date: 2010-06-01 05:21+0000\n"
 "Last-Translator: goranc <goranc@gmail.com>\n"
 "Language-Team: openerp-translators\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-23 03:44+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:32+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 "Language: hr\n"
 
index ce508e3..b5cf075 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 8408f53..9b11df7 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 3212f17..8d65060 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 253250b..5b9f804 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-03-31 05:14+0000\n"
-"Last-Translator: OpenERP Administrators <Unknown>\n"
+"PO-Revision-Date: 2010-05-17 05:31+0000\n"
+"Last-Translator: eLBati - albatos.com <lorenzo.battistini@albatos.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -422,7 +422,7 @@ msgstr "Colombia"
 #. module: base
 #: view:ir.module.module:0
 msgid "Schedule Upgrade"
-msgstr "Aggiornamento Programmazione"
+msgstr "Pianifica l'aggiornamento"
 
 #. module: base
 #: field:ir.actions.report.custom,report_id:0
@@ -901,7 +901,7 @@ msgstr "Relazione"
 #. module: base
 #: field:ir.model.access,perm_read:0
 msgid "Read Access"
-msgstr "Accesso di Lettura"
+msgstr "Accesso in lettura"
 
 #. module: base
 #: model:ir.model,name:base.model_ir_exports
@@ -2150,10 +2150,7 @@ msgstr "Crea Menu"
 msgid ""
 "Value Added Tax number. Check the box if the partner is subjected to the "
 "VAT. Used by the VAT legal statement."
-msgstr ""
-"numero di Partita IVA (Imposta sul valore Aggiunto - VAT). Seleziona la "
-"casella se il partner è soggetto IVA. Usato dalla dichiarazione legale "
-"sull'IVA."
+msgstr "Seleziona la casella se il partner è soggetto IVA."
 
 #. module: base
 #: model:ir.actions.act_window,name:base.action_module_category_tree
@@ -2204,7 +2201,7 @@ msgstr "Registra Regole"
 #. module: base
 #: field:res.partner,vat:0
 msgid "VAT"
-msgstr "IVA"
+msgstr "Partita IVA"
 
 #. module: base
 #: view:res.lang:0
@@ -3878,7 +3875,7 @@ msgstr "Esegui Conteggio"
 #. module: base
 #: field:ir.model.access,perm_create:0
 msgid "Create Access"
-msgstr "Crea Accesso"
+msgstr "Accesso in creazione"
 
 #. module: base
 #: field:res.partner.address,state_id:0
@@ -5509,7 +5506,7 @@ msgstr "Sig.rina"
 #. module: base
 #: field:ir.model.access,perm_write:0
 msgid "Write Access"
-msgstr "Accesso Scrittura"
+msgstr "Accesso in scrittura"
 
 #. module: base
 #: field:res.bank,city:0
@@ -7414,7 +7411,7 @@ msgstr ">"
 #. module: base
 #: field:ir.model.access,perm_unlink:0
 msgid "Delete Permission"
-msgstr "Cancella Autorizzazione"
+msgstr "Permesso di cancellazione"
 
 #. module: base
 #: model:ir.model,name:base.model_multi_company_default
@@ -7682,7 +7679,7 @@ msgstr ""
 #. module: base
 #: constraint:res.partner:0
 msgid "The VAT doesn't seem to be correct."
-msgstr "L'IVA non sembra essere corretta"
+msgstr "La P.IVA non sembra essere corretta"
 
 #. module: base
 #: selection:ir.report.custom.fields,operation:0
index 8143b58..901ff23 100644 (file)
@@ -8,13 +8,13 @@ msgstr ""
 "Project-Id-Version: openobject-server\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-22 07:03+0000\n"
+"PO-Revision-Date: 2010-06-01 05:19+0000\n"
 "Last-Translator: Harry (Open ERP) <hmo@tinyerp.com>\n"
 "Language-Team: Japanese <ja@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-23 03:44+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:32+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index cdd6b52..224b438 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 9e757ce..1a77070 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 54ec07d..b84f447 100644 (file)
@@ -8,13 +8,13 @@ msgstr ""
 "Project-Id-Version: openobject-addons\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-01-04 06:03+0000\n"
-"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
+"PO-Revision-Date: 2010-05-19 12:29+0000\n"
+"Last-Translator: Olivier Dony (OpenERP) <Unknown>\n"
 "Language-Team: Latvian <lv@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -176,7 +176,7 @@ msgstr "ir.report.custom.fields"
 #. module: base
 #: view:res.partner:0
 msgid "Search Partner"
-msgstr ""
+msgstr "Meklēt Partneri"
 
 #. module: base
 #: code:addons/base/module/wizard/wizard_export_lang.py:0
@@ -419,7 +419,7 @@ msgstr "Kolumbija"
 #. module: base
 #: view:ir.module.module:0
 msgid "Schedule Upgrade"
-msgstr ""
+msgstr "Ieplānot Jauninājumus"
 
 #. module: base
 #: field:ir.actions.report.custom,report_id:0
@@ -593,7 +593,7 @@ msgstr ","
 #. module: base
 #: view:res.partner:0
 msgid "My Partners"
-msgstr ""
+msgstr "Mani Partneri"
 
 #. module: base
 #: model:res.country,name:base.es
@@ -745,7 +745,7 @@ msgstr "Irāna"
 #: model:ir.actions.act_window,name:base.res_request-act
 #: model:ir.ui.menu,name:base.menu_res_request_act
 msgid "My Requests"
-msgstr ""
+msgstr "Mani Pieprasījumi"
 
 #. module: base
 #: field:ir.sequence,name:0
@@ -1009,7 +1009,7 @@ msgstr "STOCK_COPY"
 #: code:addons/base/ir/ir_model.py:0
 #, python-format
 msgid "Model %s Does not Exist !"
-msgstr ""
+msgstr "Modelis %s neeksistē !"
 
 #. module: base
 #: code:addons/base/module/module.py:0
@@ -1137,7 +1137,7 @@ msgstr "Lietotāja Atskaite"
 #: code:addons/base/res/res_user.py:0
 #, python-format
 msgid " (copy)"
-msgstr ""
+msgstr " (kopija)"
 
 #. module: base
 #: view:ir.sequence:0
@@ -1303,7 +1303,7 @@ msgstr "Copy text   \t STOCK_PROPERTIES"
 #. module: base
 #: view:res.partner.address:0
 msgid "Search Contact"
-msgstr ""
+msgstr "Meklēt Kontaktu"
 
 #. module: base
 #: view:ir.module.module:0
@@ -1484,7 +1484,7 @@ msgstr "Esošā Likme"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "Greek / Ελληνικά"
-msgstr ""
+msgstr "Grieķu / Ελληνικά"
 
 #. module: base
 #: view:ir.values:0
@@ -1565,7 +1565,7 @@ msgstr "Epasta Adrese"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "French (BE) / Français (BE)"
-msgstr ""
+msgstr "Franču (BE) / Français (BE)"
 
 #. module: base
 #: code:addons/base/ir/ir_model.py:0
@@ -1603,7 +1603,7 @@ msgstr "Lauka Sasaistes"
 #: model:ir.actions.act_window,name:base.res_request-closed
 #: model:ir.ui.menu,name:base.next_id_12_close
 msgid "My Closed Requests"
-msgstr ""
+msgstr "Mani Slēgie Pieprasījumi"
 
 #. module: base
 #: model:ir.ui.menu,name:base.menu_custom
@@ -1861,7 +1861,7 @@ msgstr "Pieejas Kontrole"
 #: view:ir.module.module:0
 #: field:ir.module.module,dependencies_id:0
 msgid "Dependencies"
-msgstr "Atkarīgie objekti"
+msgstr "Atkarīgs no"
 
 #. module: base
 #: field:ir.report.custom.fields,bgcolor:0
@@ -1988,7 +1988,7 @@ msgstr "Modulis"
 #: model:ir.actions.act_window,name:base.action_res_bank_form
 #: model:ir.ui.menu,name:base.menu_action_res_bank_form
 msgid "Bank List"
-msgstr ""
+msgstr "Banku Saraksts"
 
 #. module: base
 #: field:ir.attachment,description:0
@@ -2401,7 +2401,7 @@ msgstr ""
 #: model:ir.actions.act_window,name:base.action_partner_customer_form
 #: view:res.partner:0
 msgid "Customers"
-msgstr ""
+msgstr "Klienti"
 
 #. module: base
 #: model:res.country,name:base.au
@@ -2603,7 +2603,7 @@ msgstr "STOCK_SAVE_AS"
 #. module: base
 #: selection:ir.translation,type:0
 msgid "SQL Constraint"
-msgstr ""
+msgstr "SQL Ierobežojums"
 
 #. module: base
 #: field:ir.actions.server,srcmodel_id:0
@@ -2669,7 +2669,7 @@ msgstr "%c - Atbilstošais datuma un laika attēlojums."
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "Finland / Suomi"
-msgstr ""
+msgstr "Somu / Suomi"
 
 #. module: base
 #: model:res.country,name:base.bo
@@ -2931,7 +2931,7 @@ msgstr "Likmes"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "Albanian / Shqipëri"
-msgstr ""
+msgstr "Albāņu / Shqipëri"
 
 #. module: base
 #: model:res.country,name:base.sy
@@ -3192,7 +3192,7 @@ msgstr "Demo dati"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "English (UK)"
-msgstr ""
+msgstr "Angļu (UK)"
 
 #. module: base
 #: model:res.country,name:base.aq
@@ -3217,7 +3217,7 @@ msgstr "Tīmeklis"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "English (CA)"
-msgstr ""
+msgstr "Angļu (CA)"
 
 #. module: base
 #: field:res.partner.event,planned_revenue:0
@@ -3460,7 +3460,7 @@ msgstr "Partnera Adreses"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "Indonesian / Bahasa Indonesia"
-msgstr ""
+msgstr "Indonēziešu / Bahasa Indonesia"
 
 #. module: base
 #: model:res.country,name:base.cv
@@ -3625,7 +3625,7 @@ msgstr "Izveidot darbību"
 #. module: base
 #: selection:ir.actions.report.xml,report_type:0
 msgid "HTML from HTML"
-msgstr ""
+msgstr "HTML no HTML"
 
 #. module: base
 #: selection:ir.actions.report.xml,report_type:0
@@ -4086,7 +4086,7 @@ msgstr "Faila Formāts"
 #. module: base
 #: field:res.lang,iso_code:0
 msgid "ISO code"
-msgstr ""
+msgstr "ISO kods"
 
 #. module: base
 #: model:ir.model,name:base.model_res_config_view
@@ -4222,7 +4222,7 @@ msgstr "Izmainīt manus Uzstādījumus"
 #. module: base
 #: constraint:ir.actions.act_window:0
 msgid "Invalid model name in the action definition."
-msgstr ""
+msgstr "Procesa definīcijā nepareizs modeļa nosaukums."
 
 #. module: base
 #: wizard_field:res.partner.sms_send,init,text:0
@@ -4344,7 +4344,7 @@ msgstr "Objekta Lauks"
 #. module: base
 #: selection:module.lang.install,init,lang:0
 msgid "French (CH) / Français (CH)"
-msgstr ""
+msgstr "Franču (CH) / Français (CH)"
 
 #. module: base
 #: selection:ir.ui.menu,icon:0
@@ -4418,7 +4418,7 @@ msgstr "Atcelt atinstalāciju"
 #: view:res.partner:0
 #: view:res.partner.address:0
 msgid "Communication"
-msgstr ""
+msgstr "Saziņa"
 
 #. module: base
 #: model:ir.model,name:base.model_ir_server_object_lines
@@ -6981,7 +6981,7 @@ msgstr "(year)="
 #. module: base
 #: rml:ir.module.reference:0
 msgid "Dependencies :"
-msgstr "Atkarīgie objekti:"
+msgstr "Atkarīgs no:"
 
 #. module: base
 #: selection:ir.ui.menu,icon:0
index 812e11d..b34a6df 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index ad053ea..400f150 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:51+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:41+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 82cf977..3af90ca 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:40+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 38a4474..73c0b68 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-13 04:19+0000\n"
+"PO-Revision-Date: 2010-06-01 04:46+0000\n"
 "Last-Translator: OpenERP Administrators <Unknown>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:32+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
@@ -873,7 +873,7 @@ msgstr "Aby eksportować nowy język, nie wybieraj języka."
 #. module: base
 #: model:res.country,name:base.md
 msgid "Moldavia"
-msgstr ""
+msgstr "Mołdawia"
 
 #. module: base
 #: view:ir.module.module:0
index ec182a0..b581099 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:42+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 99f1585..97d6e53 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index ed68929..3f85498 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:42+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index a14a726..016fd93 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:42+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index ad2b9a0..fb4f757 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:42+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index d24eb12..8bed28c 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index b7620bf..008da91 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:49+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:39+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 422e4c9..3a8a5a1 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:52+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:42+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 4faf9f8..ae549c8 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.0\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-22 07:34+0000\n"
+"PO-Revision-Date: 2010-06-01 05:22+0000\n"
 "Last-Translator: Anders Wallenquist <anders.wallenquist@vertel.se>\n"
 "Language-Team: <>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-23 03:44+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:32+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 3cfbdac..3b99c1b 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index ec7ecdc..89dfe93 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 0c55faf..400c1dc 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 87e5fc4..7f7bd98 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.0\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-22 06:41+0000\n"
+"PO-Revision-Date: 2010-06-01 05:22+0000\n"
 "Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-23 03:44+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:32+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index f8878c6..48ce9e5 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:43+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index 7f4eae7..ae94c8b 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 5.0.4\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2009-12-18 08:39+0000\n"
-"PO-Revision-Date: 2010-04-22 07:29+0000\n"
+"PO-Revision-Date: 2010-06-01 05:19+0000\n"
 "Last-Translator: OpenERP Administrators <Unknown>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-23 03:45+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:33+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index ea8ac05..7b9fae3 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. module: base
index a3f3e7e..01e3349 100644 (file)
@@ -28,6 +28,7 @@ import ir_actions
 import ir_report_custom
 import ir_attachment
 import ir_cron
+import ir_filters
 import ir_values
 import ir_translation
 import ir_exports
index 667a77e..fe4740e 100644 (file)
@@ -18,9 +18,6 @@
                         <field name="model" select="1" required="1"/>
                         <field name="res_id"/>
                         <field name="key2" select="2" required="1"/>
-                        <separator string="Values for Event Type" colspan="2"/>
-                        <label string="client_action_multi, client_action_relate" colspan="2"/>
-                        <label string="tree_but_action, client_print_multi"  colspan="2"/>
                     </group>
                     <group col="2" colspan="2">
                         <separator string="Action To Launch" colspan="2"/>
         <menuitem id="next_id_6" name="Actions" parent="base.next_id_4"/>
         <menuitem action="ir_sequence_actions" id="menu_ir_sequence_actions" parent="next_id_6"/>
 
-        <record id="act_report_custom_view" model="ir.ui.view">
+       <!--            Filters form view-->
+
+               <record id="ir_filters_view_form" model="ir.ui.view">
+            <field name="name">ir.filters.form</field>
+            <field name="model">ir.filters</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Filters">
+                    <field name="name" select="1"/>
+                    <field name="user_id" select="1"/>
+                    <field name="model_id"/>
+                    <newline/>
+                    <field name="domain"/>
+                    <field name="context"/>
+                </form>
+            </field>
+        </record>
+
+        <!--           Filters tree view-->
+
+        <record id="ir_filters_view_tree" model="ir.ui.view">
+             <field name="name">ir.filters.tree</field>
+            <field name="model">ir.filters</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree string="Filters">
+                    <field name="name" select="1"/>
+                    <field name="user_id" select="1"/>
+                    <field name="model_id"/>
+                    <field name="domain"/>
+                    <field name="context"/>
+                </tree>
+            </field>
+        </record>
+
+               <!--            Filters action-->
+
+        <record id="actions_ir_filters_view" model="ir.actions.act_window">
+            <field name="name">Filters</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">ir.filters</field>
+            <field name="view_type">form</field>
+            <field name="view_id" ref="ir_filters_view_tree"/>
+        </record>
+
+               <!--            Filters view menu-->
+
+               <menuitem parent="base.next_id_6" name="Filters"
+                       id="menu_ir_filters" action="actions_ir_filters_view" />
+
+
+               <record id="act_report_custom_view" model="ir.ui.view">
             <field name="name">ir.actions.report.custom</field>
             <field name="model">ir.actions.report.custom</field>
             <field name="type">form</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <form string="Views">
-                    <field name="name" select="1"/>
-                    <field name="type" select="1"/>
-                    <field name="model" select="1"/>
-                    <field name="field_parent"/>
-                    <field name="priority"/>
-                    <field name="inherit_id" select="1"/>
-                    <field colspan="4" name="arch"/>
+                    <group colspan="2" col="2">
+                        <separator string="General" colspan="2"/>
+                        <field name="name" select="1"/>
+                        <field name="type" select="1"/>
+                        <field name="model" select="1"/>
+                        <field name="priority"/>
+                    </group>
+                    <group colspan="2" col="2">
+                        <separator string="Advanced" colspan="2"/>
+                        <field name="field_parent"/>
+                        <field name="inherit_id" select="1"/>
+                        <field name="xml_id" select="1"/>
+                    </group>
+                    <separator string="View architecture" colspan="4"/>
+                    <field colspan="4" nolabel="1" name="arch"/>
                 </form>
             </field>
         </record>
                     <field name="name"/>
                     <field name="type"/>
                     <field name="model"/>
+                    <field name="xml_id"/>
                     <field name="inherit_id"/>
-                    <field name="priority"/>
                     <field name="field_parent"/>
+                    <field name="priority"/>
                 </tree>
             </field>
         </record>
                             <separator string="Attached To" colspan="2"/>
                             <field name="res_model" select="2"/>
                             <field name="res_id"/>
+                            <field name="res_name"/>
                         </group>
-                        <separator string="Preview" colspan="4"/>
-                        <field
-                            name="preview"
-                            widget="picture"
-                            readonly="1"
-                            nolabel="1"
-                            colspan="4"
-                            img_height="400"
-                            img_width="800"/>
                     </page>
                     <page string="Notes">
                         <field colspan="4" name="description" nolabel="1"/>
             </field>
         </record>
 
+
+        <record model="ir.ui.view" id="view_model_data_form">
+            <field name="name">ir.model.data.form</field>
+            <field name="model">ir.model.data</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Module data">
+                    <field name="module" select="1" />
+                    <field name="name" select="1" />
+                    <field name="model" select="1" />
+                    <field name="res_id" select="1" />
+                    <field name="noupdate" select="2" />
+                    <field name="date_update" />
+                    <field name="date_init" />
+                </form>
+            </field>
+        </record>
+
+        <record id="view_model_data_list" model="ir.ui.view">
+            <field name="name">ir.model.data.list</field>
+            <field name="model">ir.model.data</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree string="Module Data">
+                    <field name="module"/>
+                    <field name="name"/>
+                    <field name="model" select="1" />
+                    <field name="res_id"/>
+                    <field name="noupdate"/>
+                </tree>
+            </field>
+        </record>
+
         <record id="action_model_model" model="ir.actions.act_window">
             <field name="name">Objects</field>
             <field name="res_model">ir.model</field>
         </record>
         <menuitem action="action_model_fields" id="ir_model_model_fields" parent="base.next_id_9"/>
 
+        <record id="action_model_data" model="ir.actions.act_window">
+            <field name="name">Module data</field>
+            <field name="res_model">ir.model.data</field>
+            <field name="view_type">form</field>
+            <field name="view_id" ref="view_model_data_list"/>
+        </record>
+        <menuitem action="action_model_data" id="ir_model_data_menu" parent="base.next_id_9"
+                  groups="base.group_extended"/>
+
         <!-- Translations -->
 
         <record id="view_translation_search" model="ir.ui.view">
 
         <!-- Rules -->
 
-        <record id="view_rule_group_form" model="ir.ui.view">
+        <record id="view_rule_form" model="ir.ui.view">
             <field name="name">Record rules</field>
-            <field name="model">ir.rule.group</field>
+            <field name="model">ir.rule</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <form string="Record rules">
-                    <field name="model_id" select="1"/>
-                    <field name="global" select="1"/>
-                    <field colspan="4" name="name"/>
-                    <group col="6" colspan="4" expand="1">
-                        <field colspan="6" name="rules" nolabel="1"/>
-                        <label align="0.0" colspan="6" string="The rule is satisfied if all test are True (AND)"/>
-                        <label align="0.0" colspan="6" string="Multiple rules on same objects are joined using operator OR"/>
+                    <separator colspan="4" string="Combination of rules"/>
+                    <label align="0.0" angle="2" colspan="4" string="1. Global rules are combined together with a logical AND operator, and with the result of the following steps"/>
+                    <label align="0.0" angle="2" colspan="4" string="2. Group-specific rules are combined together with a logical AND operator"/>
+                    <label align="0.0" angle="2" colspan="4" string="3. If user belongs to several groups, the results from step 2 are combined with logical OR operator"/>
+                    <label align="0.0" angle="2" colspan="4" string="Example: GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND ( (GROUP_A_RULE_1 AND GROUP_A_RULE_2) OR (GROUP_B_RULE_1 AND GROUP_B_RULE_2) )"/>
+                    <group col="2" colspan="2">
+                        <separator colspan="2" string="General"/>
+                        <field colspan="4" name="name"/>
+                        <field name="model_id" select="1"/>
+                    </group>
+                    <group col="4" colspan="2">
+                        <separator colspan="4" string="Access Rights"/>
+                        <field name="perm_read"/>
+                        <field name="perm_write"/>
+                        <field name="perm_create"/>
+                        <field name="perm_unlink"/>
                     </group>
+                    <separator colspan="4" string="Domain Setup"/>
+                    <group colspan="4">
+                        <field name="domain_force" colspan="4"/>
+                    </group>
+                    <separator colspan="4" string="Groups (no group = global)"/>
+                    <group colspan="4" expand="1">
+                        <field name="global" select="1"/>
+                        <field name="groups" select="1" nolabel="1" colspan="4"/>
+                       </group>
                 </form>
             </field>
         </record>
-        <record id="view_rule_group_tree" model="ir.ui.view">
+        <record id="view_rule_tree" model="ir.ui.view">
             <field name="name">Record rules</field>
-            <field name="model">ir.rule.group</field>
+            <field name="model">ir.rule</field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
                 <tree string="Record rules">
                     <field name="model_id"/>
                     <field name="name"/>
                     <field name="global"/>
-                </tree>
-            </field>
-        </record>
-
-        <record id="view_rule_form" model="ir.ui.view">
-            <field name="name">Rule Definition</field>
-            <field name="model">ir.rule</field>
-            <field name="type">form</field>
-            <field name="arch" type="xml">
-                <form string="Test">
-                    <separator colspan="4" string="Simple domain setup"/>
-                    <group col="6" colspan="4">
-                        <field name="field_id"/>
-                        <field name="operator"/>
-                        <field name="operand"/>
-                    </group>
-                    <separator colspan="4" string="Manual domain setup"/>
                     <field name="domain_force"/>
-                    <label colspan="4" string="If you don't force the domain, it will use the simple domain setup"/>
-                    <newline/>
-                    <field name="perm_read"/>
-                    <field name="perm_write"/>
-                    <field name="perm_create"/>
-                    <field name="perm_unlink"/>
-                </form>
-            </field>
-        </record>
-
-        <record id="view_rule_tree" model="ir.ui.view">
-            <field name="name">Rules</field>
-            <field name="model">ir.rule</field>
-            <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <tree string="Test">
-                    <field name="domain"/>
                     <field name="perm_read"/>
                     <field name="perm_write"/>
                     <field name="perm_create"/>
                 </tree>
             </field>
         </record>
+
         <record id="action_rule" model="ir.actions.act_window">
             <field name="name">Record Rules</field>
-            <field name="res_model">ir.rule.group</field>
+            <field name="res_model">ir.rule</field>
             <field name="view_type">form</field>
-            <field name="view_id" ref="view_rule_group_tree"/>
+            <field name="view_id" ref="view_rule_tree"/>
         </record>
         <menuitem action="action_rule" id="menu_action_rule" parent="base.menu_security"/>
 
-        <record id="property_rule_group" model="ir.rule.group">
+        <record id="property_rule" model="ir.rule">
             <field name="name">Property multi-company</field>
             <field model="ir.model" name="model_id" ref="model_ir_property"/>
             <field eval="True" name="global"/>
-        </record>
-        <record id="property_rule" model="ir.rule">
             <field name="domain_force">['|',('company_id','child_of',user.company_id.id),('company_id','=',False)]</field>
-            <field name="rule_group" ref="property_rule_group"/>
         </record>
 
         <!--server action view-->
                             <field name="subject" colspan="4" attrs="{'required':[('state','=','email')]}"/>
                             <field name="message" select="2" colspan="4" attrs="{'required':[('state','=','email')]}"/>
                             <newline/>
-                            <label colspan="4" string="Access all the fields related to the current object using expression in double brackets, i.e.[[ object.partner_id.name ]]" align="0.0"/>
+                            <label colspan="4" string="Access all the fields related to the current object using expressions, i.e. object.partner_id.name " align="0.0"/>
                         </page>
                         <page string="SMS Configuration" attrs="{'invisible':[('state','!=','sms')]}">
                             <separator colspan="4" string="SMS Configuration"/>
                             <field name="mobile" domain="[('model_id','=',model_id)]" attrs="{'required':[('state','=','sms')]}"/>
                             <field name="sms" colspan="4" attrs="{'required':[('state','=','sms')]}"/>
                             <newline/>
-                            <label colspan="4" string="Access all the fields related to the current object using expression in double brackets, i.e. [[ object.partner_id.name ]]" align="0.0"/>
+                            <label colspan="4" string="Access all the fields related to the current object using expressions, i.e. object.partner_id.name " align="0.0"/>
                         </page>
                         <page string="Create / Write / Copy" attrs="{'invisible':[('state','!=','object_create'), ('state','!=','object_write'), ('state','!=','object_copy')]}">
                             <separator colspan="4" string="Fields Mapping"/>
                     <field name="sequence"/>
                     <field name="action_id" select="1"/>
                     <field name="state"/>
+                    <button name="action_id" states="open,skip" string="Launch" type="action" icon="gtk-execute" help="Launch Configuration Wizard"/>
                 </tree>
             </field>
         </record>
                     <field name="action_id" select="1"/>
                     <field name="restart"/>
                     <field name="state"/>
+                    <notebook colspan="4">
+                        <page string="Groups">
+                               <field name="groups_id" nolabel="1" colspan="4"/>
+                       </page>
+                    </notebook>
                 </form>
             </field>
         </record>
index 33be3fe..6c51ab2 100644 (file)
@@ -191,7 +191,7 @@ class act_window(osv.osv):
                 return s.encode('utf8')
             return s
         for act in self.browse(cr, uid, ids):
-            fields_from_fields_get = self.pool.get(act.res_model).fields_get(cr, uid)
+            fields_from_fields_get = self.pool.get(act.res_model).fields_get(cr, uid, context=context)
             search_view_id = False
             if act.search_view_id:
                 search_view_id = act.search_view_id.id
@@ -387,13 +387,13 @@ class actions_server(osv.osv):
                 line = rs[0], "%s - (%s)" % (rs[1], rs[0])
                 res.append(line)
         return res
-    
+
     def _select_objects(self, cr, uid, context={}):
         model_pool = self.pool.get('ir.model')
         ids = model_pool.search(cr, uid, [('name','not ilike','.')])
         res = model_pool.read(cr, uid, ids, ['model', 'name'])
         return [(r['model'], r['name']) for r in res] +  [('','')]
-    
+
     def change_object(self, cr, uid, ids, copy_object, state, context={}):
         if state == 'object_copy':
             model_pool = self.pool.get('ir.model')
@@ -455,7 +455,7 @@ class actions_server(osv.osv):
         'type': lambda *a: 'ir.actions.server',
         'sequence': lambda *a: 5,
         'code': lambda *a: """# You can use the following variables
-#    - object
+#    - object or obj
 #    - time
 #    - cr
 #    - uid
@@ -532,7 +532,6 @@ class actions_server(osv.osv):
 
     def run(self, cr, uid, ids, context={}):
         logger = netsvc.Logger()
-
         for action in self.browse(cr, uid, ids, context):
             obj_pool = self.pool.get(action.model_id.model)
             obj = obj_pool.browse(cr, uid, context['active_id'], context=context)
@@ -554,19 +553,26 @@ class actions_server(osv.osv):
                 return self.pool.get(action.action_id.type)\
                     .read(cr, uid, action.action_id.id, context=context)
 
-            if action.state == 'code':
-                localdict = {
-                    'self': self.pool.get(action.model_id.model),
-                    'context': context,
-                    'time': time,
-                    'ids': ids,
-                    'cr': cr,
-                    'uid': uid,
-                    'object':obj
-                }
-                exec action.code in localdict
-                if 'action' in localdict:
-                    return localdict['action']
+                if config['server_actions_allow_code']:
+                    localdict = {
+                        'self': self.pool.get(action.model_id.model),
+                        'context': context,
+                        'time': time,
+                        'ids': ids,
+                        'cr': cr,
+                        'uid': uid,
+                        'object':obj,
+                        'obj': obj,
+                        }
+                    exec action.code in localdict
+                    if 'action' in localdict:
+                        return localdict['action']
+                else:
+                    netsvc.Logger().notifyChannel(
+                        self._name, netsvc.LOG_ERROR,
+                        "%s is a `code` server action, but "
+                        "it isn't allowed in this configuration.\n\n"
+                        "See server options to enable it"%action)
 
             if action.state == 'email':
                 user = config['email_from']
@@ -580,11 +586,11 @@ class actions_server(osv.osv):
                     logger.notifyChannel('email', netsvc.LOG_INFO, 'Partner Email address not Specified!')
                     continue
                 if not user:
-                    raise osv.except_osv(_('Error'), _("Please specify server option --smtp-from !"))
-                
+                    raise osv.except_osv(_('Error'), _("Please specify server option --email-from !"))
+
                 subject = self.merge_message(cr, uid, action.subject, action, context)
                 body = self.merge_message(cr, uid, action.message, action, context)
-                
+
                 if tools.email_send(user, [address], subject, body, debug=False, subtype='html') == True:
                     logger.notifyChannel('email', netsvc.LOG_INFO, 'Email successfully send to : %s' % (address))
                 else:
@@ -686,7 +692,7 @@ class actions_server(osv.osv):
                 cr.commit()
                 if action.record_id:
                     self.pool.get(action.model_id.model).write(cr, uid, [context.get('active_id')], {action.record_id.name:res_id})
-            
+
             if action.state == 'object_copy':
                 res = {}
                 for exp in action.fields_lines:
@@ -701,7 +707,7 @@ class actions_server(osv.osv):
 
                 obj_pool = None
                 res_id = False
-                
+
                 model = action.copy_object.split(',')[0]
                 cid = action.copy_object.split(',')[1]
                 obj_pool = self.pool.get(model)
@@ -736,6 +742,7 @@ class ir_actions_todo(osv.osv):
         'state': fields.selection(TODO_STATES, string='State', required=True),
         'name':fields.char('Name', size=64),
         'restart': fields.selection([('onskip','On Skip'),('always','Always'),('never','Never')],'Restart',required=True),
+        'groups_id':fields.many2many('res.groups', 'res_groups_action_rel', 'uid', 'gid', 'Groups'),
         'note':fields.text('Text', translate=True),
     }
     _defaults={
index 89d4bbd..4ca585a 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
@@ -25,7 +25,7 @@ import tools
 
 class ir_attachment(osv.osv):
     def check(self, cr, uid, ids, mode, context=None):
-        if not ids: 
+        if not ids:
             return
         ima = self.pool.get('ir.model.access')
         if isinstance(ids, (int, long)):
@@ -37,8 +37,8 @@ class ir_attachment(osv.osv):
 
     def search(self, cr, uid, args, offset=0, limit=None, order=None,
             context=None, count=False):
-        ids = super(ir_attachment, self).search(cr, uid, args, offset=offset, 
-                                                limit=limit, order=order, 
+        ids = super(ir_attachment, self).search(cr, uid, args, offset=offset,
+                                                limit=limit, order=order,
                                                 context=context, count=False)
         if not ids:
             if count:
@@ -66,7 +66,7 @@ class ir_attachment(osv.osv):
     def write(self, cr, uid, ids, vals, context=None):
         self.check(cr, uid, ids, 'write', context=context)
         return super(ir_attachment, self).write(cr, uid, ids, vals, context)
-    
+
     def copy(self, cr, uid, id, default=None, context=None):
         self.check(cr, uid, [id], 'write', context=context)
         return super(ir_attachment, self).copy(cr, uid, id, default, context)
@@ -84,37 +84,36 @@ class ir_attachment(osv.osv):
         dataobj = self.pool.get('ir.model.data')
         data_id = dataobj._get_id(cr, 1, 'base', 'action_attachment')
         res_id = dataobj.browse(cr, uid, data_id, context).res_id
-        return self.pool.get('ir.actions.act_window').read(cr, uid, res_id, [], context)
-
-    def _get_preview(self, cr, uid, ids, name, arg, context=None):
-        result = {}
-        if context is None:
-            context = {}
-        ctx = context.copy()    
-        ctx['bin_size'] = False
-        for i in self.browse(cr, uid, ids, context=ctx):
-            result[i.id] = False
-            for format in ('png','jpg','jpeg','gif','bmp'):
-                if (i.datas_fname and i.datas_fname.lower() or '').endswith(format):
-                    result[i.id]= i.datas
-                    break
-        return result
+        return self.pool.get('ir.actions.act_window').read(cr, uid, res_id, [], context)    
+
+    def _name_get_resname(self, cr, uid, ids, object,method, context):
+        data = {}
+        for attachment in self.browse(cr, uid, ids, context=context):
+            model_object = attachment.res_model
+            res_id = attachment.res_id
+            if model_object and res_id:
+                model_pool = self.pool.get(model_object)
+                res = model_pool.name_get(cr,uid,[res_id],context)
+                data[attachment.id] = res[0][1]
+            else:
+                 data[attachment.id] = False
+        return data
 
     _name = 'ir.attachment'
     _columns = {
         'name': fields.char('Attachment Name',size=64, required=True),
         'datas': fields.binary('Data'),
-        'preview': fields.function(_get_preview, type='binary', string='Image Preview', method=True),
         'datas_fname': fields.char('Filename',size=64),
         'description': fields.text('Description'),
         # Not required due to the document module !
+        'res_name': fields.function(_name_get_resname, type='char', string='Resource Name', method=True),
         'res_model': fields.char('Resource Object',size=64, readonly=True),
         'res_id': fields.integer('Resource ID', readonly=True),
         'link': fields.char('Link', size=256),
-
         'create_date': fields.datetime('Date Created', readonly=True),
         'create_uid':  fields.many2one('res.users', 'Creator', readonly=True),
     }
+
 ir_attachment()
 
 
index dcf7694..66ead94 100644 (file)
@@ -146,16 +146,19 @@ class ir_cron(osv.osv, netsvc.Agent):
     def create(self, cr, uid, vals, context=None):
         res = super(ir_cron, self).create(cr, uid, vals, context=context)        
         cr.commit()
+        self.cancel(cr.dbname)
         self._poolJobs(cr.dbname)
         return res
     def write(self, cr, user, ids, vals, context=None):
         res = super(ir_cron, self).write(cr, user, ids, vals, context=context)
         cr.commit()
+        self.cancel(cr.dbname)
         self._poolJobs(cr.dbname)
         return res
     def unlink(self, cr, uid, ids, context=None):
         res = super(ir_cron, self).unlink(cr, uid, ids, context=context)
         cr.commit()
+        self.cancel(cr.dbname)
         self._poolJobs(cr.dbname)
         return res
 ir_cron()
diff --git a/bin/addons/base/ir/ir_filters.py b/bin/addons/base/ir/ir_filters.py
new file mode 100644 (file)
index 0000000..44dd335
--- /dev/null
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import osv, fields
+
+class ir_filters(osv.osv):
+    '''
+    Filters
+    '''
+    _name = 'ir.filters'
+    _description = 'Filters'
+    
+    def _list_all_models(self, cr, uid, context=None):
+        cr.execute("SELECT model, name from ir_model")
+        return cr.fetchall()
+
+    _columns = {
+        'name': fields.char('Action Name', size=64, translate=True, required=True), 
+        'user_id':fields.many2one('res.users', 'User', help='False means for every user'), 
+        'domain': fields.char('Domain Value', size=250, required=True), 
+        'context': fields.char('Context Value', size=250, required=True), 
+        'model_id': fields.selection(_list_all_models, 'Model', required=True), 
+    }
+
+ir_filters()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 670fb42..888432e 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 import logging
@@ -80,8 +80,10 @@ class ir_model(osv.osv):
         if context:
             context.pop('__last_update', None)
         return super(ir_model,self).write(cr, user, ids, vals, context)
-        
+
     def create(self, cr, user, vals, context=None):
+        if  context is None:
+            context = {}
         if context and context.get('manual',False):
             vals['state']='manual'
         res = super(ir_model,self).create(cr, user, vals, context)
@@ -226,7 +228,7 @@ class ir_model_fields(osv.osv):
         'domain': fields.char('Domain', size=256),
         'groups': fields.many2many('res.groups', 'ir_model_fields_group_rel', 'field_id', 'group_id', 'Groups'),
         'view_load': fields.boolean('View Auto-Load'),
-        'selectable': fields.boolean('Selectable'),        
+        'selectable': fields.boolean('Selectable'),
     }
     _rec_name='field_description'
     _defaults = {
@@ -260,6 +262,8 @@ class ir_model_fields(osv.osv):
         if 'model_id' in vals:
             model_data = self.pool.get('ir.model').browse(cr, user, vals['model_id'])
             vals['model'] = model_data.model
+        if context is None:
+            context = {}
         if context and context.get('manual',False):
             vals['state'] = 'manual'
         res = super(ir_model_fields,self).create(cr, user, vals, context)
@@ -267,7 +271,7 @@ class ir_model_fields(osv.osv):
             if not vals['name'].startswith('x_'):
                 raise except_orm(_('Error'), _("Custom fields must have a name that starts with 'x_' !"))
 
-            if 'relation' in vals and not self.pool.get('ir.model').search(cr, user, [('model','=',vals['relation'])]):
+            if vals.get('relation',False) and not self.pool.get('ir.model').search(cr, user, [('model','=',vals['relation'])]):
                  raise except_orm(_('Error'), _("Model %s Does not Exist !" % vals['relation']))
 
             if self.pool.get(vals['model']):
@@ -278,7 +282,7 @@ class ir_model_fields(osv.osv):
                 self.pool.get(vals['model'])._auto_init(cr, ctx)
 
         return res
-    
+
 ir_model_fields()
 
 class ir_model_access(osv.osv):
@@ -286,7 +290,7 @@ class ir_model_access(osv.osv):
     _columns = {
         'name': fields.char('Name', size=64, required=True),
         'model_id': fields.many2one('ir.model', 'Object', required=True),
-        'group_id': fields.many2one('res.groups', 'Group'),
+        'group_id': fields.many2one('res.groups', 'Group', ondelete='cascade'),
         'perm_read': fields.boolean('Read Access'),
         'perm_write': fields.boolean('Write Access'),
         'perm_create': fields.boolean('Create Access'),
@@ -378,6 +382,7 @@ class ir_model_access(osv.osv):
                 'create': _('You can not create this kind of document! (%s)'),
                 'unlink': _('You can not delete this document! (%s)'),
             }
+
             raise except_orm(_('AccessError'), msgs[mode] % model_name )
         return r
 
@@ -452,7 +457,7 @@ class ir_model_data(osv.osv):
     def _get_id(self, cr, uid, module, xml_id):
         ids = self.search(cr, uid, [('module','=',module),('name','=', xml_id)])
         if not ids:
-            raise Exception('No references to %s.%s' % (module, xml_id))
+            raise ValueError('No references to %s.%s' % (module, xml_id))
         # the sql constraints ensure us we have only one result
         return ids[0]
 
index c4165d1..de465fa 100644 (file)
@@ -23,154 +23,121 @@ from osv import fields,osv
 import time
 import tools
 
-
-class ir_rule_group(osv.osv):
-    _name = 'ir.rule.group'
-
-    _columns = {
-        'name': fields.char('Name', size=128, select=1),
-        'model_id': fields.many2one('ir.model', 'Object',select=1, required=True),
-        'global': fields.boolean('Global', select=1, help="Make the rule global, otherwise it needs to be put on a group"),
-        'rules': fields.one2many('ir.rule', 'rule_group', 'Tests', help="The rule is satisfied if at least one test is True"),
-        'groups': fields.many2many('res.groups', 'group_rule_group_rel', 'rule_group_id', 'group_id', 'Groups'),
-        'users': fields.many2many('res.users', 'user_rule_group_rel', 'rule_group_id', 'user_id', 'Users'),
-    }
-
-    _order = 'model_id, global DESC'
-
-    _defaults={
-        'global': lambda *a: True,
-    }
-
-ir_rule_group()
-
-
 class ir_rule(osv.osv):
     _name = 'ir.rule'
-    _rec_name = 'field_id'
-
-    def _operand(self,cr,uid,context):
-
-        def get(object, level=3, recur=None, root_tech='', root=''):
-            res = []
-            if not recur:
-                recur = []
-            fields = self.pool.get(object).fields_get(cr,uid)
-            key = fields.keys()
-            key.sort()
-            for k in key:
-
-                if fields[k]['type'] in ('many2one'):
-                    res.append((root_tech+'.'+k+'.id',
-                        root+'/'+fields[k]['string']))
-
-                elif fields[k]['type'] in ('many2many', 'one2many'):
-                    res.append(('\',\'.join(map(lambda x: str(x.id), '+root_tech+'.'+k+'))',
-                        root+'/'+fields[k]['string']))
-
-                else:
-                    res.append((root_tech+'.'+k,
-                        root+'/'+fields[k]['string']))
-
-                if (fields[k]['type'] in recur) and (level>0):
-                    res.extend(get(fields[k]['relation'], level-1,
-                        recur, root_tech+'.'+k, root+'/'+fields[k]['string']))
-
-            return res
-
-        res = [("False", "False"), ("True", "True"), ("user.id", "User")]
-        res += get('res.users', level=1,
-                recur=['many2one'], root_tech='user', root='User')
-        return res
 
     def _domain_force_get(self, cr, uid, ids, field_name, arg, context={}):
         res = {}
         for rule in self.browse(cr, uid, ids, context):
             eval_user_data = {'user': self.pool.get('res.users').browse(cr, 1, uid),
                             'time':time}
+            res[rule.id] = eval(rule.domain_force, eval_user_data)
+        return res
 
-            if rule.domain_force:
-                res[rule.id] = eval(rule.domain_force, eval_user_data)
+    def _get_value(self, cr, uid, ids, field_name, arg, context={}):
+        res = {}
+        for rule in self.browse(cr, uid, ids, context):
+            if not rule.groups:
+                res[rule.id] = True
             else:
-                if rule.operand and rule.operand.startswith('user.') and rule.operand.count('.') > 1:
-                    #Need to check user.field.field1.field2(if field  is False,it will break the chain)
-                    op = rule.operand[5:]
-                    rule.operand = rule.operand[:5+len(op[:op.find('.')])] +' and '+ rule.operand + ' or False'
-                if rule.operator in ('in', 'child_of'):
-                    dom = eval("[('%s', '%s', [%s])]" % (rule.field_id.name, rule.operator,
-                        eval(rule.operand,eval_user_data)), eval_user_data)
-                else:
-                    dom = eval("[('%s', '%s', %s)]" % (rule.field_id.name, rule.operator,
-                        rule.operand), eval_user_data)
-                res[rule.id] = dom
+                res[rule.id] = False
         return res
 
+    def _check_model_obj(self, cr, uid, ids, context={}):
+        model_obj = self.pool.get('ir.model')
+        for rule in self.browse(cr, uid, ids, context):
+            model = model_obj.browse(cr, uid, rule.model_id.id, context).model
+            obj = self.pool.get(model)
+            if isinstance(obj, osv.osv_memory):
+                return False
+        return True
+
     _columns = {
-        'field_id': fields.many2one('ir.model.fields', 'Field',domain= "[('model_id','=', parent.model_id)]", select=1),
-        'operator':fields.selection((('=', '='), ('<>', '<>'), ('<=', '<='), ('>=', '>='), ('in', 'in'), ('child_of', 'child_of')), 'Operator'),
-        'operand':fields.selection(_operand,'Operand', size=64),
-        'rule_group': fields.many2one('ir.rule.group', 'Group', select=2, required=True, ondelete="cascade"),
-        'domain_force': fields.char('Force Domain', size=250),
+        'name': fields.char('Name', size=128, select=1),
+        'model_id': fields.many2one('ir.model', 'Object',select=1, required=True),
+        'global': fields.function(_get_value, method=True, string='Global', type='boolean', store=True, help="If no group is specified the rule is global and applied to everyone"),
+        'groups': fields.many2many('res.groups', 'rule_group_rel', 'rule_group_id', 'group_id', 'Groups'),
+        'domain_force': fields.char('Domain', size=250),
         'domain': fields.function(_domain_force_get, method=True, string='Domain', type='char', size=250),
-        'perm_read': fields.boolean('Read Access'),
-        'perm_write': fields.boolean('Write Access'),
-        'perm_create': fields.boolean('Create Access'),
-        'perm_unlink': fields.boolean('Delete Access')
+        'perm_read': fields.boolean('Apply For Read'),
+        'perm_write': fields.boolean('Apply For Write'),
+        'perm_create': fields.boolean('Apply For Create'),
+        'perm_unlink': fields.boolean('Apply For Delete')
     }
+
+    _order = 'model_id DESC'
+
     _defaults = {
-        'perm_read': lambda *a: True,
-        'perm_write': lambda *a: True,
-        'perm_create': lambda *a: True,
-        'perm_unlink': lambda *a: True,
+        'perm_read': True,
+        'perm_write': True,
+        'perm_create': True,
+        'perm_unlink': True,
+        'global': True,
     }
     _sql_constraints = [
-        ('no_access_rights', 'CHECK (perm_read!=False or perm_write!=False or perm_create!=False or perm_unlink!=False)', 'Rule must have atleast one checked access right'),
+        ('no_access_rights', 'CHECK (perm_read!=False or perm_write!=False or perm_create!=False or perm_unlink!=False)', 'Rule must have at least one checked access right'),
+    ]
+    _constraints = [
+        (_check_model_obj, 'Rules are not supported for osv_memory objects !', ['model_id'])
     ]
 
-    def onchange_all(self, cr, uid, ids, field_id, operator, operand):
-        if not (field_id or operator or operand):
-            return {}
+    def domain_create(self, cr, uid, rule_ids):
+        dom = ['&'] * (len(rule_ids)-1)
+        for rule in self.browse(cr, uid, rule_ids):
+            dom += rule.domain
+        return dom
 
-    def domain_get(self, cr, uid, model_name, mode='read', context={}):
-        if uid == 1:
-            return [], [], ['"'+self.pool.get(model_name)._table+'"']
+    @tools.cache()
+    def _compute_domain(self, cr, uid, model_name, mode="read"):
+        group_rule = {}
+        global_rules = []
 
+        if uid == 1:
+            return None
         cr.execute("""SELECT r.id
                 FROM ir_rule r
-                JOIN (ir_rule_group g
-                    JOIN ir_model m ON (g.model_id = m.id))
-                    ON (g.id = r.rule_group)
+                JOIN ir_model m ON (r.model_id = m.id)
                 WHERE m.model = %s
                 AND r.perm_""" + mode + """
-                AND (g.id IN (SELECT rule_group_id FROM group_rule_group_rel g_rel
+                AND (r.id IN (SELECT rule_group_id FROM rule_group_rel g_rel
                             JOIN res_groups_users_rel u_rel ON (g_rel.group_id = u_rel.gid)
-                            WHERE u_rel.uid = %s) OR g.global)""", (model_name, uid))
+                            WHERE u_rel.uid = %s) OR r.global)""", (model_name, uid))
         ids = map(lambda x: x[0], cr.fetchall())
-        dom = []
         for rule in self.browse(cr, uid, ids):
-            dom += rule.domain
-        d1,d2,tables = self.pool.get(model_name)._where_calc(cr, uid, dom, active_test=False)
-        return d1, d2, tables
-    domain_get = tools.cache()(domain_get)
+            for group in rule.groups:
+                group_rule.setdefault(group.id, []).append(rule.id)
+            if not rule.groups:
+              global_rules.append(rule.id)
+        dom = self.domain_create(cr, uid, global_rules)
+        dom += ['|'] * (len(group_rule)-1)
+        for value in group_rule.values():
+            dom += self.domain_create(cr, uid, value)
+        return dom
+
+    def domain_get(self, cr, uid, model_name, mode='read', context={}):
+        dom = self._compute_domain(cr, uid, model_name, mode=mode)
+        if dom:
+            return self.pool.get(model_name)._where_calc(cr, uid, dom, active_test=False)
+        return [], [], ['"'+self.pool.get(model_name)._table+'"']
 
     def unlink(self, cr, uid, ids, context=None):
         res = super(ir_rule, self).unlink(cr, uid, ids, context=context)
-        # Restart the cache on the domain_get method of ir.rule
-        self.domain_get.clear_cache(cr.dbname)
+        # Restart the cache on the _compute_domain method of ir.rule
+        self._compute_domain.clear_cache(cr.dbname)
         return res
 
     def create(self, cr, user, vals, context=None):
         res = super(ir_rule, self).create(cr, user, vals, context=context)
-        # Restart the cache on the domain_get method of ir.rule
-        self.domain_get.clear_cache(cr.dbname)
+        # Restart the cache on the _compute_domain method of ir.rule
+        self._compute_domain.clear_cache(cr.dbname)
         return res
 
     def write(self, cr, uid, ids, vals, context=None):
         if not context:
             context={}
         res = super(ir_rule, self).write(cr, uid, ids, vals, context=context)
-        # Restart the cache on the domain_get method
-        self.domain_get.clear_cache(cr.dbname)
+        # Restart the cache on the _compute_domain method
+        self._compute_domain.clear_cache(cr.dbname)
         return res
 
 ir_rule()
index 73536ac..8e575b6 100644 (file)
@@ -150,8 +150,8 @@ class ir_translation(osv.osv):
         if not context:
             context = {}
         ids = super(ir_translation, self).create(cursor, user, vals, context=context)
-        for trans_obj in self.read(cursor, user, [ids], ['name','type','res_id'], context=context):
-            self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], lang=context.get('lang','en_US'))
+        for trans_obj in self.read(cursor, user, [ids], ['name','type','res_id','src','lang'], context=context):
+            self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
             self._get_ids.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], context.get('lang','en_US'), [trans_obj['res_id']])
         return ids
 
@@ -159,16 +159,16 @@ class ir_translation(osv.osv):
         if not context:
             context = {}
         result = super(ir_translation, self).write(cursor, user, ids, vals, context=context)
-        for trans_obj in self.read(cursor, user, ids, ['name','type','res_id'], context=context):
-            self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], lang=context.get('lang','en_US'))
+        for trans_obj in self.read(cursor, user, ids, ['name','type','res_id','src','lang'], context=context):
+            self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
             self._get_ids.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], context.get('lang','en_US'), [trans_obj['res_id']])
         return result
 
     def unlink(self, cursor, user, ids, context=None):
         if not context:
             context = {}
-        for trans_obj in self.read(cursor, user, ids, ['name','type','res_id'], context=context):
-            self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], lang=context.get('lang','en_US'))
+        for trans_obj in self.read(cursor, user, ids, ['name','type','res_id','src','lang'], context=context):
+            self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
             self._get_ids.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], context.get('lang','en_US'), [trans_obj['res_id']])
         result = super(ir_translation, self).unlink(cursor, user, ids, context=context)
         return result
index bc3dbd3..08592c3 100644 (file)
@@ -31,6 +31,10 @@ def one_in(setA, setB):
             return True
     return False
 
+def cond(C, X, Y):
+    if C: return X
+    return Y
+
 class many2many_unique(fields.many2many):
     def set(self, cr, obj, id, name, values, user=None, context=None):
         if not values:
@@ -63,17 +67,25 @@ class ir_ui_menu(osv.osv):
         # radical but this doesn't frequently happen
         self._cache = {}
 
-    def search(self, cr, uid, args, offset=0, limit=2000, order=None,
-            context=None, count=False):
-        if context is None:
-            context = {}
-        ids = osv.orm.orm.search(self, cr, uid, args, offset, limit, order, context=context, count=(count and uid==1))
+    def search(self, cr, uid, args, offset=0, limit=None, order=None,
+               context=None, count=False):
+
+        super_offset = cond(uid == 1, offset, 0)
+        super_limit = cond(uid == 1, limit, None)
+        super_count = cond(uid == 1, count, False)
+
+        ids = super(ir_ui_menu, self).search(cr, uid, args, super_offset,
+                                             super_limit, order,
+                                             context=context, count=super_count)
+        if uid == 1:
+            return ids
 
         if not ids:
             if count:
                 return 0
             return []
 
+
         modelaccess = self.pool.get('ir.model.access')
         user_groups = set(self.pool.get('res.users').read(cr, 1, uid, ['groups_id'])['groups_id'])
         result = []
@@ -120,6 +132,11 @@ class ir_ui_menu(osv.osv):
             result.append(menu.id)
             self._cache[key] = True
 
+        if offset:
+            result = result[long(offset):]
+        if limit:
+            result = result[:long(limit)]
+
         if count:
             return len(result)
         return result
index b04343e..f1a5014 100644 (file)
@@ -66,10 +66,12 @@ class view(osv.osv):
         'arch': fields.text('View Architecture', required=True),
         'inherit_id': fields.many2one('ir.ui.view', 'Inherited View', ondelete='cascade'),
         'field_parent': fields.char('Child Field',size=64),
+        'xml_id': fields.function(osv.osv.get_xml_id, type='char', size=128, string="XML ID",
+                                  method=True),
     }
     _defaults = {
-        'arch': lambda *a: '<?xml version="1.0"?>\n<tree string="Unknwown">\n\t<field name="name"/>\n</tree>',
-        'priority': lambda *a: 16
+        'arch': '<?xml version="1.0"?>\n<tree string="Unknwown">\n\t<field name="name"/>\n</tree>',
+        'priority': 16
     }
     _order = "priority"
     _constraints = [
@@ -200,6 +202,10 @@ class view_sc(osv.osv):
         'resource': lambda *a: 'ir.ui.menu',
         'user_id': lambda obj, cr, uid, context: uid,
     }
+    _sql_constraints = [
+        ('shortcut_unique', 'unique(res_id, user_id)', 'Shortcut for this menu already exists!'),
+    ]
+        
 view_sc()
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 4c26596..97f6f75 100644 (file)
@@ -75,8 +75,13 @@ class ir_values(osv.osv):
             method=True, type='text', string='Value'),
         'object': fields.boolean('Is Object'),
         'key': fields.selection([('action','Action'),('default','Default')], 'Type', size=128),
-        'key2': fields.char('Event Type', size=256,
-            help="The kind of action or button in the client side that will trigger the action."),
+        'key2' : fields.selection([('client_action_multi', 'client_action_multi'),
+                                   ('client_action_relate', 'client_action_relate'),
+                                   ('tree_but_open', 'tree_but_open'),
+                                   ('tree_but_action', 'tree_but_action'),
+                                   ('client_print_multi', 'client_print_multi')],
+                                  'Event Type',
+                                  help="The kind of action or button in the client side that will trigger the action."),
         'meta': fields.text('Meta Datas'),
         'meta_unpickle': fields.function(_value_unpickle, fnct_inv=_value_pickle,
             method=True, type='text', string='Metadata'),
diff --git a/bin/addons/base/migrations/1.2/pre-10-ir_property_rename_column.py b/bin/addons/base/migrations/1.2/pre-10-ir_property_rename_column.py
new file mode 100644 (file)
index 0000000..8c79e73
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- coding: utf8 -*-
+
+__name__ = "ir.property: Rename column value to value_reference"
+
+def migrate(cr, version):
+    rename_column(cr, 'ir_property', 'value', 'value_reference')
+
+def column_exists(cr, table, column):
+    cr.execute("SELECT count(1)"
+               "  FROM pg_class c, pg_attribute a"
+               " WHERE c.relname=%s"
+               "   AND c.oid=a.attrelid"
+               "   AND a.attname=%s",
+               (table, column))
+    return cr.fetchone()[0] != 0
+
+def rename_column(cr, table, old, new):
+    if column_exists(cr, table, old) and not column_exists(cr, table, new):
+        cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO "%s"' % (table, old, new))
+
diff --git a/bin/addons/base/migrations/1.2/pre-10-res_address_fuction_change_type.py b/bin/addons/base/migrations/1.2/pre-10-res_address_fuction_change_type.py
new file mode 100644 (file)
index 0000000..96173c7
--- /dev/null
@@ -0,0 +1,16 @@
+# -*- coding: utf8 -*-
+
+__name__ = "res.partner.address: change type of 'function' field many2one to char"
+
+def migrate(cr, version):
+    change_column_type(cr,'res_partner_address')
+
+def change_column_type(cr,table):
+    cr.execute('SELECT id, name FROM res_partner_function')
+    all_function = cr.fetchall()
+    cr.execute('ALTER TABLE %s ADD COLUMN temp_function VARCHAR(64)' % table)
+    for fn in all_function:
+        cr.execute("UPDATE %s SET temp_function = '%s' WHERE function = %s" % (table,fn[1],fn[0]))
+    cr.execute("ALTER TABLE %s DROP COLUMN function CASCADE" % table)
+    cr.execute("ALTER TABLE %s RENAME COLUMN temp_function TO function" % table)
+
index 0a42742..e29e95b 100644 (file)
@@ -3,6 +3,7 @@
 #
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -23,6 +24,7 @@ import tarfile
 import re
 import urllib
 import os
+import imp
 import tools
 from osv import fields, osv, orm
 import zipfile
@@ -122,6 +124,8 @@ class module(osv.osv):
         'shortdesc': fields.char('Short Description', size=256, readonly=True, translate=True),
         'description': fields.text("Description", readonly=True, translate=True),
         'author': fields.char("Author", size=128, readonly=True),
+        'maintainer': fields.char('Maintainer', size=128, readonly=True),
+        'contributors': fields.text('Contributors', readonly=True),
         'website': fields.char("Website", size=256, readonly=True),
 
         # attention: Incorrect field names !!
@@ -146,11 +150,13 @@ class module(osv.osv):
         ], string='State', readonly=True),
         'demo': fields.boolean('Demo data'),
         'license': fields.selection([
-                ('GPL-2', 'GPL-2'),
+                ('GPL-2', 'GPL Version 2'),
                 ('GPL-2 or any later version', 'GPL-2 or later version'),
-                ('GPL-3', 'GPL-3'),
+                ('GPL-3', 'GPL Version 3'),
                 ('GPL-3 or any later version', 'GPL-3 or later version'),
-                ('Other proprietary', 'Other proprietary')
+                ('AGPL-3', 'Affero GPL-3'),
+                ('Other OSI approved licence', 'Other OSI Approved Licence'),
+                ('Other proprietary', 'Other Proprietary')
             ], string='License', readonly=True),
         'menus_by_module': fields.function(_get_views, method=True, string='Menus', type='text', multi="meta", store=True),
         'reports_by_module': fields.function(_get_views, method=True, string='Reports', type='text', multi="meta", store=True),
@@ -161,7 +167,7 @@ class module(osv.osv):
     _defaults = {
         'state': lambda *a: 'uninstalled',
         'demo': lambda *a: False,
-        'license': lambda *a: 'GPL-2',
+        'license': lambda *a: 'AGPL-3',
     }
     _order = 'name'
 
@@ -189,6 +195,27 @@ class module(osv.osv):
 
         return super(module, self).unlink(cr, uid, ids, context=context)
 
+    @staticmethod
+    def _check_external_dependencies(terp):
+        depends = terp.get('external_dependencies')
+        if not depends:
+            return
+        for pydep in depends.get('python', []):
+            parts = pydep.split('.')
+            parts.reverse()
+            path = None
+            while parts:
+                part = parts.pop()
+                try:
+                    f, path, descr = imp.find_module(part, path and [path] or None)
+                except ImportError:
+                    raise ImportError('No module named %s' % (pydep,))
+
+        for binary in depends.get('bin', []):
+            if tools.find_in_path(binary) is None:
+                raise Exception('Unable to find %r in path' % (binary,))
+
+
     def state_update(self, cr, uid, ids, newstate, states_to_update, context={}, level=100):
         if level<1:
             raise orm.except_orm(_('Error'), _('Recursion error in modules dependencies !'))
@@ -204,6 +231,11 @@ class module(osv.osv):
                 else:
                     od = self.browse(cr, uid, ids2)[0]
                     mdemo = od.demo or mdemo
+            terp = self.get_module_info(module.name)
+            try:
+                self._check_external_dependencies(terp)
+            except Exception, e:
+                raise orm.except_orm(_('Error'), _('Unable %s the module "%s" because an external dependencie is not met: %s' % (newstate, module.name, e.args[0])))
             if not module.dependencies_id:
                 mdemo = module.demo
             if module.state in states_to_update:
@@ -277,6 +309,19 @@ class module(osv.osv):
         self.update_translations(cr, uid, ids)
         return True
 
+    @staticmethod
+    def get_values_from_terp(terp):
+        return {
+            'description': terp.get('description', ''),
+            'shortdesc': terp.get('name', ''),
+            'author': terp.get('author', 'Unknown'),
+            'maintainer': terp.get('maintainer', False),
+            'contributors': ', '.join(terp.get('contributors', [])) or False,
+            'website': terp.get('website', ''),
+            'license': terp.get('license', 'GPL-2'),
+            'certificate': terp.get('certificate') or None,
+        }
+
     # update the list of available packages
     def update_list(self, cr, uid, context={}):
         res = [0, 0] # [update, add]
@@ -284,46 +329,31 @@ class module(osv.osv):
         # iterate through installed modules and mark them as being so
         for mod_name in addons.get_modules():
             ids = self.search(cr, uid, [('name','=',mod_name)])
+
+            terp = self.get_module_info(mod_name)
+            values = self.get_values_from_terp(terp)
+
             if ids:
                 id = ids[0]
                 mod = self.browse(cr, uid, id)
-                terp = self.get_module_info(mod_name)
                 if terp.get('installable', True) and mod.state == 'uninstallable':
                     self.write(cr, uid, id, {'state': 'uninstalled'})
                 if parse_version(terp.get('version', '')) > parse_version(mod.latest_version or ''):
                     self.write(cr, uid, id, { 'url': ''})
                     res[0] += 1
-                self.write(cr, uid, id, {
-                    'description': terp.get('description', ''),
-                    'shortdesc': terp.get('name', ''),
-                    'author': terp.get('author', 'Unknown'),
-                    'website': terp.get('website', ''),
-                    'license': terp.get('license', 'GPL-2'),
-                    'certificate': terp.get('certificate') or None,
-                    })
+                self.write(cr, uid, id, values)
                 cr.execute('DELETE FROM ir_module_module_dependency WHERE module_id = %s', (id,))
-                self._update_dependencies(cr, uid, ids[0], terp.get('depends', []))
-                self._update_category(cr, uid, ids[0], terp.get('category', 'Uncategorized'))
-                continue
-            mod_path = addons.get_module_path(mod_name)
-            if mod_path:
-                terp = self.get_module_info(mod_name)
+            else:
+                mod_path = addons.get_module_path(mod_name)
+                if not mod_path:
+                    continue
                 if not terp or not terp.get('installable', True):
                     continue
 
-                id = self.create(cr, uid, {
-                    'name': mod_name,
-                    'state': 'uninstalled',
-                    'description': terp.get('description', ''),
-                    'shortdesc': terp.get('name', ''),
-                    'author': terp.get('author', 'Unknown'),
-                    'website': terp.get('website', ''),
-                    'license': terp.get('license', 'GPL-2'),
-                    'certificate': terp.get('certificate') or None,
-                })
+                id = self.create(cr, uid, dict(name=mod_name, state='uninstalled', **values))
                 res[1] += 1
-                self._update_dependencies(cr, uid, id, terp.get('depends', []))
-                self._update_category(cr, uid, id, terp.get('category', 'Uncategorized'))
+            self._update_dependencies(cr, uid, id, terp.get('depends', []))
+            self._update_category(cr, uid, id, terp.get('category', 'Uncategorized'))
 
         return res
 
@@ -350,14 +380,7 @@ class module(osv.osv):
             except Exception, e:
                 raise orm.except_orm(_('Error'), _('Can not create the module file:\n %s') % (fname,))
             terp = self.get_module_info(mod.name)
-            self.write(cr, uid, mod.id, {
-                'description': terp.get('description', ''),
-                'shortdesc': terp.get('name', ''),
-                'author': terp.get('author', 'Unknown'),
-                'website': terp.get('website', ''),
-                'license': terp.get('license', 'GPL-2'),
-                'certificate': terp.get('certificate') or None,
-                })
+            self.write(cr, uid, mod.id, self.get_values_from_terp(terp))
             cr.execute('DELETE FROM ir_module_module_dependency ' \
                     'WHERE module_id = %s', (mod.id,))
             self._update_dependencies(cr, uid, mod.id, terp.get('depends',
index cd57b59..63484b9 100644 (file)
@@ -97,7 +97,9 @@
                             <field name="latest_version"/>
                             <field name="author" select="2"/>
                             <field name="website" select="2" widget="url"/>
+                            <field name="maintainer" attrs="{'invisible': [('maintainer', '=', False)]}"/>
                             <field name="url" widget="url"/>
+                            <field name="contributors" widget="char" attrs="{'invisible': [('contributors', '=', False)]}"/>
                             <field name="published_version"/>
                             <field name="license"/>
                             <field name="demo" readonly="1"/>
                     <field name="name"/>
                     <field name="shortdesc"/>
                     <field name="author"/>
+                    <field name='maintainer'/>
+                    <field name='contributors'/>
                     <field name="installed_version"/>
                     <field name="latest_version"/>
                     <field name="published_version"/>
index 0e2028e..c6eddab 100644 (file)
@@ -3,6 +3,7 @@
 #    
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -56,7 +57,7 @@ class wizard_install_module(wizard.interface):
             terp = mod_obj.get_module_info(module)
             if not terp.get('installable', True):
                 continue
-            
+
             # XXX check if this code is correct...
             fm = imp.find_module(module)
             try:
@@ -65,12 +66,8 @@ class wizard_install_module(wizard.interface):
                 if fm[0]:
                     fm[0].close()
 
-            mod_id = mod_obj.create(cr, uid, {
-                'name': module, 
-                'state': 'uninstalled',
-                'description': terp.get('description', ''),
-                'shortdesc': terp.get('name', ''),
-                'author': terp.get('author', 'Unknown')})
+            values = mod_obj.get_values_from_terp(terp)
+            mod_id = mod_obj.create(cr, uid, dict(name=module, state='uninstalled', **values))
             dependencies = terp.get('depends', [])
             for d in dependencies:
                 cr.execute('insert into ir_module_module_dependency (module_id,name) values (%s, %s)', (mod_id, d))
index 66278c8..b7a14c7 100644 (file)
@@ -31,8 +31,6 @@ import res_company
 import res_user
 import res_request
 import res_lang 
-
+import res_log 
 import ir_property
 
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
index 5b6847c..a60be66 100644 (file)
                     <field name="active" select="2"/>
                     <field name="bic" select="1"/>
                     <newline/>
-                    <group string="Address" colspan="2" col="4">                    
-                           <field name="street" select="2"/>
-                           <field name="street2" select="2"/>
-                           <field name="zip"/>
-                           <field name="city"/>
-                           <field name="country" select="2"/>
-                           <field name="state" select="2"/>
+                    <separator string="Address" colspan="2" col="4"/>
+                    <separator string="Communication" colspan="2" col="4"/>
+                    <group  colspan="2" col="4">
+                        <field name="street" select="2"/>
+                        <field name="street2" select="2"/>
+                        <field name="zip"/>
+                        <field name="city"/>
+                        <field name="country" select="2"/>
+                        <field name="state" select="2"/>
                     </group>
-                    <group string="Communication" colspan="2" col="4">
-                           <field name="phone"/>
-                           <field name="fax"/>
-                           <field name="email"/>
+                    <group colspan="2" col="4">
+                        <field name="phone"/>
+                        <field name="fax"/>
+                        <field name="email"/>
                     </group>
                 </form>
             </field>
         </record>
-        
+
         <record id="view_res_bank_tree" model="ir.ui.view">
             <field name="name">res.bank.tree</field>
             <field name="model">res.bank</field>
                 </tree>
             </field>
         </record>
-        
+
         <record id="action_res_bank_form" model="ir.actions.act_window">
             <field name="name">Bank List</field>
             <field name="res_model">res.bank</field>
             <field name="view_type">form</field>
             <field name="view_mode">tree,form</field>
         </record>
-        
+
         <menuitem action="action_res_bank_form" groups="group_extended" id="menu_action_res_bank_form" parent="menu_base_config" sequence="40"/>
-        
+
     </data>
 </openerp>
diff --git a/bin/addons/base/res/config_pixmaps/1.png b/bin/addons/base/res/config_pixmaps/1.png
new file mode 100644 (file)
index 0000000..292e3b8
Binary files /dev/null and b/bin/addons/base/res/config_pixmaps/1.png differ
diff --git a/bin/addons/base/res/config_pixmaps/2.png b/bin/addons/base/res/config_pixmaps/2.png
new file mode 100644 (file)
index 0000000..3b0aad8
Binary files /dev/null and b/bin/addons/base/res/config_pixmaps/2.png differ
diff --git a/bin/addons/base/res/config_pixmaps/3.png b/bin/addons/base/res/config_pixmaps/3.png
new file mode 100644 (file)
index 0000000..39a260a
Binary files /dev/null and b/bin/addons/base/res/config_pixmaps/3.png differ
index 272b025..99e12a9 100644 (file)
@@ -86,7 +86,7 @@ class CountryState(osv.osv):
             args = []
         if not context:
             context = {}
-        ids = self.search(cr, user, [('code', '=', name)] + args, limit=limit,
+        ids = self.search(cr, user, [('code', 'ilike', name)] + args, limit=limit,
                 context=context)
         if not ids:
             ids = self.search(cr, user, [('name', operator, name)] + args,
index b02ba59..5a8ce75 100644 (file)
 ##############################################################################
 
 from osv import osv,fields
-
+from operator import attrgetter
+import time
 # -------------------------------------------------------------------------
 # Properties
 # -------------------------------------------------------------------------
 
-def _models_get(self, cr, uid, context={}):
-    obj = self.pool.get('ir.model.fields')
-    ids = obj.search(cr, uid, [('view_load','=',1)])
-    res = []
-    done = {}
-    for o in obj.browse(cr, uid, ids, context=context):
-        if o.model_id.id not in done:
-            res.append( [o.model_id.model, o.model_id.name])
-            done[o.model_id.id] = True
-    return res
-
 class ir_property(osv.osv):
     _name = 'ir.property'
+
+    def _models_field_get(self, cr, uid, field_key, field_value, context=None):
+        get = attrgetter(field_key, field_value)
+
+        obj = self.pool.get('ir.model.fields')
+        ids = obj.search(cr, uid, [('view_load','=',1)], context=context)
+        res = set()
+        for o in obj.browse(cr, uid, ids, context=context):
+            res.add(get(o))
+        return res
+
+    def _models_get(self, cr, uid, context=None):
+        return self._models_field_get(cr, uid, 'model', 'name', context)
+
+    def _models_get2(self, cr, uid, context=None):
+        return self._models_field_get(cr, uid, 'relation', 'relation', context)
+
+
     _columns = {
         'name': fields.char('Name', size=128),
-        'value': fields.char('Value', size=128),
-        'res_id': fields.reference('Resource', selection=_models_get, size=128),
+
+        'res_id': fields.reference('Resource', selection=_models_get, size=128,
+                                   help="If not set, act as default property"),
         'company_id': fields.many2one('res.company', 'Company'),
-        'fields_id': fields.many2one('ir.model.fields', 'Fields', ondelete='cascade', required=True)
+        'fields_id': fields.many2one('ir.model.fields', 'Fields', ondelete='cascade', required=True),
+
+        'value_float' : fields.float('Value'),
+        'value_integer' : fields.integer_big('Value'), # will contain (int, bigint)
+        'value_text' : fields.text('Value'), # will contain (char, text)
+        'value_binary' : fields.binary('Value'),
+        'value_reference': fields.reference('Value', selection=_models_get2, size=128),
+        'value_datetime' : fields.datetime('Value'),
+
+        'type' : fields.selection([('char', 'Char'),
+                                   ('float', 'Float'),
+                                   ('integer', 'Integer'),
+                                   ('integer_big', 'Integer Big'),
+                                   ('text', 'Text'),
+                                   ('binary', 'Binary'),
+                                   ('many2one', 'Many2One'),
+                                   ('date', 'Date'),
+                                   ('datetime', 'DateTime'),
+                                  ],
+                                  'Type',
+                                  required=True,
+                                  select=1),
     }
-    def unlink(self, cr, uid, ids, context={}):
-        if ids:
-            cr.execute('DELETE FROM ir_model_fields WHERE id IN (SELECT fields_id FROM ir_property WHERE (fields_id IS NOT NULL) AND (id = ANY  (%s)))', (ids,))
-        res = super(ir_property, self).unlink(cr, uid, ids, context)
-        return res
 
-    def get(self, cr, uid, name, model, res_id=False, context={}):
-        cr.execute('select id from ir_model_fields where name=%s and model=%s', (name, model))
-        res = cr.fetchone()
-        if res:
-            ucid = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
-            nid = self.search(cr, uid, [('fields_id','=',res[0]),('res_id','=',res_id),('company_id','=',ucid)])
-            if nid:
-                d = self.browse(cr, uid, nid[0], context).value
-                return (d and int(d.split(',')[1])) or False
+    _defaults = {
+        'type': 'many2one',
+    }
+
+    def _update_values(self, cr, uid, ids, values):
+        value = values.pop('value', None)
+        if not value:
+            return values
+        type_ = values.get('type', 'many2one')
+        type2field = {
+            'char': 'value_text',
+            'float': 'value_float',
+            'integer': 'value_integer',
+            'integer_big': 'value_integer',
+            'text': 'value_text',
+            'binary': 'value_binary',
+            'many2one': 'value_reference',
+            'date' : 'value_datetime',
+            'datetime' : 'value_datetime',
+        }
+        field = type2field.get(type_)
+        if not field:
+            raise osv.except_osv('Error', 'Invalid type')
+
+        if field == 'value_reference':
+            if isinstance(value, osv.orm.browse_record):
+                value = '%s,%d' % (value._name, value.id)
+            elif isinstance(value, (int, long)):
+                field_id = values.get('fields_id')
+                if not field_id:
+                    if not ids:
+                        raise ValueError()
+                    field_id = self.browse(cr, uid, ids[0]).fields_id
+                else:
+                    field_id = self.pool.get('ir.model.fields').browse(cr, uid, field_id)
+
+                value = '%s,%d' % (field_id.relation, value)
+
+        values[field] = value
+        return values
+
+
+    def write(self, cr, uid, ids, values, context=None):
+        return super(ir_property, self).write(cr, uid, ids, self._update_values(cr, uid, ids, values), context=context)
+
+    def create(self, cr, uid, values, context=None):
+        return super(ir_property, self).create(cr, uid, self._update_values(cr, uid, None, values), context=context)
+
+    def get_by_id(self, cr, uid, record_ids, context=None):
+        if isinstance(record_ids, (int, long)):
+            record_ids = [record_ids]
+
+        if not record_ids:
+            return False
+
+        record = self.browse(cr, uid, record_ids[0], context=context)
+
+        if record.type in ('char', 'text'):
+            return record.value_text
+        elif record.type == 'float':
+            return record.value_float
+        elif record.type in ('integer', 'integer_big'):
+            return record.value_integer
+        elif record.type == 'binary':
+            return record.value_binary
+        elif record.type == 'many2one':
+            return record.value_reference
+        elif record.type == 'datetime':
+            return record.value_datetime
+        elif record.type == 'date':
+            return time.strftime('%Y-%m-%d', time.strptime(record.value_datetime, '%Y-%m-%d %H:%M:%S'))
+
+        return False
+
+    def get(self, cr, uid, name, model, res_id=False, context=None):
+        domain = self._get_domain(cr, uid, name, model, context=context)
+        if domain is not None:
+            domain = [('res_id', '=', res_id)] + domain
+            nid = self.search(cr, uid, domain, context=context)
+            return self.get_by_id(cr, uid, nid, context=context)
         return False
+
+    def _get_domain(self, cr, uid, prop_name, model, context=None):
+        cr.execute('select id from ir_model_fields where name=%s and model=%s', (prop_name, model))
+        res = cr.fetchone()
+        if not res:
+            return None
+
+        company = self.pool.get('res.company')
+        cid = company._company_default_get(cr, uid, model, res[0],
+                                           context=context)
+
+        domain = ['&', ('fields_id', '=', res[0]),
+                '|', ('company_id', '=', cid), ('company_id', '=', False)]
+        return domain
+
 ir_property()
 
 
index 3a2f561..e2a98f3 100644 (file)
                     <field name="name" select="1"/>
                     <field name="company_id" select="1" groups="base.group_multi_company"/>
                     <field colspan="4" name="fields_id" select="1"/>
-                    <field colspan="4" name="value"/>
+                    <field colspan="4" name="type"/>
+                    <group colspan="4" attrs="{'invisible' : [('type', 'not in', ('integer', 'integer_big'))]}">
+                        <field colspan="4" name="value_integer" widget="integer"/>
+                    </group>
+                    <group colspan="4" attrs="{'invisible' : [('type', '!=', 'float')]}">
+                        <field colspan="4" name="value_float" />
+                    </group>
+                    <group colspan="4" attrs="{'invisible' : [('type', 'not in', ('date', 'datetime'))]}">
+                        <field colspan="4" name="value_datetime" />
+                    </group>
+                    <group colspan="4" attrs="{'invisible' : [('type', 'not in', ('char', 'text'))]}">
+                        <field colspan="4" name="value_text" />
+                    </group>
+                    <group colspan="4" attrs="{'invisible' : [('type', '!=', 'many2one')]}">
+                        <field colspan="4" name="value_reference" />
+                    </group>
+                    <group colspan="4" attrs="{'invisible' : [('type', '!=', 'binary')]}">
+                        <field colspan="4" name="value_binary" />
+                    </group>
                     <field colspan="4" name="res_id" groups="base.group_extended"/>
                 </form>
             </field>
index c48c5bb..ba9dbcf 100644 (file)
@@ -59,43 +59,17 @@ class res_partner_event(osv.osv):
     _name = "res.partner.event"
     _columns = {
         'name': fields.char('Events',size=64, required=True),
-        'som': fields.many2one('res.partner.som', 'State of Mind'),
         'description': fields.text('Description'),
-        'planned_cost': fields.float('Planned Cost'),
-        'planned_revenue': fields.float('Planned Revenue'),
-        'probability': fields.float('Probability (0.50)'),
-        'document': fields.reference('Document', selection=_links_get, size=128),
         'partner_id': fields.many2one('res.partner', 'Partner', select=True),
         'date': fields.datetime('Date', size=16),
         'user_id': fields.many2one('res.users', 'User'),
-        'canal_id': fields.many2one('res.partner.canal', 'Channel'),
-        'partner_type': fields.selection([('customer','Customer'),('retailer','Retailer'),('prospect','Commercial Prospect')], 'Partner Relation'),
-        'type': fields.selection([('sale','Sale Opportunity'),('purchase','Purchase Offer'),('prospect','Prospect Contact')], 'Type of Event'),
-        'event_ical_id': fields.char('iCal id', size=64),
     }
     _order = 'date desc'
     _defaults = {
-        'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
+        'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'), 
+        'user_id': lambda self, cr, uid, context: uid, 
     }
 res_partner_event()
 
 
-class res_partner_event_type(osv.osv):
-    _name = "res.partner.event.type"
-    _description = "Partner Events"
-    _columns = {
-        'name': fields.char('Event Type',size=64, required=True),
-        'key': fields.char('Key', size=64, required=True),
-        'active': fields.boolean('Active'),
-    }
-    _defaults = {
-        'active': lambda *a: 1
-    }
-    def check(self, cr, uid, key, context={}):
-        return self.search(cr, uid, [('key','=',key)])
-res_partner_event_type()
-
-
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
index 3a0e25b..d4cde68 100644 (file)
         <menuitem id="next_id_14" name="Partner Events" parent="base.menu_base_config_partner"/>
         <menuitem action="res_partner_canal-act" id="menu_res_partner_canal-act" parent="next_id_14"/>
 
-        <record id="res_partner_event_type-view" model="ir.ui.view">
-            <field name="name">res.partner.event.type.form</field>
-            <field name="model">res.partner.event.type</field>
-            <field name="type">form</field>
-            <field name="arch" type="xml">
-                <form string="Event Type">
-                    <field name="name" select="1"/>
-                    <field name="active" select="1"/>
-                    <field name="key" select="1"/>
-                </form>
-            </field>
-        </record>
-
-        <record id="res_partner_event_type_view_tree" model="ir.ui.view">
-            <field name="name">res.partner.event.type.tree</field>
-            <field name="model">res.partner.event.type</field>
-            <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <tree string="Event Type">
-                    <field name="name"/>
-                    <field name="active"/>
-                </tree>
-            </field>
-        </record>
-
-        <record id="res_partner_event_type-act" model="ir.actions.act_window">
-            <field name="name">Active Partner Events</field>
-            <field name="res_model">res.partner.event.type</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="context">{'active_test': False}</field>
-        </record>
-        <menuitem action="res_partner_event_type-act" id="menu_res_partner_event_type-act" parent="base.next_id_14"/>
-
         <record id="res_partner_som_tree-view" model="ir.ui.view">
             <field name="name">res.partner.som.tree</field>
             <field name="model">res.partner.som</field>
             <field name="model">res.partner.event</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
-                <form string="Partner Events">
+                <form string="Event Logs">
                     <separator colspan="4" string="General Description"/>
-                    <field name="name" select="1"/>
-                    <field name="partner_type" select="1"/>
-                    <field name="som" select="1"/>
+                    <field name="name" select="1" string="Name"/>
                     <field name="date" select="1"/>
-                    <field name="canal_id" select="1"/>
-                    <field name="type" select="1"/>
                     <field name="user_id" select="1"/>
-                    <field name="probability"/>
-                    <field name="planned_revenue"/>
-                    <field name="planned_cost"/>
                     <separator colspan="4" string="Description"/>
-                    <field colspan="4" name="description"/>
-                    <separator colspan="4" string="Document Link"/>
-                    <field colspan="4" name="document"/>
+                    <field colspan="4" name="description" nolabel="1"/>
                 </form>
             </field>
         </record>
             <field name="model">res.partner.event</field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
-                <tree string="Partner Events">
+                <tree string="Event Logs">
                     <field name="date"/>
-                    <field name="name"/>
-                    <field name="som"/>
-                    <field name="partner_type"/>
+                    <field name="name" string="Event"/>
                     <field name="user_id"/>
                 </tree>
             </field>
index 0cdf3d9..84994ff 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
@@ -27,21 +27,6 @@ import ir
 import pooler
 from tools.translate import _
 
-class res_partner_function(osv.osv):
-    _name = 'res.partner.function'
-    _description = 'Function of the contact'
-    _columns = {
-        'name': fields.char('Function Name', size=64, required=True),
-        'code': fields.char('Code', size=8, required=True),
-        'ref':fields.char('Notes', size=32,),
-    }
-    _order = 'name'
-    _sql_constraints = [
-        ('code_uniq', 'unique (code)', 'The Code of the Partner Function must be unique !')
-    ]
-res_partner_function()
-
-
 class res_payterm(osv.osv):
     _description = 'Payment term'
     _name = 'res.payterm'
@@ -134,12 +119,12 @@ class res_partner(osv.osv):
         'title': fields.selection(_partner_title_get, 'Title', size=32),
         'parent_id': fields.many2one('res.partner','Parent Partner', select=2),
         'child_ids': fields.one2many('res.partner', 'parent_id', 'Partner Ref.'),
-        'ref': fields.char('Code', size=64),
+        'ref': fields.char('Reference', size=64),
         'lang': fields.selection(_lang_get, 'Language', size=5, help="If the selected language is loaded in the system, all documents related to this partner will be printed in this language. If not, it will be english."),
         'user_id': fields.many2one('res.users', 'Salesman', help='The internal user that is in charge of communicating with this partner if any.'),
         'vat': fields.char('VAT',size=32 ,help="Value Added Tax number. Check the box if the partner is subjected to the VAT. Used by the VAT legal statement."),
         'bank_ids': fields.one2many('res.partner.bank', 'partner_id', 'Banks'),
-        'website': fields.char('Website',size=64),
+        'website': fields.char('Website',size=64, help="Website of Partner"),
         'comment': fields.text('Notes'),
         'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'),
         'category_id': fields.many2many('res.partner.category', 'res_partner_category_rel', 'partner_id', 'category_id', 'Categories'),
@@ -149,10 +134,13 @@ class res_partner(osv.osv):
         'active': fields.boolean('Active'),
         'customer': fields.boolean('Customer', help="Check this box if the partner is a customer."),
         'supplier': fields.boolean('Supplier', help="Check this box if the partner is a supplier. If it's not checked, purchase people will not see it when encoding a purchase order."),
-        'city': fields.related('address', 'city', type='char', string='City'), 
-        'phone': fields.related('address', 'phone', type='char', string='Phone'), 
-        'country': fields.related('address', 'country_id', type='many2one', relation='res.country', string='Country'), 
-        'company_id': fields.many2one('res.company', 'Company', select=1), 
+        'city': fields.related('address', 'city', type='char', string='City'),
+        'phone': fields.related('address', 'phone', type='char', string='Phone'),
+        'mobile': fields.related('address', 'mobile', type='char', string='Mobile'),
+        'country': fields.related('address', 'country_id', type='many2one', relation='res.country', string='Country'),
+        'employee': fields.boolean('Employee', help="Check this box if the partner is an Employee."),
+        'email': fields.related('address', 'email', type='char', size=240, string='E-mail'),
+        'company_id': fields.many2one('res.company', 'Company', select=1),
     }
 
     def _default_category(self, cr, uid, context={}):
@@ -289,7 +277,7 @@ class res_partner_address(osv.osv):
     _columns = {
         'partner_id': fields.many2one('res.partner', 'Partner', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."),
         'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."),
-        'function': fields.many2one('res.partner.function', 'Function'),
+        'function': fields.char('Function', size=64),
         'title': fields.selection(_contact_title_get, 'Title', size=32),
         'name': fields.char('Contact Name', size=64, select=1),
         'street': fields.char('Street', size=128),
@@ -303,6 +291,8 @@ class res_partner_address(osv.osv):
         'fax': fields.char('Fax', size=64),
         'mobile': fields.char('Mobile', size=64),
         'birthdate': fields.char('Birthdate', size=64),
+        'is_customer_add': fields.related('partner_id', 'customer', type='boolean', string='Customer'),
+        'is_supplier_add': fields.related('partner_id', 'supplier', type='boolean', string='Supplier'),
         'active': fields.boolean('Active', help="Uncheck the active field to hide the contact."),
 #        'company_id': fields.related('partner_id','company_id',type='many2one',relation='res.company',string='Company', store=True),
         'company_id': fields.many2one('res.company', 'Company',select=1),
@@ -467,7 +457,7 @@ class res_partner_category(osv.osv):
     _columns = {
         'partner_ids': fields.many2many('res.partner', 'res_partner_category_rel', 'category_id', 'partner_id', 'Partners'),
     }
-   
+
 res_partner_category()
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 407a541..642c4cc 100644 (file)
             <field name="shortcut">M.</field>
         </record>
 
-        <record id="function_director" model="res.partner.function">
-            <field name="name">Director</field>
-            <field name="code">CEO</field>
-        </record>
-        <record id="function_it" model="res.partner.function">
-            <field name="name">Chief Technical Officer</field>
-            <field name="code">CTO</field>
-        </record>
-        <record id="function_sale" model="res.partner.function">
-            <field name="name">Salesman</field>
-            <field name="code">SAL</field>
-        </record>
-
         <!-- Default bank account description -->
         <record id="bank_normal" model="res.partner.bank.type">
             <field name="name">Bank account</field>
index c6de312..915ab90 100644 (file)
             <field name="type">default</field>
             <field name="partner_id" ref="res_partner_agrolait"/>
         </record>
+        <record id="res_partner_address_8delivery" model="res.partner.address">
+            <field name="city">Wavre</field>
+            <field name="name">Paul Lelitre</field>
+            <field name="zip">5478</field>
+            <field name="title">M.</field>
+            <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/>
+            <field name="street">71 rue de Chimay</field>
+            <field name="type">delivery</field>
+            <field name="partner_id" ref="res_partner_agrolait"/>
+        </record>
+        <record id="res_partner_address_8invoice" model="res.partner.address">
+            <field name="city">Wavre</field>
+            <field name="name">Serge Lelitre</field>
+            <field name="zip">5478</field>
+            <field name="title">M.</field>
+            <field model="res.country" name="country_id" search="[('name','=','Belgium')]"/>
+            <field name="street">69 rue de Chimay</field>
+            <field name="type">invoice</field>
+            <field name="partner_id" ref="res_partner_agrolait"/>
+        </record>
         <record id="res_partner_address_9" model="res.partner.address">
             <field name="city">Paris</field>
             <field name="name">Arthur Grosbonnet</field>
         <record id="res_partner_asustek_request" model="res.request">
                <field name="name">ASUSTEK-Subject</field>
                <field name="act_to" ref="user_demo"/>
-                       <field name="ref_doc1">res.partner,2</field>
+                       <field name="ref_doc1" ref="res_partner_asus"/>
         </record>
     </data>
 </openerp>
index b405741..61e3876 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
     <data>
-        <report id="res_partner_address_report" model="res.partner" name="res.partner.address" string="Labels" xml="base/res/partner/report/partner_address.xml" xsl="base/res/partner/report/partner_address.xsl"/>
-        <!-- 
+        <report id="res_partner_address_report" model="res.partner" name="res.partner.address" string="Labels" xml="base/res/partner/report/partner_address.xml" xsl="base/res/partner/report/partner_address.xsl" groups="base.group_extended"/>
+        <!--
                <report string="Business Cards" model="res.partner" name="res.partner.businesscard" xml="base/res/partner/report/business_card.xml" xsl="base/res/partner/report/business_card.xsl"/>
                -->
     </data>
index 38dbeb3..7c448ba 100644 (file)
@@ -6,45 +6,10 @@
         <menuitem id="menu_base_config" name="Configuration" parent="menu_base_partner" sequence="9"
             groups="group_system"/>
 
-        <menuitem id="menu_base_config_partner" name="Partners" parent="menu_base_config" sequence="10" />
+        <menuitem id="menu_base_config_partner" name="Partners" parent="menu_base_config" sequence="10" groups="base.group_extended"/>
         <menuitem id="menu_base_config_contact" name="Contacts" parent="menu_base_config" sequence="20" />
 
         <!--
-          ================================
-          Function
-          ================================
-        -->
-        <record id="view_partner_function_form" model="ir.ui.view">
-            <field name="name">res.partner.function.form</field>
-            <field name="model">res.partner.function</field>
-            <field name="type">form</field>
-            <field name="arch" type="xml">
-                <form string="Contact Functions">
-                    <field name="name" select="1"/>
-                    <field name="code" select="1"/>
-                </form>
-            </field>
-        </record>
-        <record id="view_partner_function_tree" model="ir.ui.view">
-            <field name="name">res.partner.function.tree</field>
-            <field name="model">res.partner.function</field>
-            <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <tree string="Contact Functions">
-                    <field name="code"/>
-                    <field name="name"/>
-                </tree>
-            </field>
-        </record>
-        <record id="action_partner_function_form" model="ir.actions.act_window">
-            <field name="name">Contact Functions</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">res.partner.function</field>
-            <field name="view_type">form</field>
-        </record>
-        <menuitem action="action_partner_function_form" id="menu_partner_function_form" parent="base.menu_base_config_contact" sequence="20"/>
-
-        <!--
           =====================
           Partner Address
           =====================
             <field name="type">search</field>
             <field name="arch" type="xml">
                 <search string="Search Contact">
-                    <field name="name" select='1'/>
-                    <field name="partner_id" select='1'/>
-                    <field name="country_id" select='1'/>
-                </search>
+                    <group>
+                        <filter string="Customer" name="customer" icon="terp-crm" domain="[('is_customer_add','=','1')]" />
+                        <filter string="Supplier" name="supplier"  icon="terp-crm" domain="[('is_supplier_add','=','1')]" />
+                        <separator orientation="vertical"/>
+                        <field name="partner_id" />
+                        <field name="name" />
+                        <field name="country_id" />
+                    </group>
+                    <newline/>
+                    <group expand="1" string="Group By...">
+                       <filter string="Partner" icon="terp-crm" domain="[]" context="{'group_by' : 'partner_id'}" />
+                       <filter string="Country" icon="terp-crm" domain="[]" context="{'group_by' : 'country_id'}" />
+                       <filter string="Type" icon="terp-crm" domain="[]" context="{'group_by' : 'type'}" />
+                   </group>
+                 </search>
             </field>
         </record>
 
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">res.partner.address</field>
             <field name="view_type">form</field>
+            <field name="context">{"search_default_customer":1}</field>
             <field name="search_view_id" ref="view_res_partner_address_filter"/>
         </record>
         <record id="action_partner_address_form_view1" model="ir.actions.act_window.view">
             <field name="arch" type="xml">
                 <tree string="Partners">
                     <field name="name"/>
-                    <field name="ref"/>
+                    <field name="ref" groups="base.group_extended"/>
                     <field name="phone"/>
                     <field name="city"/>
                     <field name="country"/>
+                    <field name="email"/>
                     <field name="lang"/>
                     <field name="user_id"/>
                 </tree>
                         <group colspan="1" col="2">
                             <field name="customer" select="1"/>
                             <field name="supplier"/>
+                            <field name="employee"/>
                         </group>
                     </group>
                     <notebook colspan="4">
                                     <field name="email"/>
                                 </tree>
                             </field>
-                            <separator colspan="4" string="Categories"/>
-                            <field colspan="4" name="category_id" nolabel="1" height="90"/>
+                            <group  groups="base.group_extended">
+                                    <separator colspan="4" string="Categories"/>
+                                    <field  colspan="4" name="category_id" nolabel="1"/>
+                            </group>
                         </page>
                         <page string="Sales &amp; Purchases">
                             <separator string="General Information" colspan="4"/>
                             <field name="company_id" groups="base.group_multi_company" widget="selection"/>
                             <newline/>
                         </page>
-                        <page string="History">
-                            <field colspan="4" name="events" nolabel="1" widget="one2many_list"/>
-                        </page>
                         <page string="Notes">
                             <field colspan="4" name="comment" nolabel="1"/>
                         </page>
+                        <page string="History">
+                            <field colspan="4" name="events" nolabel="1" widget="one2many_list" string="Event Logs"/>
+                        </page>
+
                     </notebook>
                 </form>
             </field>
             <field name="arch" type="xml">
                 <search string="Search Partner">
                    <group col='10' colspan='4'>
-                        <filter string="My Partners" icon="terp-partner" domain="[('user_id','=',uid)]"/>
-                        <separator orientation="vertical"/>
                         <filter string="Customers" icon="terp-partner" domain="[('customer','=',1)]" help="Customer Partners"/>
                         <filter string="Suppliers" icon="terp-partner" domain="[('supplier','=',1)]" help="Supplier Partners"/>
                         <separator orientation="vertical"/>
                         <field name="address" select="1"/>
                         <field name="country" select="1"/>
                         <field name="category_id" select="1"/>
-                        <field name="user_id" select="1"/>
+                        <field name="user_id" select="1">
+                            <filter string="My Partners" icon="terp-partner" domain="[('user_id','=',uid)]"/>
+                        </field>
+                   </group>
+                   <newline />
+                   <group expand="1" string="Group By...">
+                       <filter string="Salesman" icon="terp-crm" domain="[]" context="{'group_by' : 'user_id'}" />
                    </group>
                </search>
             </field>
         </record>
 
         <record id="action_partner_form" model="ir.actions.act_window">
-            <field name="name">Partners</field>
+            <field name="name">Customers</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">res.partner</field>
             <field name="view_type">form</field>
             <field name="filter" eval="True"/>
         </record>
 
+        <record id="action_partner_employee_form" model="ir.actions.act_window">
+            <field name="name">Employees</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">res.partner</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('employee','=',1)]</field>
+            <field name="context">{'default_customer':0, 'default_supplier':0 , 'default_employee':1}</field>
+            <field name="filter" eval="True"/>
+        </record>
+
         <record id="action_partner_other_form" model="ir.actions.act_window">
             <field name="name">Other Partners</field>
             <field name="type">ir.actions.act_window</field>
 
         <!--
           ======================
-          Company Architecture
-          ======================
-        -->
-        <record id="view_partner_tree2" model="ir.ui.view">
-            <field name="name">res.partner.tree</field>
-            <field name="model">res.partner</field>
-            <field name="type">tree</field>
-            <field name="field_parent">child_ids</field>
-            <field name="arch" type="xml">
-                <tree string="Partners">
-                    <field name="name"/>
-                    <field name="lang"/>
-                    <field name="ref"/>
-                </tree>
-            </field>
-        </record>
-        <record id="action2" model="ir.actions.act_window">
-            <field name="name">Company Architecture</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">res.partner</field>
-            <field name="domain">[('id','in',active_ids)]</field>
-            <field name="view_type">tree</field>
-            <field name="view_id" ref="view_partner_tree2"/>
-        </record>
-        <record id="ir_partner_structure" model="ir.values">
-            <field eval="'client_action_multi'" name="key2"/>
-            <field eval="'res.partner'" name="model"/>
-            <field name="name">Company Architecture</field>
-            <field eval="'ir.actions.act_window,'+str(action2)" name="value"/>
-            <field eval="True" name="object"/>
-        </record>
-
-        <!--
-          ======================
           Categories
           ======================
         -->
         <act_window domain="[('partner_id', '=', active_id)]"
             id="act_res_partner_event" name="Events"
             res_model="res.partner.event"
-            src_model="res.partner"/>
+            src_model="res.partner"
+            groups="base.group_extended"
+            />
+
+        <record id="ir_ui_view_sc_partner0" model="ir.ui.view_sc">
+            <field name="name">Address Book</field>
+            <field name="resource">ir.ui.menu</field>
+            <field name="user_id" ref="base.user_root"/>
+             <field name="res_id" ref="menu_partner_form"/>
+        </record>
 
     </data>
 </openerp>
index c064644..cc62aa9 100644 (file)
@@ -1,11 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <openerp>
-    <data>
-        <wizard id="res_partner_send_sms_wizard" model="res.partner" name="res.partner.sms_send" string="Send SMS"/>
+    <data>        
         <wizard id="res_partner_mass_mailing_wizard" model="res.partner" name="res.partner.spam_send" string="Mass Mailing"/>
-        <!--
-               <wizard string="Check EAN13" model="res.partner" name="res.partner.ean13"/>
-               <wizard string="Clear IDs" model="res.partner" name="res.partner.clear_ids"/>
-               -->
+        
     </data>
 </openerp>
index b1f0add..f1a8574 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
-import wizard_sms
 import wizard_spam
 import wizard_clear_ids
 import wizard_ean_check
+import partner_sms_send
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
diff --git a/bin/addons/base/res/partner/wizard/partner_sms_send.py b/bin/addons/base/res/partner/wizard/partner_sms_send.py
new file mode 100644 (file)
index 0000000..e04a3a0
--- /dev/null
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import wizard
+import netsvc
+import tools
+from osv import fields, osv
+
+class partner_sms_send(osv.osv_memory):
+    """ Create Menu """
+
+    _name = "partner.sms.send"
+    _description = "Send SMS"
+
+    _columns = {
+        'mobile_to': fields.char('To', size=256, required=True),
+        'app_id': fields.char('API ID', size=256,required=True),
+        'user': fields.char('Login', size=256,required=True),
+        'password': fields.char('Password', size=256,required=True),
+        'text': fields.text('SMS Message',required=True),
+    }
+
+    def default_get(self, cr, uid, fields, context=None):
+        """
+        This function gets default values
+        @param self: The object pointer
+        @param cr: the current row, from the database cursor,
+        @param uid: the current user’s ID for security checks,
+        @param fields: List of fields for default value
+        @param context: A standard dictionary for contextual values
+
+        @return : default values of fields.
+        """
+        partner_pool = self.pool.get('res.partner')
+        active_ids = context and context.get('active_ids', [])
+        res = {}
+        for partner in partner_pool.browse(cr, uid, active_ids, context=context):            
+            if 'mobile_to' in fields:
+                res.update({'mobile_to': partner.mobile})            
+        return res
+
+    def sms_send(self, cr, uid, ids, context):
+        """
+            to send sms
+
+            @param cr: the current row, from the database cursor.
+            @param uid: the current user’s ID for security checks.
+            @param ids: the ID or list of IDs
+            @param context: A standard dictionary
+            @return: number indicating the acknowledgement
+        """             
+        nbr = 0
+        
+        for data in self.browse(cr, uid, ids, context) :
+            tools.sms_send(
+                    data.user,
+                    data.password, 
+                    data.app_id, 
+                    tools.ustr(data.text), 
+                    data.mobile_to)
+            nbr += 1
+        return {}
+partner_sms_send()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/bin/addons/base/res/partner/wizard/partner_sms_send_view.xml b/bin/addons/base/res/partner/wizard/partner_sms_send_view.xml
new file mode 100644 (file)
index 0000000..fafdc33
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+<!-- Create Menu From view -->
+
+        <record id="view_partner_sms_send" model="ir.ui.view">
+            <field name="name">Send SMS</field>
+            <field name="model">partner.sms.send</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+              <form string="SMS - Gateway: clickatell">
+                    <separator string="Bulk SMS send" colspan="4"/>
+                    <field name="mobile_to"/>
+                    <field name="app_id"/>
+                                   <field name="user"/>
+                                   <field name="password"/>                                
+                    <separator string="Message" colspan="4" />
+                                   <field name="text" colspan="4" nolabel="1"/>
+                               <separator string="" colspan="4" />
+                    <group colspan="4" col="6">
+                        <button special="cancel" string="Cancel" icon="gtk-cancel"/>
+                        <button name="sms_send" string="Send SMS" type="object" icon="gtk-go-back"/>
+                    </group>
+             </form>
+            </field>
+        </record>
+
+       <act_window name="SMS Send"
+            res_model="partner.sms.send"
+            src_model="res.partner"
+            view_mode="form"
+            target="new"
+            key2="client_action_multi"
+            id="action_partner_sms_send"
+            groups="base.group_extended"/>
+    </data>
+</openerp>
diff --git a/bin/addons/base/res/partner/wizard/wizard_sms.py b/bin/addons/base/res/partner/wizard/wizard_sms.py
deleted file mode 100644 (file)
index 0835938..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#    
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU Affero General Public License as
-#    published by the Free Software Foundation, either version 3 of the
-#    License, or (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU Affero General Public License for more details.
-#
-#    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
-#
-##############################################################################
-
-import wizard
-import netsvc
-import tools
-
-sms_send_form = '''<?xml version="1.0"?>
-<form string="%s">
-    <separator string="%s" colspan="4"/>
-    <field name="app_id"/>
-    <newline/>
-    <field name="user"/>
-    <field name="password"/>
-    <newline/>
-    <field name="text" colspan="4"/>
-</form>''' % ('SMS - Gateway: clickatell','Bulk SMS send')
-
-sms_send_fields = {
-    'app_id': {'string':'API ID', 'type':'char', 'required':True},
-    'user': {'string':'Login', 'type':'char', 'required':True},
-    'password': {'string':'Password', 'type':'char', 'required':True},
-    'text': {'string':'SMS Message', 'type':'text', 'required':True}
-}
-
-def _sms_send(self, cr, uid, data, context):
-    service = netsvc.LocalService("object_proxy")
-
-    res_ids = service.execute(cr.dbname, uid, 'res.partner.address', 'search', [('partner_id','in',data['ids']),('type','=','default')])
-    res = service.execute(cr.dbname, uid, 'res.partner.address', 'read', res_ids, ['mobile'])
-
-    nbr = 0
-    for r in res:
-        to = r['mobile']
-        if to:
-            tools.sms_send(data['form']['user'], data['form']['password'], data['form']['app_id'], unicode(data['form']['text'], 'utf-8').encode('latin1'), to)
-            nbr += 1
-    return {'sms_sent': nbr}
-
-class part_sms(wizard.interface):
-    states = {
-        'init': {
-            'actions': [],
-            'result': {'type': 'form', 'arch':sms_send_form, 'fields': sms_send_fields, 'state':[('end','Cancel'), ('send','Send SMS')]}
-        },
-        'send': {
-            'actions': [_sms_send],
-            'result': {'type': 'state', 'state':'end'}
-        }
-    }
-part_sms('res.partner.sms_send')
-
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
index ea64aa5..7d8a9cd 100644 (file)
@@ -25,7 +25,6 @@ import os
 import tools
 from tools.translate import _
 
-
 class multi_company_default(osv.osv):
     """
     Manage multi company default value
@@ -85,17 +84,20 @@ class res_company(osv.osv):
         'logo' : fields.binary('Logo'),
         'currency_id': fields.many2one('res.currency', 'Currency', required=True),
         'currency_ids': fields.one2many('res.currency', 'company_id', 'Currency'),
-        'user_ids': fields.many2many('res.users', 'res_company_users_rel', 'cid', 'user_id', 'Accepted Users')
+        'user_ids': fields.many2many('res.users', 'res_company_users_rel', 'cid', 'user_id', 'Accepted Users'),
+        'account_no':fields.char('Account No.', size=64),
     }
 
-    def search(self, cr, user, args, offset=0, limit=None, order=None,
+    def search(self, cr, uid, args, offset=0, limit=None, order=None,
             context=None, count=False):
-        if context and context.has_key('user_prefence') and context['user_prefence']:
-            cmp_ids = []
-            data_user = self.pool.get('res.users').browse(cr, user, [user], context=context)
-            map(lambda x: cmp_ids.append(x.id), data_user[0].company_ids)
-            return [data_user[0].company_id.id] + cmp_ids
-        return super(res_company, self).search(cr, user, args, offset=offset, limit=limit, order=order,
+
+        user_preference = context and context.get('user_preference', False) or False
+        if user_preference:
+            user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+            cmp_ids = list(set([user.company_id.id] + [cmp.id for cmp in user.company_ids]))
+
+            return cmp_ids
+        return super(res_company, self).search(cr, uid, args, offset=offset, limit=limit, order=order,
             context=context, count=count)
 
     def _company_default_get(self, cr, uid, object=False, field=False, context=None):
@@ -107,11 +109,9 @@ class res_company(osv.osv):
         proxy = self.pool.get('multi_company.default')
         args = [
             ('object_id.model', '=', object),
+            ('field_id', '=', field),
         ]
-        if field:
-            args.append(('field_id.name','=',field))
-        else:
-            args.append(('field_id','=',False))
+
         ids = proxy.search(cr, uid, args, context=context)
         for rule in proxy.browse(cr, uid, ids, context):
             user = self.pool.get('res.users').browse(cr, uid, uid)
@@ -179,6 +179,12 @@ class res_company(osv.osv):
             level -= 1
         return True
 
+    def _get_logo(self, cr, uid, ids):
+        return open(os.path.join(
+            tools.config['root_path'], '..', 'pixmaps', 'openerp-header.png'),
+                    'rb') .read().encode('base64')
+
+
     def _get_header2(self,cr,uid,ids):
         return """
         <header>
@@ -240,7 +246,8 @@ class res_company(osv.osv):
     _defaults = {
         'currency_id': _get_euro,
         'rml_header':_get_header,
-        'rml_header2': _get_header2
+        'rml_header2': _get_header2,
+        'logo':_get_logo
     }
 
     _constraints = [
index 68a5a38..e885476 100644 (file)
 #
 ##############################################################################
 
+import os
+import base64
+import random
 from operator import attrgetter
 
 from osv import osv, fields
+import tools
 from tools.translate import _
 import netsvc
 import pooler
 
+
+
 class res_config_configurable(osv.osv_memory):
     ''' Base classes for new-style configuration items
 
@@ -45,11 +51,19 @@ class res_config_configurable(osv.osv_memory):
             return round(open*100./total)
         return 100.
 
+    def _get_image(self, cr, uid, context=None):
+        file_no = str(random.randint(1,3))
+        path = os.path.join('base','res','config_pixmaps/%s.png'%file_no)
+        file_data = tools.file_open(path,'rb').read()
+        return base64.encodestring(file_data)
+
     _columns = dict(
-        progress=fields.float('Configuration Progress', readonly=True),
+        progress = fields.float('Configuration Progress', readonly=True),
+        config_logo = fields.binary('Image', readonly=True),
         )
     _defaults = dict(
-        progress=_progress
+        progress = _progress,
+        config_logo = _get_image
         )
 
     def _next_action(self, cr, uid):
@@ -58,8 +72,18 @@ class res_config_configurable(osv.osv_memory):
                                   'getting next %s' % todos)
         active_todos = todos.search(cr, uid, [('state','=','open')],
                                     limit=1)
+        dont_skip_todo = True
         if active_todos:
-            return todos.browse(cr, uid, active_todos[0], context=None)
+            todo_obj = todos.browse(cr, uid, active_todos[0], context=None)
+            todo_groups = map(lambda x:x.id, todo_obj.groups_id)
+            if todo_groups:
+                cr.execute("select 1 from res_groups_users_rel where uid=%s and gid=ANY(%s)",(uid, todo_groups,))
+                dont_skip_todo = bool(cr.fetchone())
+            if dont_skip_todo:
+                return todos.browse(cr, uid, active_todos[0], context=None)
+            else:
+                todos.write(cr, uid, active_todos[0], {'state':'skip'}, context=None)
+                return self._next_action(cr, uid)
         return None
 
     def _set_previous_todo(self, cr, uid, state):
index 11d7530..6d22a0a 100644 (file)
@@ -5,22 +5,29 @@
       <field name="model">res.config</field>
       <field name="type">form</field>
       <field name="arch" type="xml">
-        <form>
-          <group string="res_config_contents">
-          </group>
-          <separator string="" colspan="4"/>
-          <group colspan="4" col="8">
-            <field name="progress" widget="progressbar"/>
-            <label string="" colspan="3"/>
-            <group colspan="1" col="2">
-              <button name="action_skip" icon="gtk-goto-last" special="cancel"
-                      type="object" string="Skip"/>
-            </group>
-            <group colspan="1" col="2">
-              <button name="action_next" icon="gtk-go-forward"
-                      type="object" string="Next"/>
-            </group>
-          </group>
+       <form>
+               <group colspan="4" col="8">
+               <group colspan="3" width="200" height="250">
+                       <field name="config_logo" widget="image" width="150" height="100" nolabel="1" colspan="1"/>
+                       <newline/>
+                       <label align="0.0" string="description" width="200" colspan="2"/>
+               </group>
+               <separator string="vsep" position="vertical" colspan="1" rowspan="12"/>
+               <group colspan="4">
+                       <separator string="title" colspan="4"/>
+                       <group string="res_config_contents"/>
+               </group>
+                       </group>
+               <group colspan="8" col="8">
+                       <separator string="" colspan="8"/>
+                       <group colspan="4" width="220">
+                               <field name="progress" widget="progressbar" nolabel="1" colspan="2"/>
+                       </group>
+                                       <button name="action_skip" icon="gtk-jump-to" special="cancel"
+                               type="object" string="Skip" colspan="1"/>
+                       <button name="action_next" icon="gtk-go-forward"
+                                type="object" string="Next" colspan="1"/>
+           </group>
         </form>
       </field>
     </record>
       <field name="model">res.config.installer</field>
       <field name="type">form</field>
       <field name="arch" type="xml">
-
         <form>
-          <group colspan="4">
-            <separator string="title" colspan="4"/>
-            <group colspan="4" col="10">
-              <group colspan="2">
-                <image name="gtk-dialog-info"/>
-                <newline/>
-                <label align="0.0" string="description" width="200"/>
-              </group>
-              <group colspan="8"/>
-            </group>
-          </group>
-          <separator string="" colspan="4"/>
-          <group colspan="4" col="8">
-            <field name="progress" widget="progressbar"/>
-            <label string="" colspan="3"/>
-            <group colspan="1" col="2">
-              <button name="action_skip" icon="gtk-goto-last" special="cancel"
-                      type="object" string="Skip"/>
-            </group>
-            <group colspan="1" col="2">
-              <button name="action_next" icon="gtk-go-forward"
-                      type="object" string="Install Modules"/>
-            </group>
-          </group>
+               <group colspan="4" col="8">
+               <group colspan="3" width="200" height="250">
+                       <field name="config_logo" widget="image" width="150" height="100" nolabel="1" colspan="1"/>
+                       <newline/>
+                       <label align="0.0" string="description" width="200" colspan="2"/>
+               </group>
+               <separator string="vsep" position="vertical" colspan="1" rowspan="12"/>
+               <group colspan="4">
+                       <separator string="title" colspan="4"/>
+                       <group colspan="8"/>
+               </group>
+                       </group>
+               <group colspan="8" col="8">
+                       <separator string="" colspan="8"/>
+                       <group colspan="4" width="220">
+                               <field name="progress" widget="progressbar" nolabel="1" colspan="2"/>
+                       </group>
+                                       <button name="action_skip" icon="gtk-jump-to" special="cancel"
+                               type="object" string="Skip" colspan="1"/>
+                       <button name="action_next" icon="gtk-go-forward"
+                                type="object" string="Install Modules" colspan="1"/>
+                               </group>
         </form>
 
       </field>
index 8427b36..66c1463 100644 (file)
@@ -60,11 +60,11 @@ class lang(osv.osv):
         ('name_uniq', 'unique (name)', 'The name of the language must be unique !'),
         ('code_uniq', 'unique (code)', 'The code of the language must be unique !'),
     ]
-    
+
     @tools.cache(skiparg=3)
     def _lang_data_get(self, cr, uid, lang_id, monetary=False):
         conv = localeconv()
-        lang_obj=self.browse(cr,uid,lang_id)
+        lang_obj = self.browse(cr, uid, lang_id)
         thousands_sep = lang_obj.thousands_sep or conv[monetary and 'mon_thousands_sep' or 'thousands_sep']
         decimal_point = lang_obj.decimal_point
         grouping = lang_obj.grouping
@@ -80,6 +80,7 @@ class lang(osv.osv):
         
         if not grouping:
             return (s, 0)
+
         result = ""
         seps = 0
         spaces = ""
@@ -129,7 +130,7 @@ class lang(osv.osv):
             parts = formatted.split('.')
 
             if grouping:
-                 parts[0], seps = self._group(cr,uid,ids,parts[0], monetary=monetary, grouping=lang_grouping, thousands_sep=thousands_sep)
+                parts[0], seps = self._group(cr,uid,ids,parts[0], monetary=monetary, grouping=lang_grouping, thousands_sep=thousands_sep)
 
             formatted = decimal_point.join(parts)
             while seps:
diff --git a/bin/addons/base/res/res_log.py b/bin/addons/base/res/res_log.py
new file mode 100644 (file)
index 0000000..b83e380
--- /dev/null
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+
+class res_log(osv.osv_memory):
+    _name = 'res.log'
+    _columns = {
+        'name': fields.char('Message', size=128, help='The logging message.', required=True),
+        'user_id': fields.many2one('res.users','User', required=True),
+        'res_model': fields.char('Object', size=128),
+        'res_id': fields.integer('Object ID'),
+        'secondary': fields.boolean('Secondary Log', help='Do not display this log if it belongs to the same object the user is working on')
+    }
+    _defaults = {
+        'user_id': lambda self,cr,uid,ctx: uid
+    }
+    _order='id desc'
+    # TODO: do not return secondary log if same object than in the model (but unlink it)
+    def get(self, cr, uid, context={}):
+        ids = self.search(cr, uid, [('user_id','=',uid)], context=context)
+        result = self.read(cr, uid, ids, ['name','res_model','res_id'], context=context)
+        self.unlink(cr, uid, ids, context=context)
+        return result
+res_log()
+
diff --git a/bin/addons/base/res/res_log_view.xml b/bin/addons/base/res/res_log_view.xml
new file mode 100644 (file)
index 0000000..6f08434
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="res_log_search" model="ir.ui.view">
+            <field name="name">res.log.search</field>
+            <field name="model">res.log</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Logs">
+                    <filter icon="terp-sale" string="My Logs" domain="[('user_id','=',uid)]" name="my"/>
+                    <separator orientation="vertical"/>
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <field name="res_model"/>
+                </search>
+            </field>
+        </record>
+        <record id="res_log_tree" model="ir.ui.view">
+            <field name="name">res.log.tree</field>
+            <field name="model">res.log</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree string="Logs">
+                    <field name="name"/>
+                    <field name="user_id"/>
+                </tree>
+            </field>
+        </record>
+        <record id="res_log_form" model="ir.ui.view">
+            <field name="name">res.log.form</field>
+            <field name="model">res.log</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Logs">
+                    <group colspan="4" col="6">
+                        <field name="name" colspan="4"/>
+                        <field name="user_id" />
+                        <field name="res_model"/>
+                        <field name="res_id"/>
+                    </group>
+                </form>
+            </field>
+        </record>
+
+        <record id="res_log_act_window" model="ir.actions.act_window">
+            <field name="name">Logs</field>
+            <field name="res_model">res.log</field>
+            <field name="view_type">form</field>
+            <field name="context">{'search_default_my': 1}</field>
+        </record>
+        <menuitem
+            action="res_log_act_window"
+            id="menu_res_log_act_window"
+            parent="base.next_id_4"/>
+    </data>
+</openerp>
index 8aae3a4..9d935ca 100644 (file)
@@ -6,9 +6,13 @@
         <field name="name">Partner Manager</field>
     </record>
 
-       <record model="ir.ui.menu" id="menu_base_config">
-               <field eval="[(6,0,[ref('group_system'), ref('group_partner_manager')])]" name="groups_id"/>
-       </record>
+    <record model="ir.ui.menu" id="menu_base_partner">
+        <field eval="[(6,0,[ref('group_system'), ref('group_partner_manager')])]" name="groups_id"/>
+    </record>
+
+    <record model="ir.ui.menu" id="menu_base_config">
+        <field eval="[(6,0,[ref('group_system'), ref('group_partner_manager')])]" name="groups_id"/>
+    </record>
 
 </data>
 </openerp>
index ff61b9e..70045ac 100644 (file)
@@ -22,6 +22,7 @@
 from osv import fields,osv
 from osv.orm import except_orm, browse_record
 import tools
+import operator
 import pytz
 import pooler
 from tools.translate import _
@@ -34,7 +35,7 @@ class groups(osv.osv):
     _columns = {
         'name': fields.char('Group Name', size=64, required=True),
         'model_access': fields.one2many('ir.model.access', 'group_id', 'Access Controls'),
-        'rule_groups': fields.many2many('ir.rule.group', 'group_rule_group_rel',
+        'rule_groups': fields.many2many('ir.rule', 'rule_group_rel',
             'group_id', 'rule_group_id', 'Rules', domain="[('global', '<>', True)]"),
         'menu_access': fields.many2many('ir.ui.menu', 'ir_ui_menu_group_rel', 'gid', 'menu_id', 'Access Menu'),
         'comment' : fields.text('Comment',size=250),
@@ -47,7 +48,7 @@ class groups(osv.osv):
         group_name = self.read(cr, uid, [id], ['name'])[0]['name']
         default.update({'name': group_name +' (copy)'})
         return super(groups, self).copy(cr, uid, id, default, context)
-    
+
     def write(self, cr, uid, ids, vals, context=None):
         if 'name' in vals:
             if vals['name'].startswith('-'):
@@ -82,6 +83,11 @@ class groups(osv.osv):
         default['name'] = default['name'] + _(' (copy)')
         return super(groups, self).copy(cr, uid, id, default, context=context)
 
+    def get_extended_interface_group(self, cr, uid, context=None):
+        data_obj = self.pool.get('ir.model.data')
+        extended_group_data_id = data_obj._get_id(cr, uid, 'base', 'group_extended')
+        return data_obj.browse(cr, uid, extended_group_data_id, context=context).res_id
+
 groups()
 
 class roles(osv.osv):
@@ -106,10 +112,11 @@ roles()
 
 def _lang_get(self, cr, uid, context={}):
     obj = self.pool.get('res.lang')
-    ids = obj.search(cr, uid, [])
+    ids = obj.search(cr, uid, [('translatable','=',True)])
     res = obj.read(cr, uid, ids, ['code', 'name'], context)
     res = [(r['code'], r['name']) for r in res]
     return res
+
 def _tz_get(self,cr,uid, context={}):
     return [(x, x) for x in pytz.all_timezones]
 
@@ -166,6 +173,47 @@ class users(osv.osv):
                                 body=self.get_welcome_mail_body(
                                     cr, uid, context=context) % user)
 
+    def _set_interface_type(self, cr, uid, ids, name, value, arg, context=None):
+        """Implementation of 'view' function field setter, sets the type of interface of the users.
+        @param name: Name of the field
+        @param arg: User defined argument
+        @param value: new value returned
+        @return:  True/False
+        """
+        if not value or value not in ['simple','extended']:
+            return False
+        group_obj = self.pool.get('res.groups')
+        extended_group_id = group_obj.get_extended_interface_group(cr, uid, context=context)
+        self.write(cr, uid, ids, { 'groups_id': [((3 if value == 'simple' else 4), extended_group_id)]}, context=context)
+        return True
+
+
+    def _get_interface_type(self, cr, uid, ids, name, args, context=None):
+        """Implementation of 'view' function field getter, returns the type of interface of the users.
+        @param field_name: Name of the field
+        @param arg: User defined argument
+        @return:  Dictionary of values
+        """
+        group_obj = self.pool.get('res.groups')
+        extended_group_id = group_obj.get_extended_interface_group(cr, uid, context=context)
+        extended_users = group_obj.read(cr, uid, extended_group_id, ['users'], context=context)['users']
+        return dict(zip(ids, ['extended' if user in extended_users else 'simple' for user in ids]))
+
+    def _email_get(self, cr, uid, ids, name, arg, context=None):
+        return dict([(user.id, user.address_id.email) for user in self.browse(cr, uid, ids, context=context)])
+
+    def _email_set(self, cr, uid, ids, name, value, arg, context=None):
+        if not isinstance(ids,list):
+            ids = [ids]
+        address_obj = self.pool.get('res.partner.address')
+        for user in self.browse(cr, uid, ids, context=context):
+            if user.address_id:
+                address_obj.write(cr, uid, user.address_id.id, {'email': value or None}, context=context)
+            else:
+                address_id = address_obj.create(cr, uid, {'name': user.name, 'email': value or None}, context=context)
+                self.write(cr, uid, ids, {'address_id': address_id}, context)
+        return True
+
     _columns = {
         'name': fields.char('Name', size=64, required=True, select=True,
                             help="The new user's real name, used for searching"
@@ -185,7 +233,6 @@ class users(osv.osv):
         'menu_id': fields.many2one('ir.actions.actions', 'Menu Action'),
         'groups_id': fields.many2many('res.groups', 'res_groups_users_rel', 'uid', 'gid', 'Groups'),
         'roles_id': fields.many2many('res.roles', 'res_roles_users_rel', 'uid', 'rid', 'Roles'),
-        'rules_id': fields.many2many('ir.rule.group', 'user_rule_group_rel', 'user_id', 'rule_group_id', 'Rules'),
         'company_id': fields.many2one('res.company', 'Company', required=True,
             help="The company this user is currently working for."),
         'company_ids':fields.many2many('res.company','res_company_users_rel','user_id','cid','Companies'),
@@ -195,7 +242,12 @@ class users(osv.osv):
         'context_tz': fields.selection(_tz_get,  'Timezone', size=64,
             help="The user's timezone, used to perform timezone conversions "
                  "between the server and the client."),
+        'view': fields.function(_get_interface_type, method=True, type='selection', fnct_inv=_set_interface_type,
+                                selection=[('simple','Simplified'),('extended','Extended')],
+                                string='Interface', help="Choose between the simplified interface and the extended one"),
+        'user_email': fields.function(_email_get, method=True, fnct_inv=_email_set, string='Email', type="char"),
     }
+
     def read(self,cr, uid, ids, fields=None, context=None, load='_classic_read'):
         def override_password(o):
             if 'password' in o and ( 'id' not in o or o['id'] != uid ):
@@ -209,8 +261,25 @@ class users(osv.osv):
                 result = override_password(result)
             else:
                 result = map(override_password, result)
+        
+        if isinstance(result, list):
+            for rec in result:
+                if not rec.get('action_id',True):
+                    rec['action_id'] = (self._get_menu(cr, uid),'Menu')
+        else:
+            if not result.get('action_id',True):
+                result['action_id'] = (self._get_menu(cr, uid),'Menu')
+        
         return result
 
+
+    def _check_company(self, cr, uid, ids, context=None):
+        return all(((this.company_id in this.company_ids) or not this.company_ids) for this in self.browse(cr, uid, ids, context))
+
+    _constraints = [
+        (_check_company, 'The chosen company is not in the allowed companies', ['company_id', 'company_ids']),
+    ]
+
     _sql_constraints = [
         ('login_key', 'UNIQUE (login)',  _('You can not have two users with the same login !'))
     ]
@@ -226,13 +295,19 @@ class users(osv.osv):
         ids = self.pool.get('ir.ui.menu').search(cr, uid, [('usage','=','menu')])
         return ids and ids[0] or False
 
-    def _get_company(self,cr, uid, context={}, uid2=False):
+    def _get_company(self,cr, uid, context=None, uid2=False):
         if not uid2:
             uid2 = uid
         user = self.pool.get('res.users').read(cr, uid, uid2, ['company_id'], context)
         company_id = user.get('company_id', False)
         return company_id and company_id[0] or False
 
+    def _get_companies(self, cr, uid, context=None):
+        c = self._get_company(cr, uid, context)
+        if c:
+            return [c]
+        return False
+
     def _get_menu(self,cr, uid, context={}):
         ids = self.pool.get('ir.actions.act_window').search(cr, uid, [('usage','=','menu')])
         return ids and ids[0] or False
@@ -248,6 +323,7 @@ class users(osv.osv):
         'menu_id': _get_menu,
         'action_id': _get_menu,
         'company_id': _get_company,
+        'company_ids': _get_companies,
         'groups_id': _get_group,
         'address_id': False,
     }
@@ -416,6 +492,13 @@ class groups2(osv.osv): ##FIXME: Is there a reason to inherit this object ?
     _columns = {
         'users': fields.many2many('res.users', 'res_groups_users_rel', 'gid', 'uid', 'Users'),
     }
+
+    def unlink(self, cr, uid, ids, context=None):
+        for record in self.read(cr, uid, ids, ['users'], context=context):
+            if record['users']:
+                raise osv.except_osv(_('Warning !'), _('Make sure you have no users linked with the group(s)!'))
+        return super(groups2, self).unlink(cr, uid, ids, context=context)
+
 groups2()
 
 class res_config_view(osv.osv_memory):
@@ -432,15 +515,10 @@ class res_config_view(osv.osv_memory):
     }
 
     def execute(self, cr, uid, ids, context=None):
-        res=self.read(cr,uid,ids)[0]
-        users_obj = self.pool.get('res.users')
-        group_obj=self.pool.get('res.groups')
-        if 'view' in res and res['view'] and res['view']=='extended':
-            group_ids=group_obj.search(cr,uid,[('name','ilike','Extended')])
-            if group_ids and len(group_ids):
-                users_obj.write(cr, uid, [uid],{
-                                'groups_id':[(4,group_ids[0])]
-                            }, context=context)
+        res = self.read(cr, uid, ids)[0]
+        self.pool.get('res.users').write(cr, uid, [uid],
+                                 {'view':res['view']}, context=context)
+
 res_config_view()
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index d822ed3..126755c 100644 (file)
     <rng:define name="separator">
         <rng:element name="separator">
             <rng:optional><rng:attribute name="colspan"/></rng:optional>
+            <rng:optional><rng:attribute name="rowspan"/></rng:optional>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="col"/></rng:optional>
             <rng:optional><rng:attribute name="select"/></rng:optional>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="fill"/></rng:optional>
             <rng:optional><rng:attribute name="height"/></rng:optional>
+            <rng:optional><rng:attribute name="width"/></rng:optional>
             <rng:optional><rng:attribute name="name"/></rng:optional>
             <rng:optional><rng:attribute name="color" /></rng:optional>
             <rng:zeroOrMore>
index ca1f33a..ba5ea19 100644 (file)
         <field name="name">Useability / No One</field>
     </record>
 
-<!--
- Users
--->
-    <record model="res.users" id="base.user_root">
-        <field name="signature">Administrator</field>
-        <field name="address_id" ref="main_address"/>
-        <field name="company_id" ref="main_company"/>
-        <field name="action_id" ref="action_menu_admin"/>
-        <field name="menu_id" ref="action_menu_admin"/>
-    </record>
-
-
     <!-- Set accesses to menu -->
     <record model="ir.ui.menu" id="base.menu_administration">
         <field name="groups_id" eval="[(6,0, [ref('group_system'), ref('group_erp_manager')])]"/>
     </record>
 
 
-    <record model="ir.rule.group" id="res_partner_address_rule_group">
+    <record model="ir.rule" id="res_partner_address_rule">
         <field name="name">res.partner.address company</field>
         <field name="model_id" ref="model_res_partner_address"/>
         <field name="global" eval="True"/>
-    </record>
-    <record model="ir.rule" id="res_partner_address_comp_rule">
-        <field name="field_id" search="[('model','=','res.partner.address'),('name','=','company_id')]" model="ir.model.fields"/>
-        <field name="rule_group" ref="res_partner_address_rule_group"/>
         <field name="domain_force">[('company_id','child_of',[user.company_id.id])]</field>
     </record>
 
-    <record model="ir.rule.group" id="res_partner_rule_group">
+    <record model="ir.rule" id="res_partner_rule">
         <field name="name">res.partner company</field>
         <field name="model_id" ref="model_res_partner"/>
         <field name="global" eval="True"/>
-    </record>
-    <record model="ir.rule" id="res_partner_comp_rule">
-        <field name="field_id" search="[('model','=','res.partner'),('name','=','company_id')]" model="ir.model.fields"/>
-        <field name="rule_group" ref="res_partner_rule_group"/>
         <field name="domain_force">[('company_id','child_of',[user.company_id.id])]</field>
     </record>
 
-
-    <record model="ir.rule.group" id="multi_company_default_rule_group">
+    <record model="ir.rule" id="multi_company_default_rule">
         <field name="name">Multi_company_default company</field>
         <field name="model_id" ref="model_multi_company_default"/>
         <field name="global" eval="True"/>
-    </record>
-    <record model="ir.rule" id="multi_company_default_comp_rule">
-        <field name="field_id" search="[('model','=','multi_company.default'),('name','=','company_id')]" model="ir.model.fields"/>
-        <field name="rule_group" ref="multi_company_default_rule_group"/>
         <field name="domain_force">[('company_id','child_of',[user.company_id.id])]</field>
     </record>
 
index bc291af..ba9a728 100644 (file)
 "access_ir_module_module_group_user","ir_module_module group_user","model_ir_module_module","group_system",1,1,1,1
 "access_ir_module_module_dependency_group_system","ir_module_module_dependency group_system","model_ir_module_module_dependency","group_system",1,1,1,1
 "access_ir_property_group_user","ir_property group_user","model_ir_property",,1,0,0,0
-"access_ir_property_group_user_manager","ir_property group_manager","model_ir_property","base.group_partner_manager",1,1,1,1
+"access_ir_property_group_user_manager","ir_property group_manager","model_ir_property","base.group_partner_manager",1,1,1,0
 "access_ir_report_custom_group_system","ir_report_custom group_system","model_ir_report_custom",,1,0,0,0
 "access_ir_report_custom_fields_group_system","ir_report_custom_fields group_system","model_ir_report_custom_fields",,1,0,0,0
 "access_ir_rule_group_user","ir_rule group_user","model_ir_rule",,1,0,0,0
-"access_ir_rule_group_group_user","ir_rule_group group_user","model_ir_rule_group",,1,0,0,0
 "access_ir_rule_group_erp_manager","ir_rule group_erp_manager","model_ir_rule","group_erp_manager",1,1,1,1
-"access_ir_rule_group_group_erp_manager","ir_rule_group group_erp_manager","model_ir_rule_group","group_erp_manager",1,1,1,1
 "access_ir_sequence_group_user","ir_sequence group_user","model_ir_sequence",,1,1,1,1
 "access_ir_sequence_type_group_user","ir_sequence_type group_user","model_ir_sequence_type",,1,0,0,0
 "access_ir_translation_group_system","ir_translation group_system","model_ir_translation",,1,1,1,1
 "access_res_partner_category_group_partner_manager","res_partner_category group_partner_manager","model_res_partner_category","group_partner_manager",1,1,1,1
 "access_res_partner_event_group_user","res_partner_event group_user","model_res_partner_event","group_user",1,1,1,1
 "access_res_partner_event_group_partner_manager","res_partner_event group_partner_manager","model_res_partner_event","group_partner_manager",1,1,1,1
-"access_res_partner_event_type_group_partner_manager","res_partner_event_type group_partner_manager","model_res_partner_event_type","group_partner_manager",1,1,1,1
-"access_res_partner_event_type_group_user","res_partner_event_type group_user","model_res_partner_event_type","group_user",1,0,0,0
-"access_res_partner_function_group_user","res_partner_function group_user","model_res_partner_function","group_partner_manager",1,1,1,1
-"access_res_partner_function_group_partner_manager","res_partner_function group_partner_manager","model_res_partner_function","group_user",1,0,0,0
 "access_res_partner_som_group_user","res_partner_som group_user","model_res_partner_som","group_partner_manager",1,1,1,1
 "access_res_partner_som_group_partner_manager","res_partner_som group_partner_manager","model_res_partner_som","group_user",1,0,0,0
 "access_res_partner_title_group_user","res_partner_title group_user","model_res_partner_title","group_partner_manager",1,1,1,1
diff --git a/bin/addons/base/test/bug_lp541545.xml b/bin/addons/base/test/bug_lp541545.xml
new file mode 100644 (file)
index 0000000..4c1df7a
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+   <!-- Test count attribute for assertions -->
+   <data>
+       <assert
+               model="res.currency.rate"
+               search="[('currency_id', '=', ref('INR'))]"
+               count="3"
+               string="Rate entries for Indian rupee">
+               <test expr="True"/>
+       </assert>
+   </data>
+    
+</openerp>
diff --git a/bin/addons/base/test/test_context.xml b/bin/addons/base/test/test_context.xml
new file mode 100644 (file)
index 0000000..f9a6f20
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+       <!-- Test context attribute for unit tests -->
+    <data context="{'date': '2001-06-01'}">
+        <assert 
+               model="res.currency"
+               id="INR"
+               string="Indian rupee rate in 2001">
+               <!-- date specified in data element's context -->
+            <test expr="str(rate)">0.631</test>
+        </assert>
+        <assert 
+               model="res.currency"
+               id="INR"
+               string="Indian rupee rate in 2002"
+               context="{'date': '2002-06-01'}">
+            <test expr="str(rate)">0.632</test>
+        </assert>
+    </data>
+</openerp>
diff --git a/bin/addons/gen_graph.sh b/bin/addons/gen_graph.sh
deleted file mode 100755 (executable)
index a56780d..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-##############################################################################
-#
-# Copyright (c) 2004-2009 TINY SPRL. (http://tiny.be)
-#
-# $Id$
-#
-# 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 contact a Free Software
-# Service Company
-#
-# 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 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.
-#
-##############################################################################
-
-./module_graph.py $@ | dot -Tpng -o > module_graph.png
-
diff --git a/bin/addons/module_graph.py b/bin/addons/module_graph.py
deleted file mode 100755 (executable)
index edd7f6f..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU Affero General Public License as
-#    published by the Free Software Foundation, either version 3 of the
-#    License, or (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU Affero General Public License for more details.
-#
-#    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-# TODO handle the case of zip modules
-
-import os
-import sys
-import glob
-
-if len(sys.argv) == 2 and (sys.argv[1] in ['-h', '--help']):
-    print >>sys.stderr, 'Usage: module_graph.py [module1 module2 module3]\n\tWhen no module is specified, all modules in current directory are used'
-    sys.exit(1)
-
-modules = sys.argv[1:]
-if not len(modules):
-    modules = map(os.path.dirname, glob.glob(os.path.join('*', '__openerp__.py')))
-    modules += map(os.path.dirname, glob.glob(os.path.join('*', '__terp__.py')))
-
-done = []
-
-print 'digraph G {'
-while len(modules):
-    f = modules.pop(0)
-    done.append(f)
-    info = addons.load_information_from_description_file(f)
-    if info.get('installable', True):
-        for name in info['depends']:
-            if name not in done+modules:
-                modules.append(name)
-            if not os.path.exists(name):
-                print '\t%s [color=red]' % (name,)
-            print '\t%s -> %s;' % (f, name)
-print '}'
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
index c852d42..3a698f4 100644 (file)
@@ -32,6 +32,7 @@
             <rng:attribute name="name" />
             <rng:optional><rng:attribute name="id" /></rng:optional>
             <rng:optional><rng:attribute name="eval" /></rng:optional>
+            <rng:optional><rng:attribute name="context" /></rng:optional>
             <rng:choice>
                 <rng:empty />
                 <rng:oneOrMore>
     <rng:define name="assert">
         <rng:element name="assert">
             <rng:attribute name="model" />
-            <rng:optional><rng:attribute name="search" /> </rng:optional>
+            <rng:optional><rng:attribute name="search" /></rng:optional>
+            <rng:optional><rng:attribute name="count" /></rng:optional>
             <rng:optional><rng:attribute name="string" /></rng:optional>
             <rng:optional><rng:attribute name="id" /></rng:optional>
+            <rng:optional><rng:attribute name="context" /></rng:optional>
             <rng:optional><rng:attribute name="severity" /></rng:optional>
-            <rng:oneOrMore>
+            <rng:zeroOrMore>
                 <rng:element name="test">
                     <rng:attribute name="expr"/>
                     <rng:choice>
@@ -59,7 +62,7 @@
                         <rng:empty />
                     </rng:choice>
                 </rng:element>
-            </rng:oneOrMore>
+            </rng:zeroOrMore>
         </rng:element>
     </rng:define>
 
@@ -69,6 +72,7 @@
             <rng:optional><rng:attribute name="ref" /></rng:optional>
             <rng:attribute name="action"/>
             <rng:optional><rng:attribute name="uid"/></rng:optional>
+            <rng:optional><rng:attribute name="context" /></rng:optional>
             <rng:choice>
                 <rng:empty/>
                 <rng:ref name="value"/>
     <rng:define name="data">
         <rng:element name="data">
             <rng:optional><rng:attribute name="noupdate" /></rng:optional>
+            <rng:optional><rng:attribute name="context" /></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
                     <rng:text/>
index 3472795..f0fe468 100644 (file)
 #
 ##############################################################################
 
+import errno
 import logging
 import logging.handlers
 import os
+import socket
 import sys
 import threading
 import time
@@ -358,6 +360,21 @@ class Server:
         res.extend(srv.stats() for srv in cls.__servers)
         return '\n'.join(res)
 
+    def _close_socket(self):
+        if os.name != 'nt':
+            try:
+                self.socket.shutdown(getattr(socket, 'SHUT_RDWR', 2))
+            except socket.error, e:
+                if e.errno != errno.ENOTCONN: raise
+                # OSX, socket shutdowns both sides if any side closes it
+                # causing an error 57 'Socket is not connected' on shutdown
+                # of the other side (or something), see
+                # http://bugs.python.org/issue4397
+                self.__logger.debug(
+                    '"%s" when shutting down server socket, '
+                    'this is normal under OS X', e)
+        self.socket.close()
+
 class OpenERPDispatcherException(Exception):
     def __init__(self, exception, traceback):
         self.exception = exception
@@ -365,7 +382,8 @@ class OpenERPDispatcherException(Exception):
 
 class OpenERPDispatcher:
     def log(self, title, msg):
-        Logger().notifyChannel('%s' % title, LOG_DEBUG_RPC, pformat(msg))
+        if tools.config['log_level'] == logging.DEBUG_RPC:
+            Logger().notifyChannel('%s' % title, LOG_DEBUG_RPC, pformat(msg))
 
     def dispatch(self, service_name, method, params):
         try:
index 4e6e1aa..4da2a70 100644 (file)
@@ -71,7 +71,8 @@ class expression(object):
         if not reduce(lambda acc, val: acc and (self._is_operator(val) or self._is_leaf(val)), exp, True):
             raise ValueError('Bad domain expression: %r' % (exp,))
         self.__exp = exp
-        self.__tables = {}  # used to store the table to use for the sql generation. key = index of the leaf
+        self.__field_tables = {}  # used to store the table to use for the sql generation. key = index of the leaf
+        self.__all_tables = set()
         self.__joins = []
         self.__main_table = None # 'root' table. set by parse()
         self.__DUMMY_LEAF = (1, '=', 1) # a dummy leaf that must not be parsed or sql generated
@@ -103,6 +104,7 @@ class expression(object):
                 return [(left, 'in', rg(ids, table, parent or table._parent_name))]
 
         self.__main_table = table
+        self.__all_tables.add(table)
 
         i = -1
         while i + 1<len(self.__exp):
@@ -114,19 +116,17 @@ class expression(object):
             working_table = table
             main_table = table
             fargs = left.split('.', 1)
-            index = i
             if fargs[0] in table._inherit_fields:
                 while True:
                     field = main_table._columns.get(fargs[0], False)
                     if field:
                         working_table = main_table
-                        self.__tables[i] = working_table
+                        self.__field_tables[i] = working_table
                         break
                     working_table = main_table.pool.get(main_table._inherit_fields[fargs[0]][0])
-                    if working_table not in self.__tables.values():
-                        self.__joins.append(('%s.%s=%s.%s' % (working_table._table, 'id', main_table._table, main_table._inherits[working_table._name]), working_table._table))
-                        self.__tables[index] = working_table
-                        index += 1
+                    if working_table not in self.__all_tables:
+                        self.__joins.append('%s.%s=%s.%s' % (working_table._table, 'id', main_table._table, main_table._inherits[working_table._name]))
+                        self.__all_tables.add(working_table)
                     main_table = working_table
             
             field = working_table._columns.get(fargs[0], False)
@@ -280,8 +280,11 @@ class expression(object):
                         c = context.copy()
                         c['active_test'] = False
                         res_ids = field_obj.name_search(cr, uid, right, [], operator, limit=None, context=c)
-                        right = map(lambda x: x[0], res_ids)
-                        self.__exp[i] = (left, 'in', right)
+                        if not res_ids:
+                            self.__exp[i] = ('id','=',0)
+                        else:
+                            right = map(lambda x: x[0], res_ids)
+                            self.__exp[i] = (left, 'in', right)
             else:
                 # other field type
                 # add the time part to datetime field when it's not there:
@@ -430,7 +433,7 @@ class expression(object):
         params = []
         for i, e in reverse_enumerate(self.__exp):
             if self._is_leaf(e, internal=True):
-                table = self.__tables.get(i, self.__main_table)
+                table = self.__field_tables.get(i, self.__main_table)
                 q, p = self.__leaf_to_sql(e, table)
                 params.insert(0, p)
                 stack.append(q)
@@ -444,13 +447,13 @@ class expression(object):
                     stack.append('(%s %s %s)' % (q1, ops[e], q2,))
 
         query = ' AND '.join(reversed(stack))
-        joins = ' AND '.join(map(lambda j: j[0], self.__joins))
+        joins = ' AND '.join(self.__joins)
         if joins:
             query = '(%s) AND (%s)' % (joins, query)
         return (query, flatten(params))
 
     def get_tables(self):
-        return ['"%s"' % t._table for t in set(self.__tables.values()+[self.__main_table])]
+        return ['"%s"' % t._table for t in self.__all_tables]
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
index 35ff166..dbddbb9 100644 (file)
@@ -39,7 +39,7 @@ from psycopg2 import Binary
 import warnings
 
 import tools
-
+from tools.translate import _
 
 def _symbol_set(symb):
     if symb == None or symb == False:
@@ -656,6 +656,11 @@ class function(_column):
             self._symbol_f = float._symbol_f
             self._symbol_set = float._symbol_set
 
+        if type == 'boolean':
+            self._symbol_c = boolean._symbol_c
+            self._symbol_f = boolean._symbol_f
+            self._symbol_set = boolean._symbol_set
+
     def digits_change(self, cr):
         if self.digits_compute:
             t = self.digits_compute(cr)
@@ -743,7 +748,7 @@ class related(function):
                 ids=[ids]
             objlst = obj.browse(cr, uid, ids)
             for data in objlst:
-                t_id=None
+                t_id = None
                 t_data = data
                 relation = obj._name
                 for i in range(len(self.arg)):
@@ -868,87 +873,84 @@ class serialized(_column):
 
 class property(function):
 
-    def _fnct_write(self, obj, cr, uid, id, prop, id_val, val, context=None):
-        if not context:
-            context = {}
-        (obj_dest,) = val
-        definition_id = self._field_get(cr, uid, obj._name, prop)
+    def _get_default(self, obj, cr, uid, prop_name, context=None):
+        prop = obj.pool.get('ir.property')
+        domain = prop._get_domain(cr, uid, prop_name, obj._name, context)
+        ids = prop.search(cr, uid, domain, order='company_id', context=context)
+        if not ids:
+            return False
+        return prop.get_by_id(cr, uid, ids, context=context) 
 
-        property = obj.pool.get('ir.property')
-        nid = property.search(cr, uid, [('fields_id', '=', definition_id),
-            ('res_id', '=', obj._name+','+str(id))])
-        while len(nid):
-            cr.execute('DELETE FROM ir_property WHERE id=%s', (nid.pop(),))
-
-        nid = property.search(cr, uid, [('fields_id', '=', definition_id),
-            ('res_id', '=', False)])
-        default_val = False
-        if nid:
-            default_val = property.browse(cr, uid, nid[0], context).value
-
-        company_id = obj.pool.get('res.company')._company_default_get(cr, uid, obj._name, prop, context=context)
-        res = False
-        if val[0]:
-            newval = (id_val and obj_dest+','+str(id_val)) or False
+    def _get_by_id(self, obj, cr, uid, prop_name, ids, context=None):
+        prop = obj.pool.get('ir.property')
+        vids = [obj._name + ',' + str(oid) for oid in  ids]
+
+        domain = prop._get_domain(cr, uid, prop_name, obj._name, context)
+        if domain is not None:
+            domain = [('res_id', 'in', vids)] + domain
+            return prop.search(cr, uid, domain, context=context)
         else:
-            newval = id_val or False
-        if (newval != default_val) and newval:
-            propdef = obj.pool.get('ir.model.fields').browse(cr, uid,
-                    definition_id, context=context)
-            res = property.create(cr, uid, {
+            return []
+
+
+    def _fnct_write(self, obj, cr, uid, id, prop_name, id_val, obj_dest, context=None):
+        if context is None:
+            context = {}
+
+        nids = self._get_by_id(obj, cr, uid, prop_name, [id], context)
+        if nids:
+            cr.execute('DELETE FROM ir_property WHERE id IN %s', (tuple(nids),))
+
+        default_val = self._get_default(obj, cr, uid, prop_name, context)
+
+        if id_val and id_val != default_val:
+            def_id = self._field_get(cr, uid, obj._name, prop_name)
+            company = obj.pool.get('res.company')
+            cid = company._company_default_get(cr, uid, obj._name, def_id,
+                                               context=context)
+            propdef = obj.pool.get('ir.model.fields').browse(cr, uid, def_id,
+                                                             context=context)
+            prop = obj.pool.get('ir.property')
+            return prop.create(cr, uid, {
                 'name': propdef.name,
-                'value': newval,
+                'value': id_val,
                 'res_id': obj._name+','+str(id),
-                'company_id': company_id,
-                'fields_id': definition_id
-            }, context=context)
-        return res
+                'company_id': cid,
+                'fields_id': def_id,
+                'type': self._type,
+                }, context=context)
+        return False
 
-    def _fnct_read(self, obj, cr, uid, ids, prop, val, context=None):
-        if not context:
+
+    def _fnct_read(self, obj, cr, uid, ids, prop_name, obj_dest, context=None):
+        from orm import browse_record
+        if context is None:
             context = {}
+
         property = obj.pool.get('ir.property')
-        definition_id = self._field_get(cr, uid, obj._name, prop)
 
-        nid = property.search(cr, uid, [('fields_id', '=', definition_id),
-            ('res_id', '=', False)])
-        default_val = False
-        if nid:
-            d = property.browse(cr, uid, nid[0], context).value
-            default_val = (d and int(d.split(',')[1])) or False
+        default_val = self._get_default(obj, cr, uid, prop_name, context)
+        if isinstance(default_val, browse_record):
+            default_val = default_val.id
+        else:
+            default_val = False
 
-        vids = [obj._name + ',' + str(id) for id in  ids]
-        nids = property.search(cr, uid, [('fields_id', '=', definition_id),
-            ('res_id', 'in', vids)])
+        nids = self._get_by_id(obj, cr, uid, prop_name, ids, context)
 
         res = {}
         for id in ids:
             res[id] = default_val
         for prop in property.browse(cr, uid, nids):
-            if prop.value.find(',') >= 0:
-                res[int(prop.res_id.id)] = (prop.value and \
-                        int(prop.value.split(',')[1])) or False
-            else:
-                res[int(prop.res_id.id)] = prop.value or ''
-
-        if self._obj:
-            obj = obj.pool.get(self._obj)
-            to_check = res.values()
-            if default_val and default_val not in to_check:
-                to_check += [default_val]
-            existing_ids = obj.search(cr, uid, [('id', 'in', to_check)])
-            for id, res_id in res.items():
-                if res_id not in existing_ids:
-                    cr.execute('DELETE FROM ir_property WHERE value=%s', ((obj._name+','+str(res_id)),))
-                    res[id] = default_val
-            names = dict(obj.name_get(cr, uid, existing_ids, context))
-            for r in res.keys():
-                if res[r] and res[r] in names:
-                    res[r] = (res[r], names[res[r]])
-                else:
-                    res[r] = False
+            value = prop.get_by_id(context=context)
+            if isinstance(value, browse_record):
+                if not value.exists():
+                    cr.execute('DELETE FROM ir_property WHERE id=%s', (prop.id,))
+                    continue
+                value = value.id
+            res[prop.res_id.id] = value or False
         return res
 
+
     def _field_get(self, cr, uid, model_name, prop):
         if not self.field_id.get(cr.dbname):
             cr.execute('SELECT id \
@@ -959,9 +961,10 @@ class property(function):
         return self.field_id[cr.dbname]
 
     def __init__(self, obj_prop, **args):
+        # TODO remove obj_prop parameter (use many2one type)
         self.field_id = {}
         function.__init__(self, self._fnct_read, False, self._fnct_write,
-                (obj_prop, ), **args)
+                          obj_prop, **args)
 
     def restart(self):
         self.field_id = {}
index 062c0bc..d6e0e6b 100644 (file)
 #         - functions
 #
 #
-
 import calendar
 import copy
 import datetime
 import logging
+import operator
 import pickle
-import random
 import re
 import string
-import sys
 import time
 import traceback
 import types
 
-import fields
 import netsvc
-import tools
+from lxml import etree
+from tools.config import config
 from tools.translate import _
 
-import copy
-import sys
-
-try:
-    from lxml import etree
-except ImportError:
-    sys.stderr.write("ERROR: Import lxml module\n")
-    sys.stderr.write("ERROR: Try to install the python-lxml package\n")
+import fields
+import tools
 
-from tools.config import config
 
 regex_order = re.compile('^(([a-z0-9_]+|"[a-z0-9_]+")( *desc| *asc)?( *, *|))+$', re.I)
 
@@ -86,7 +77,6 @@ def last_day_of_current_month():
 def intersect(la, lb):
     return filter(lambda x: x in lb, la)
 
-
 class except_orm(Exception):
     def __init__(self, name, value):
         self.name = name
@@ -170,6 +160,7 @@ class browse_record(object):
     def __getitem__(self, name):
         if name == 'id':
             return self._id
+
         if name not in self._data[self._id]:
             # build the list of fields we will fetch
 
@@ -179,10 +170,12 @@ class browse_record(object):
             elif name in self._table._inherit_fields:
                 col = self._table._inherit_fields[name][2]
             elif hasattr(self._table, str(name)):
-                if isinstance(getattr(self._table, name), (types.MethodType, types.LambdaType, types.FunctionType)):
-                    return lambda *args, **argv: getattr(self._table, name)(self._cr, self._uid, [self._id], *args, **argv)
+                attr = getattr(self._table, name)
+
+                if isinstance(attr, (types.MethodType, types.LambdaType, types.FunctionType)):
+                    return lambda *args, **argv: attr(self._cr, self._uid, [self._id], *args, **argv)
                 else:
-                    return getattr(self._table, name)
+                    return attr
             else:
                 self.logger.notifyChannel("browse_record", netsvc.LOG_WARNING,
                     "Field '%s' does not exist in object '%s': \n%s" % (
@@ -250,6 +243,8 @@ class browse_record(object):
                                         context=self._context,
                                         list_class=self._list_class,
                                         fields_process=self._fields_process)
+                                else:
+                                    new_data[n] = ids2
                             else:
                                 new_data[n] = browse_null()
                         else:
@@ -271,6 +266,7 @@ class browse_record(object):
                     else:
                         new_data[n] = data[n]
                 self._data[data['id']].update(new_data)
+
         if not name in self._data[self._id]:
             #how did this happen?
             self.logger.notifyChannel("browse_record", netsvc.LOG_ERROR,
@@ -299,9 +295,13 @@ class browse_record(object):
         return "browse_record(%s, %d)" % (self._table_name, self._id)
 
     def __eq__(self, other):
+        if not isinstance(other, browse_record):
+            return False
         return (self._table_name, self._id) == (other._table_name, other._id)
 
     def __ne__(self, other):
+        if not isinstance(other, browse_record):
+            return True
         return (self._table_name, self._id) != (other._table_name, other._id)
 
     # we need to define __unicode__ even though we've already defined __str__
@@ -388,15 +388,24 @@ class orm_template(object):
     _inherits = {}
     _table = None
     _invalids = set()
+    _log_create = False
 
     CONCURRENCY_CHECK_FIELD = '__last_update'
+    def log(self, cr, uid, id, message, secondary=False, context=None):
+        return self.pool.get('res.log').create(cr, uid, {
+            'name': message,
+            'res_model': self._name,
+            'secondary': secondary,
+            'res_id': id},
+                context=context
+        )
 
     def view_init(self, cr , uid , fields_list, context=None):
         """Override this method to do specific things when a view on the object is opened."""
         pass
 
     def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None):
-        raise _('The read_group method is not implemented on this object !')
+        raise NotImplementedError(_('The read_group method is not implemented on this object !'))
 
     def _field_create(self, cr, context={}):
         cr.execute("SELECT id FROM ir_model WHERE model=%s", (self._name,))
@@ -428,7 +437,7 @@ class orm_template(object):
                 'name': k,
                 'field_description': f.string.replace("'", " "),
                 'ttype': f._type,
-                'relation': f._obj or 'NULL',
+                'relation': f._obj or '',
                 'view_load': (f.view_load and 1) or 0,
                 'select_level': tools.ustr(f.select or 0),
                 'readonly':(f.readonly and 1) or 0,
@@ -525,6 +534,8 @@ class orm_template(object):
             return browse_null()
 
     def __export_row(self, cr, uid, row, fields, context=None):
+        if context is None:
+            context = {}
 
         def check_type(field_type):
             if field_type == 'float':
@@ -578,9 +589,9 @@ class orm_template(object):
                                 cols = selection_field(self._inherits)
                             if cols and cols._type == 'selection':
                                 sel_list = cols.selection
-                                if type(sel_list) == type([]):
-                                    r = [x[1] for x in sel_list if r==x[0]][0]
-
+                                if r and type(sel_list) == type([]):
+                                    r = [x[1] for x in sel_list if r==x[0]]
+                                    r = r and r[0] or False
                     if not r:
                         if f[i] in self._columns:
                             r = check_type(self._columns[f[i]]._type)
@@ -607,7 +618,7 @@ class orm_template(object):
                                     for rr in r :
                                         if isinstance(rr.name, browse_record):
                                             rr = rr.name
-                                        rr_name = self.pool.get(rr._table_name).name_get(cr, uid, [rr.id])
+                                        rr_name = self.pool.get(rr._table_name).name_get(cr, uid, [rr.id], context=context)
                                         rr_name = rr_name and rr_name[0] and rr_name[0][1] or ''
                                         dt += tools.ustr(rr_name or '') + ','
                                     data[fpos] = dt[:-1]
@@ -620,7 +631,7 @@ class orm_template(object):
                     i += 1
                 if i == len(f):
                     if isinstance(r, browse_record):
-                        r = self.pool.get(r._table_name).name_get(cr, uid, [r.id])
+                        r = self.pool.get(r._table_name).name_get(cr, uid, [r.id], context=context)
                         r = r and r[0] and r[0][1] or ''
                     data[fpos] = tools.ustr(r or '')
         return [data] + lines
@@ -776,12 +787,12 @@ class orm_template(object):
                                 module, xml_id = line[i].rsplit('.', 1)
                             else:
                                 module, xml_id = current_module, line[i]
-                            id = ir_model_data_obj._get_id(cr, uid, module, xml_id)
-
-                            res_res_id = ir_model_data_obj.read(cr, uid, [id],
-                                                ['res_id'])
-                            if res_res_id:
-                                res_id = res_res_id[0]['res_id']
+                            record_id = ir_model_data_obj._get_id(cr, uid, module, xml_id)
+                            ir_model_data = ir_model_data_obj.read(cr, uid, [record_id], ['res_id'])
+                            if ir_model_data:
+                                res_id = ir_model_data[0]['res_id']
+                            else:
+                                raise ValueError('No references to %s.%s' % (module, xml_id))
                     row[field[-1][:-3]] = res_id or False
                     continue
                 if (len(field) == len(prefix)+1) and \
@@ -975,7 +986,8 @@ class orm_template(object):
                     msg = _('Insertion Failed! ' + e[1])
                     return (-1, res, 'Line ' + str(counter) +' : ' + msg, '' )
                 #Raising Uncaught exception
-                raise
+                return (-1, res, 'Line ' + str(counter) +' : ' + str(e), '' )
+            
             for lang in translate:
                 context2 = context.copy()
                 context2['lang'] = lang
@@ -984,6 +996,8 @@ class orm_template(object):
                 data = pickle.load(file(config.get('import_partial')))
                 data[filename] = initial_size - len(datas) + original_value
                 pickle.dump(data, file(config.get('import_partial'),'wb'))
+                if context.get('defer_parent_store_computation'):
+                    self._parent_store_compute(cr)
                 cr.commit()
 
             #except Exception, e:
@@ -997,10 +1011,12 @@ class orm_template(object):
         #
         # TODO: Send a request with the result and multi-thread !
         #
+        if context.get('defer_parent_store_computation'):
+            self._parent_store_compute(cr)
         return (done, 0, 0, 0)
 
     def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
-        raise _('The read method is not implemented on this object !')
+        raise NotImplementedError(_('The read method is not implemented on this object !'))
 
     def get_invalid_fields(self,cr,uid):
         return list(self._invalids)
@@ -1013,7 +1029,14 @@ class orm_template(object):
         for constraint in self._constraints:
             fun, msg, fields = constraint
             if not fun(self, cr, uid, ids):
-                translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=msg) or msg
+                # Check presence of __call__ directly instead of using
+                # callable() because it will be deprecated as of Python 3.0
+                if hasattr(msg, '__call__'):
+                    txt_msg, params = msg(self, cr, uid, ids)
+                    tmp_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=txt_msg) or txt_msg
+                    translated_msg = tmp_msg % params
+                else:
+                    translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=msg) or msg
                 error_msgs.append(
                         _("Error occurred while validating the field(s) %s: %s") % (','.join(fields), translated_msg)
                 )
@@ -1036,16 +1059,16 @@ class orm_template(object):
         return {}
 
     def perm_read(self, cr, user, ids, context=None, details=True):
-        raise _('The perm_read method is not implemented on this object !')
+        raise NotImplementedError(_('The perm_read method is not implemented on this object !'))
 
     def unlink(self, cr, uid, ids, context=None):
-        raise _('The unlink method is not implemented on this object !')
+        raise NotImplementedError(_('The unlink method is not implemented on this object !'))
 
     def write(self, cr, user, ids, vals, context=None):
-        raise _('The write method is not implemented on this object !')
+        raise NotImplementedError(_('The write method is not implemented on this object !'))
 
     def create(self, cr, user, vals, context=None):
-        raise _('The create method is not implemented on this object !')
+        raise NotImplementedError(_('The create method is not implemented on this object !'))
 
     # returns the definition of each field in the object
     # the optional fields parameter can limit the result to some fields
@@ -1082,8 +1105,7 @@ class orm_template(object):
                     if getattr(self._columns[f], arg, None):
                         res[f][arg] = getattr(self._columns[f], arg)
 
-                #TODO: optimize
-                res_trans = translation_obj._get_source(cr, user, self._name + ',' + f, 'field', context.get('lang', False) or 'en_US')
+                res_trans = translation_obj._get_source(cr, user, self._name + ',' + f, 'field', context.get('lang', False) or 'en_US', self._columns[f].string)
                 if res_trans:
                     res[f]['string'] = res_trans
                 help_trans = translation_obj._get_source(cr, user, self._name + ',' + f, 'help', context.get('lang', False) or 'en_US')
@@ -1139,6 +1161,21 @@ class orm_template(object):
                 return s.encode('utf8')
             return s
 
+        # return True if node can be displayed to current user
+        def check_group(node):
+            if node.get('groups'):
+                groups = node.get('groups').split(',')
+                access_pool = self.pool.get('ir.model.access')
+                can_see = any(access_pool.check_groups(cr, user, group) for group in groups)
+                if not can_see:
+                    node.set('invisible', '1')
+                    if 'attrs' in node.attrib:
+                        del(node.attrib['attrs']) #avoid making field visible later
+                del(node.attrib['groups'])
+                return can_see
+            else:
+                return True
+
         if node.tag in ('field', 'node', 'arrow'):
             if node.get('object'):
                 attrs = {}
@@ -1170,7 +1207,8 @@ class orm_template(object):
                     column = False
 
                 if column:
-                    relation = column._obj
+                    relation = self.pool.get(column._obj)
+
                     childs = False
                     views = {}
                     for f in node:
@@ -1178,22 +1216,31 @@ class orm_template(object):
                             node.remove(f)
                             ctx = context.copy()
                             ctx['base_model_name'] = self._name
-                            xarch, xfields = self.pool.get(relation).__view_look_dom_arch(cr, user, f, view_id, ctx)
+                            xarch, xfields = relation.__view_look_dom_arch(cr, user, f, view_id, ctx)
                             views[str(f.tag)] = {
                                 'arch': xarch,
                                 'fields': xfields
                             }
                     attrs = {'views': views}
                     if node.get('widget') and node.get('widget') == 'selection':
+                        if not check_group(node):
+                            # the field is just invisible. default value must be in the selection
+                            name = node.get('name')
+                            default = self.default_get(cr, user, [name], context=context).get(name)
+                            if default:
+                                attrs['selection'] = relation.name_get(cr, 1, default, context=context)
+                            else:
+                                attrs['selection'] = []
                         # We can not use the 'string' domain has it is defined according to the record !
-                        dom = []
-                        if column._domain and not isinstance(column._domain, (str, unicode)):
-                            dom = column._domain
-                        dom += eval(node.get('domain','[]'), {'uid':user, 'time':time})
-                        context.update(eval(node.get('context','{}')))
-                        attrs['selection'] = self.pool.get(relation).name_search(cr, user, '', dom, context=context,limit=None)
-                        if (node.get('required') and not int(node.get('required'))) or not column.required:
-                            attrs['selection'].append((False,''))
+                        else:
+                            dom = []
+                            if column._domain and not isinstance(column._domain, (str, unicode)):
+                                dom = column._domain
+                            dom += eval(node.get('domain','[]'), {'uid':user, 'time':time})
+                            context.update(eval(node.get('context','{}')))
+                            attrs['selection'] = relation._name_search(cr, user, '', dom, context=context, limit=None, name_get_uid=1)
+                            if (node.get('required') and not int(node.get('required'))) or not column.required:
+                                attrs['selection'].append((False,''))
                 fields[node.get('name')] = attrs
 
         elif node.tag in ('form', 'tree'):
@@ -1207,15 +1254,7 @@ class orm_template(object):
                     fields[node.get(additional_field)] = {}
 
         if 'groups' in node.attrib:
-            if node.get('groups'):
-                groups = node.get('groups').split(',')
-                readonly = False
-                access_pool = self.pool.get('ir.model.access')
-                for group in groups:
-                    readonly = readonly or access_pool.check_groups(cr, user, group)
-                if not readonly:
-                    node.set('invisible', '1')
-            del(node.attrib['groups'])
+            check_group(node)
 
         # translate view
         if ('lang' in context) and not result:
@@ -1635,19 +1674,19 @@ class orm_template(object):
 
     def search(self, cr, user, args, offset=0, limit=None, order=None,
             context=None, count=False):
-        raise _('The search method is not implemented on this object !')
+        raise NotImplementedError(_('The search method is not implemented on this object !'))
 
     def name_get(self, cr, user, ids, context=None):
-        raise _('The name_get method is not implemented on this object !')
+        raise NotImplementedError(_('The name_get method is not implemented on this object !'))
 
     def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
-        raise _('The name_search method is not implemented on this object !')
+        raise NotImplementedError(_('The name_search method is not implemented on this object !'))
 
     def copy(self, cr, uid, id, default=None, context=None):
-        raise _('The copy method is not implemented on this object !')
+        raise NotImplementedError(_('The copy method is not implemented on this object !'))
 
     def exists(self, cr, uid, id, context=None):
-        raise _('The exists method is not implemented on this object !')
+        raise NotImplementedError(_('The exists method is not implemented on this object !'))
 
     def read_string(self, cr, uid, id, langs, fields=None, context=None):
         res = {}
@@ -1681,7 +1720,8 @@ class orm_template(object):
         for lang in langs:
             for field in vals:
                 if field in self._columns:
-                    self.pool.get('ir.translation')._set_ids(cr, uid, self._name+','+field, 'field', lang, [0], vals[field])
+                    src = self._columns[field].string
+                    self.pool.get('ir.translation')._set_ids(cr, uid, self._name+','+field, 'field', lang, [0], vals[field], src)
         for table in self._inherits:
             cols = intersect(self._inherit_fields.keys(), vals)
             if cols:
@@ -1725,6 +1765,7 @@ class orm_memory(orm_template):
     def read(self, cr, user, ids, fields_to_read=None, context=None, load='_classic_read'):
         if not context:
             context = {}
+        self.pool.get('ir.model.access').check(cr, user, self._name, 'read', context=context)
         if not fields_to_read:
             fields_to_read = self._columns.keys()
         result = []
@@ -1754,6 +1795,7 @@ class orm_memory(orm_template):
     def write(self, cr, user, ids, vals, context=None):
         if not ids:
             return True
+        self.pool.get('ir.model.access').check(cr, user, self._name, 'write', context=context)
         vals2 = {}
         upd_todo = []
         for field in vals:
@@ -1772,6 +1814,7 @@ class orm_memory(orm_template):
         return id_new
 
     def create(self, cr, user, vals, context=None):
+        self.pool.get('ir.model.access').check(cr, user, self._name, 'create', context=context)
         self.vaccum(cr, user)
         self.next_id += 1
         id_new = self.next_id
@@ -1794,6 +1837,12 @@ class orm_memory(orm_template):
         for field in upd_todo:
             self._columns[field].set_memory(cr, self, id_new, field, vals[field], user, context)
         self._validate(cr, user, [id_new], context)
+        if self._log_create and not (context and context.get('no_store_function', False)):
+            message = self._description + \
+                " '" + \
+                self.name_get(cr, user, [id_new], context=context)[0][1] + \
+                "' "+ _("created.")
+            self.log(cr, user, id_new, message, True, context=context)
         wf_service = netsvc.LocalService("workflow")
         wf_service.trg_create(user, self._name, id_new, cr)
         return id_new
@@ -1881,7 +1930,6 @@ class orm_memory(orm_template):
             res=e.__dict__['_expression__exp']
         return res or []
 
-
     def search(self, cr, user, args, offset=0, limit=None, order=None,
             context=None, count=False):
         if not context:
@@ -1923,6 +1971,7 @@ class orm_memory(orm_template):
         return res or []
 
     def unlink(self, cr, uid, ids, context=None):
+        self.pool.get('ir.model.access').check(cr, uid, self._name, 'unlink', context=context)
         for id in ids:
             if id in self.datas:
                 del self.datas[id]
@@ -2085,6 +2134,8 @@ class orm(orm_template):
         return (tables, where_clause)
 
     def _parent_store_compute(self, cr):
+        if not self._parent_store:
+            return
         logger = netsvc.Logger()
         logger.notifyChannel('orm', netsvc.LOG_INFO, 'Computing parent left and right for table %s...' % (self._table, ))
         def browse_rec(root, pos=0):
@@ -2173,8 +2224,8 @@ class orm(orm_template):
                         logger.notifyChannel('orm', netsvc.LOG_ERROR, 'create a column parent_left on object %s: fields.integer(\'Left Parent\', select=1)' % (self._table, ))
                     if 'parent_right' not in self._columns:
                         logger.notifyChannel('orm', netsvc.LOG_ERROR, 'create a column parent_right on object %s: fields.integer(\'Right Parent\', select=1)' % (self._table, ))
-                    if self._columns[self._parent_name].ondelete<>'cascade':
-                        logger.notifyChannel('orm', netsvc.LOG_ERROR, "the columns %s on object must be set as ondelete='cascasde'" % (self._name, self._parent_name))
+                    if self._columns[self._parent_name].ondelete != 'cascade':
+                        logger.notifyChannel('orm', netsvc.LOG_ERROR, "The column %s on object %s must be set as ondelete='cascade'" % (self._parent_name, self._name))
                     cr.execute('ALTER TABLE "%s" ADD COLUMN "parent_left" INTEGER' % (self._table,))
                     cr.execute('ALTER TABLE "%s" ADD COLUMN "parent_right" INTEGER' % (self._table,))
                     cr.commit()
@@ -2420,6 +2471,8 @@ class orm(orm_template):
             cr.execute("SELECT relname FROM pg_class WHERE relkind in ('r','v') AND relname=%s", (self._table,))
             create = not bool(cr.fetchone())
 
+        cr.commit()     # start a new transaction
+
         for (key, con, _) in self._sql_constraints:
             conname = '%s_%s' % (self._table, key)
             cr.execute("SELECT conname FROM pg_constraint where conname=%s", (conname,))
@@ -2429,6 +2482,7 @@ class orm(orm_template):
                     cr.commit()
                 except:
                     logger.notifyChannel('orm', netsvc.LOG_WARNING, 'unable to add \'%s\' constraint on table %s !\n If you want to have it, you should update the records and execute manually:\nALTER table %s ADD CONSTRAINT %s_%s %s' % (con, self._table, self._table, self._table, key, con,))
+                    cr.rollback()
 
         if create:
             if hasattr(self, "_sql"):
@@ -2439,6 +2493,7 @@ class orm(orm_template):
                         cr.commit()
         if store_compute:
             self._parent_store_compute(cr)
+            cr.commit()
         return todo_end
 
     def __init__(self, cr):
@@ -2559,14 +2614,14 @@ class orm(orm_template):
                     or False
             if isinstance(fld_def, fields.property):
                 property_obj = self.pool.get('ir.property')
-                definition_id = fld_def._field_get(cr, uid, self._name, f)
-                nid = property_obj.search(cr, uid, [('fields_id', '=',
-                    definition_id), ('res_id', '=', False)])
-                if nid:
-                    prop_value = property_obj.browse(cr, uid, nid[0],
-                            context=context).value
-                    value[f] = (prop_value and int(prop_value.split(',')[1])) \
-                            or False
+                prop_value = property_obj.get(cr, uid, f, self._name, context=context)
+                if prop_value:
+                    if isinstance(prop_value, (browse_record, browse_null)):
+                        value[f] = prop_value.id
+                    else:
+                        value[f] = prop_value
+                else:
+                    value[f] = False
 
         # get the default values set by the user and override the default
         # values defined in the object
@@ -2594,11 +2649,16 @@ class orm(orm_template):
                     for i in range(len(field_value)):
                         field_value2.append({})
                         for field2 in field_value[i]:
-                            if obj._columns[field2]._type in ('many2one', 'one2one'):
+                            if field2 in obj._columns.keys() and obj._columns[field2]._type in ('many2one', 'one2one'):
                                 obj2 = self.pool.get(obj._columns[field2]._obj)
                                 if not obj2.search(cr, uid,
                                         [('id', '=', field_value[i][field2])]):
                                     continue
+                            elif field2 in obj._inherit_fields.keys() and obj._inherit_fields[field2][2]._type in ('many2one', 'one2one'):
+                                obj2 = self.pool.get(obj._inherit_fields[field2][2]._obj)
+                                if not obj2.search(cr, uid,
+                                        [('id', '=', field_value[i][field2])]):
+                                    continue
                             # TODO add test for many2many and one2many
                             field_value2[i][field2] = field_value[i][field2]
                     field_value = field_value2
@@ -2958,7 +3018,7 @@ class orm(orm_template):
 
         properties = self.pool.get('ir.property')
         domain = [('res_id', '=', False),
-                  ('value', 'in', ['%s,%s' % (self._name, i) for i in ids]),
+                  ('value_reference', 'in', ['%s,%s' % (self._name, i) for i in ids]),
                  ]
         if properties.search(cr, uid, domain, context=context):
             raise except_orm(_('Error'), _('Unable to delete this document because it is used as a default property'))
@@ -3055,6 +3115,24 @@ class orm(orm_template):
 
         self.pool.get('ir.model.access').check(cr, user, self._name, 'write', context=context)
 
+        # No direct update of parent_left/right
+        vals.pop('parent_left', None)
+        vals.pop('parent_right', None)
+
+        parents_changed = []
+        if self._parent_store and (self._parent_name in vals):
+            # The parent_left/right computation may take up to
+            # 5 seconds. No need to recompute the values if the
+            # parent is the same. Get the current value of the parent
+            base_query = 'SELECT id FROM %s WHERE id IN %%s AND %s' % \
+                            (self._table, self._parent_name)
+            params = (tuple(ids),)
+            parent_val = vals[self._parent_name]
+            if parent_val:
+                cr.execute(base_query + " != %s", params + (parent_val,))
+            else:
+                cr.execute(base_query + " IS NULL", params)
+            parents_changed = map(operator.itemgetter(0), cr.fetchall())
 
         upd0 = []
         upd1 = []
@@ -3144,41 +3222,48 @@ class orm(orm_template):
             self.pool.get(table).write(cr, user, nids, v, context)
 
         self._validate(cr, user, ids, context)
-# TODO: use _order to set dest at the right position and not first node of parent
-        if self._parent_store and (self._parent_name in vals):
+
+        # TODO: use _order to set dest at the right position and not first node of parent
+        # We can't defer parent_store computation because the stored function
+        # fields that are computer may refer (directly or indirectly) to
+        # parent_left/right (via a child_of domain)
+        if parents_changed:
             if self.pool._init:
                 self.pool._init_parent[self._name]=True
             else:
-                for id in ids:
+                order = self._parent_order or self._order
+                parent_val = vals[self._parent_name]
+                if parent_val:
+                    clause, params = '%s=%%s' % (self._parent_name,), (parent_val,)
+                else:
+                    clause, params = '%s IS NULL' % (self._parent_name,), ()
+                cr.execute('SELECT parent_right, id FROM %s WHERE %s ORDER BY %s' % (self._table, clause, order), params)
+                parents = cr.fetchall()
+
+                for id in parents_changed:
+                    cr.execute('SELECT parent_left, parent_right FROM %s WHERE id=%%s' % (self._table,), (id,))
+                    pleft, pright = cr.fetchone()
+                    distance = pright - pleft + 1
+
                     # Find Position of the element
-                    if vals[self._parent_name]:
-                        cr.execute('select parent_left,parent_right,id from '+self._table+' where '+self._parent_name+'=%s order by '+(self._parent_order or self._order), (vals[self._parent_name],))
-                    else:
-                        cr.execute('select parent_left,parent_right,id from '+self._table+' where '+self._parent_name+' is null order by '+(self._parent_order or self._order))
-                    result_p = cr.fetchall()
                     position = None
-                    for (pleft,pright,pid) in result_p:
-                        if pid == id:
+                    for (parent_pright, parent_id) in parents:
+                        if parent_id == id:
                             break
-                        position = pright+1
+                        position = parent_pright+1
 
-                    # It's the first node of the parent: position = parent_left+1
+                    # It's the first node of the parent
                     if not position:
-                        if not vals[self._parent_name]:
+                        if not parent_val:
                             position = 1
                         else:
-                            cr.execute('select parent_left from '+self._table+' where id=%s', (vals[self._parent_name],))
+                            cr.execute('select parent_left from '+self._table+' where id=%s', (parent_val,))
                             position = cr.fetchone()[0]+1
 
-                    # We have the new position !
-                    cr.execute('select parent_left,parent_right from '+self._table+' where id=%s', (id,))
-                    pleft,pright = cr.fetchone()
-                    distance = pright - pleft + 1
-
-                    if position>pleft and position<=pright:
+                    if pleft < position <= pright:
                         raise except_orm(_('UserError'), _('Recursivity Detected.'))
 
-                    if pleft<position:
+                    if pleft < position:
                         cr.execute('update '+self._table+' set parent_left=parent_left+%s where parent_left>=%s', (distance, position))
                         cr.execute('update '+self._table+' set parent_right=parent_right+%s where parent_right>=%s', (distance, position))
                         cr.execute('update '+self._table+' set parent_left=parent_left+%s, parent_right=parent_right+%s where parent_left>=%s and parent_left<%s', (position-pleft,position-pleft, pleft, pright))
@@ -3225,7 +3310,7 @@ class orm(orm_template):
         """
         if not context:
             context = {}
-        self.pool.get('ir.model.access').check(cr, user, self._name, 'create')
+        self.pool.get('ir.model.access').check(cr, user, self._name, 'create', context=context)
 
         default = []
 
@@ -3282,7 +3367,7 @@ class orm(orm_template):
 
             record_id = tocreate[table].pop('id', None)
 
-            if record_id is None:
+            if record_id is None or not record_id:
                 record_id = self.pool.get(table).create(cr, user, tocreate[table], context=context)
             else:
                 self.pool.get(table).write(cr, user, [record_id], tocreate[table], context=context)
@@ -3359,7 +3444,7 @@ class orm(orm_template):
         self.check_access_rule(cr, user, [id_new], 'create', context=context)
         upd_todo.sort(lambda x, y: self._columns[x].priority-self._columns[y].priority)
 
-        if self._parent_store:
+        if self._parent_store and not context.get('defer_parent_store_computation'):
             if self.pool._init:
                 self.pool._init_parent[self._name]=True
             else:
@@ -3403,6 +3488,12 @@ class orm(orm_template):
                     self.pool.get(object)._store_set_values(cr, user, ids, fields2, context)
                     done.append((object, ids, fields2))
 
+        if self._log_create and not (context and context.get('no_store_function', False)):
+            message = self._description + \
+                " '" + \
+                self.name_get(cr, user, [id_new], context=context)[0][1] + \
+                "' "+ _("created.")
+            self.log(cr, user, id_new, message, True, context=context)
         wf_service = netsvc.LocalService("workflow")
         wf_service.trg_create(user, self._name, id_new, cr)
         return id_new
@@ -3521,7 +3612,7 @@ class orm(orm_template):
     # TODO: Validate
     #
     def perm_write(self, cr, user, ids, fields, context=None):
-        raise _('This method does not exist anymore')
+        raise NotImplementedError(_('This method does not exist anymore'))
 
     # TODO: ameliorer avec NULL
     def _where_calc(self, cr, user, args, active_test=True, context=None):
@@ -3581,8 +3672,9 @@ class orm(orm_template):
             * '&' (default), '|', '!'
 
         """
-        if not context:
+        if context is None:
             context = {}
+        self.pool.get('ir.model.access').check(cr, user, self._name, 'read', context=context)
         # compute the where, order by, limit and offset clauses
         (qu1, qu2, tables) = self._where_calc(cr, user, args, context=context)
         dom = self.pool.get('ir.rule').domain_get(cr, user, self._name, 'read', context=context)
@@ -3649,6 +3741,20 @@ class orm(orm_template):
         return [(r['id'], tools.ustr(r[self._rec_name])) for r in self.read(cr, user, ids,
             [self._rec_name], context, load='_classic_write')]
 
+    # private implementation of name_search, allows passing a dedicated user for the name_get part to
+    # solve some access rights issues
+    def _name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100, name_get_uid=None):
+        if not args:
+            args = []
+        if not context:
+            context = {}
+        args = args[:]
+        if name:
+            args += [(self._rec_name, operator, name)]
+        ids = self.search(cr, user, args, limit=limit, context=context)
+        res = self.name_get(cr, name_get_uid or user, ids, context)
+        return res
+
     def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
         """
 
@@ -3664,16 +3770,7 @@ class orm(orm_template):
         This method is equivalent of search() on name + name_get()
 
         """
-        if not args:
-            args = []
-        if not context:
-            context = {}
-        args = args[:]
-        if name:
-            args += [(self._rec_name, operator, name)]
-        ids = self.search(cr, user, args, limit=limit, context=context)
-        res = self.name_get(cr, user, ids, context)
-        return res
+        return self._name_search(cr, user, name, args, operator, context, limit)
 
     def copy_data(self, cr, uid, id, default=None, context=None):
         """
@@ -3687,9 +3784,9 @@ class orm(orm_template):
         :return: dictionary containing all the field values
         """
 
-        if not context:
+        if context is None:
             context = {}
-        if not default:
+        if default is None:
             default = {}
         if 'state' not in default:
             if 'state' in self._defaults:
@@ -3698,7 +3795,11 @@ class orm(orm_template):
                 else:
                     default['state'] = self._defaults['state']
 
-        data = self.read(cr, uid, [id], context=context)[0]
+        context_wo_lang = context
+        if 'lang' in context:
+            del context_wo_lang['lang']
+        data = self.read(cr, uid, [id], context=context_wo_lang)[0]
+
         fields = self.fields_get(cr, uid, context=context)
         trans_data=[]
         for f in fields:
@@ -3733,17 +3834,14 @@ class orm(orm_template):
 
         trans_obj = self.pool.get('ir.translation')
         #TODO: optimize translations
-        trans_name=''
         for f in fields:
-            trans_flag=True
+            trans_name = ''
             if f in self._columns and self._columns[f].translate:
-                trans_name=self._name+","+f
+                trans_name = self._name+","+f
             elif f in self._inherit_fields and self._inherit_fields[f][2].translate:
-                trans_name=self._inherit_fields[f][0]+","+f
-            else:
-                trans_flag=False
+                trans_name = self._inherit_fields[f][0] + "," + f
 
-            if trans_flag:
+            if trans_name:
                 trans_ids = trans_obj.search(cr, uid, [
                         ('name', '=', trans_name),
                         ('res_id','=',data['id'])
@@ -3779,9 +3877,12 @@ class orm(orm_template):
             trans_obj.create(cr, uid, record, context)
         return new_id
 
-    def exists(self, cr, uid, id, context=None):
-        cr.execute('SELECT count(1) FROM "%s" where id=%%s' % (self._table,), (id,))
-        return bool(cr.fetchone()[0])
+    def exists(self, cr, uid, ids, context=None):
+        if type(ids) in (int,long):
+            ids = [ids]
+        query = 'SELECT count(1) FROM "%s"' % (self._table)
+        cr.execute(query + "WHERE ID IN %s", (tuple(ids),))
+        return cr.fetchone()[0] == len(ids)
 
     def check_recursion(self, cr, uid, ids, parent=None):
         """
@@ -3811,5 +3912,26 @@ class orm(orm_template):
                     return False
         return True
 
+    def get_xml_id(self, cr, uid, ids, *args, **kwargs):
+        """Find out the XML ID of any database record, if there
+        is one. This method works as a possible implementation
+        for a function field, to be able to add it to any
+        model object easily, referencing it as 'osv.osv.get_xml_id'.
+
+        get_xml_id(cr, uid, ids) -> { 'id': 'module.xml_id' }
+
+        :return: the fully qualified XML ID of the given object,
+                 defaulting to an empty string when there's none.
+        """
+        result = dict.fromkeys(ids, '')
+        model_data_obj = self.pool.get('ir.model.data')
+        data_ids = model_data_obj.search(cr,uid,
+                [('model','=',self._name),('res_id','in',ids)])
+        data_results = model_data_obj.read(cr,uid,data_ids,
+                ['name','module','res_id'])
+        for record in data_results:
+            result[record['res_id']] = '%(module)s.%(name)s' % record
+        return result
+
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
index a528d41..6f85cd6 100644 (file)
@@ -30,7 +30,7 @@ import copy
 import sys
 import traceback
 import logging
-from psycopg2 import IntegrityError
+from psycopg2 import IntegrityError, errorcodes
 from tools.func import wraps
 
 
@@ -65,7 +65,22 @@ class osv_pool(netsvc.Service):
                 for key in self._sql_error.keys():
                     if key in inst[0]:
                         self.abortResponse(1, 'Constraint Error', 'warning', self._sql_error[key])
-                self.abortResponse(1, 'Integrity Error', 'warning', inst[0])
+                if inst.pgcode == errorcodes.NOT_NULL_VIOLATION:
+                    msg = 'Sorry, this record cannot be deleted at the moment because other records still reference it.'
+                    self.logger.debug("IntegrityError", exc_info=True)
+                    try:
+                        context = inst.pgerror.split('"public".')[1]
+                        model_name = table = context.split('"')[1]
+                        model = table.replace("_",".")
+                        model_obj = self.get(model)
+                        if model_obj:
+                            model_name = model_obj._description or model_obj._name
+                        msg += '\n\n[object with reference: %s - %s]' % (model_name, model)
+                    except Exception:
+                        pass
+                    self.abortResponse(1, 'Integrity Error', 'warning', msg)
+                else:
+                    self.abortResponse(1, 'Integrity Error', 'warning', inst[0])
             except Exception, e:
                 self.logger.exception("Uncaught exception")
                 raise
@@ -253,7 +268,8 @@ class osv(osv_base, orm.orm):
                             for c in cls.__dict__.get(s, []):
                                 exist = False
                                 for c2 in range(len(new)):
-                                    if new[c2][2]==c[2]:
+                                     #For _constraints, we should check field and methods as well
+                                     if new[c2][2]==c[2] and new[c2][0]==c[0]:
                                         new[c2] = c
                                         exist = True
                                         break
index f5fde69..817994e 100644 (file)
@@ -21,8 +21,8 @@
 ##############################################################################
 
 name = 'openerp-server'
-version = '5.2dev'
-major_version = '5.2'
+version = '6.0dev'
+major_version = '6.0'
 description = 'OpenERP Server'
 long_desc = '''\
 OpenERP is a complete ERP and CRM. The main features are accounting (analytic
index e476b29..d4309b3 100644 (file)
@@ -36,6 +36,7 @@ from pychart import *
 import misc
 import cStringIO
 from lxml import etree
+from tools.translate import _
 
 class external_pdf(render.render):
     def __init__(self, pdf):
index 35234bc..c84ce66 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
@@ -35,7 +35,7 @@ class report(object):
         for node in root_node:
             if node.tag == etree.Comment:
                 continue
-            if node.text:
+            if node.text or node.tail:
                 def _sub3(txt):
                     n = node
                     while n.tag != txt.group(2):
@@ -71,9 +71,9 @@ class report(object):
                         n = n.getparent()
                     n.set('rml_loop', txt.group(2))
                     return '[['+txt.group(1)+"''"+txt.group(4)+']]'
-                t = _regex1.sub(_sub1, node.text)
+                t = _regex1.sub(_sub1, node.text or node.tail)
                 if t == " ":
-                    t = _regex11.sub(_sub1, node.text)
+                    t = _regex11.sub(_sub1, node.text  or node.tail)
                 t = _regex3.sub(_sub3, t)
                 node.text = _regex2.sub(_sub2, t)
             self.preprocess_rml(node,type)
index fa1595e..a5912cd 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
@@ -52,13 +52,20 @@ class _rml_styles(object,):
     def __init__(self, nodes, localcontext):
         self.localcontext = localcontext
         self.styles = {}
+        self.styles_obj = {}
         self.names = {}
         self.table_styles = {}
+        self.default_style = reportlab.lib.styles.getSampleStyleSheet()
+
         for node in nodes:
             for style in node.findall('blockTableStyle'):
                 self.table_styles[style.get('id')] = self._table_style_get(style)
             for style in node.findall('paraStyle'):
-                self.styles[style.get('name')] = self._para_style_update(style)
+                sname = style.get('name')
+                self.styles[sname] = self._para_style_update(style)
+            
+                self.styles_obj[sname] = reportlab.lib.styles.ParagraphStyle(sname, self.default_style["Normal"], **self.styles[sname])
+
             for variable in node.findall('initialize'):
                 for name in variable.findall('name'):
                     self.names[ name.get('id')] = name.get('value')
@@ -126,17 +133,19 @@ class _rml_styles(object,):
 
     def para_style_get(self, node):
         style = False
-        if node.get('style'):
-            if node.get('style') in self.styles:
-                styles = reportlab.lib.styles.getSampleStyleSheet()
-                sname = node.get('style')
-                style = reportlab.lib.styles.ParagraphStyle(sname, styles["Normal"], **self.styles[sname])
+        sname = node.get('style')
+        if sname:
+            if sname in self.styles_obj:
+                style = self.styles_obj[sname]
             else:
                 sys.stderr.write('Warning: style not found, %s - setting default!\n' % (node.get('style'),) )
         if not style:
-            styles = reportlab.lib.styles.getSampleStyleSheet()
-            style = styles['Normal']
-        style.__dict__.update(self._para_style_update(node))
+            style = self.default_style['Normal']
+        para_update = self._para_style_update(node)
+        if para_update:
+            # update style only is necessary
+            style = copy.deepcopy(style)
+            style.__dict__.update(para_update)
         return style
 
 class _rml_doc(object):
@@ -167,7 +176,7 @@ class _rml_doc(object):
         from reportlab.lib.fonts import addMapping
         from reportlab.pdfbase import pdfmetrics
         from reportlab.pdfbase.ttfonts import TTFont
-    
+
         pdfmetrics.registerFont(TTFont(fontname, filename ))
         if (mode == 'all'):
             addMapping(face, 0, 0, fontname)    #normal
@@ -417,11 +426,11 @@ class _rml_canvas(object):
         self.canvas.drawPath(self.path, **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
 
     def setFont(self, node):
-        from reportlab.pdfbase import pdfmetrics 
+        from reportlab.pdfbase import pdfmetrics
         fname = node.get('name')
-        #TODO : other fonts should be supported      
+        #TODO : other fonts should be supported
         if fname not in pdfmetrics.standardFonts:
-           fname = self.canvas._fontname          
+           fname = self.canvas._fontname
         return self.canvas.setFont(fname, utils.unit_get(node.get('size')))
 
     def render(self, node):
@@ -565,7 +574,7 @@ class _rml_flowable(object):
     def _illustration(self, node):
         class Illustration(platypus.flowables.Flowable):
             def __init__(self, node, localcontext, styles, self2):
-                self.localcontext = localcontext
+                self.localcontext = localcontext.copy()
                 self.node = node
                 self.styles = styles
                 self.width = utils.unit_get(node.get('width'))
index 80912e4..ac4370a 100644 (file)
@@ -110,7 +110,7 @@ def _process_text(self, txt):
                     expr = sps.pop(0)
                     txt = eval(expr,self.localcontext)
                     if txt and (isinstance(txt, unicode) or isinstance(txt, str)):
-                        txt = unicode(self.localcontext.get('translate', lambda x:x)(txt))
+                        txt = unicode(txt)
                 except Exception,e:
                     tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
                 if type(txt)==type('') or type(txt)==type(u''):
index a85bac8..9d2fb97 100644 (file)
@@ -441,8 +441,8 @@ class report_sxw(report_rml, preprocess.report):
         rml_parser.set_context(objs, data, ids, report_xml.report_type)
         processed_rml = etree.XML(rml)
         if report_xml.header:
-            rml_parser._add_header(processed_rml)
-        processed_rml = self.preprocess_rml(processed_rml,report_xml.report_type)            
+            rml_parser._add_header(processed_rml, self.header)
+        processed_rml = self.preprocess_rml(processed_rml,report_xml.report_type)
         if rml_parser.logo:
             logo = base64.decodestring(rml_parser.logo)
         create_doc = self.generators[report_xml.report_type]
index 47ae6c3..98bbd9a 100644 (file)
 """
 from websrv_lib import *
 import netsvc
+import errno
 import threading
 import tools
 import os
+import select
 import socket
 import xmlrpclib
 
@@ -128,31 +130,25 @@ class BaseHttpDaemon(threading.Thread, netsvc.Server):
                 "Error occur when starting the server daemon: %s" % (e,))
             raise
 
+    @property
+    def socket(self):
+        return self.server.socket
+
     def attach(self, path, gw):
         pass
 
     def stop(self):
         self.running = False
-        if os.name != 'nt':
-            try:
-                self.server.socket.shutdown(
-                    getattr(socket, 'SHUT_RDWR', 2))
-            except socket.error, e:
-                if e.errno != 57: raise
-                # OSX, socket shutdowns both sides if any side closes it
-                # causing an error 57 'Socket is not connected' on shutdown
-                # of the other side (or something), see
-                # http://bugs.python.org/issue4397
-                netsvc.Logger().notifyChannel(
-                    'server', netsvc.LOG_DEBUG,
-                    '"%s" when shutting down server socket, '
-                    'this is normal under OS X'%e)
-        self.server.socket.close()
+        self._close_socket()
 
     def run(self):
         self.running = True
         while self.running:
-            self.server.handle_request()
+            try:
+                self.server.handle_request()
+            except (socket.error, select.error), e:
+                if self.running or e.args[0] != errno.EBADF:
+                    raise
         return True
 
 class HttpDaemon(BaseHttpDaemon):
index 9a8a699..1f860e4 100644 (file)
@@ -27,6 +27,7 @@ import netsvc
 import threading
 import tools
 import os
+import select
 import socket
 
 import tiny_socket
@@ -50,7 +51,6 @@ class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher):
             self.sock = None
 
     def run(self):
-        # import select
         self.running = True
         try:
             ts = tiny_socket.mysocket(self.sock)
@@ -103,10 +103,13 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
                          "starting NET-RPC service at %s port %d" % (interface or '0.0.0.0', port,))
 
     def run(self):
-        # import select
         try:
             self.running = True
             while self.running:
+                timeout = self.socket.gettimeout()
+                fd_sets = select.select([self.socket], [], [], timeout)
+                if not fd_sets[0]:
+                    continue
                 (clientsocket, address) = self.socket.accept()
                 ct = TinySocketClientThread(clientsocket, self.threads)
                 clientsocket = None
@@ -129,12 +132,7 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
         self.running = False
         for t in self.threads:
             t.stop()
-        try:
-            self.socket.shutdown(
-                getattr(socket, 'SHUT_RDWR', 2))
-            self.socket.close()
-        except:
-            return False
+        self._close_socket()
 
     def stats(self):
         res = "Net-RPC: " + ( (self.running and "running") or  "stopped")
index 308a7aa..19b178c 100644 (file)
@@ -261,6 +261,7 @@ class db(netsvc.ExportService):
 
         db = sql_db.db_connect('template1')
         cr = db.cursor()
+        cr.autocommit(True) # avoid transaction block
         try:
             try:
                 cr.execute('ALTER DATABASE "%s" RENAME TO "%s"' % (old_name, new_name))
@@ -283,8 +284,8 @@ class db(netsvc.ExportService):
         ## Not True: in fact, check if connection to database is possible. The database may exists
         return bool(sql_db.db_connect(db_name))
 
-    def exp_list(self):
-        if not tools.config['list_db']:
+    def exp_list(self, document=False):
+        if not tools.config['list_db'] and not document:
             raise Exception('AccessDenied')
 
         db = sql_db.db_connect('template1')
index 94336cd..02b3e57 100644 (file)
@@ -100,7 +100,7 @@ class Cursor(object):
             msg = "Cursor not closed explicitly\n"  \
                   "Cursor was created at %s:%s"
             self.__logger.warn(msg, *self.__caller)
-            self.close()
+            self._close(True)
 
     @check
     def execute(self, query, params=None):
@@ -118,7 +118,7 @@ class Cursor(object):
             params = params or None
             res = self._obj.execute(query, params)
         except psycopg2.ProgrammingError, pe:
-            self.__logger.error("Programming error: %s, in query %s" % (pe, query))
+            self.__logger.error("Programming error: %s, in query %s", pe, query)
             raise
         except Exception:
             self.__logger.exception("bad query: %s", self._obj.query)
@@ -177,6 +177,9 @@ class Cursor(object):
 
     @check
     def close(self):
+        return self._close(False)
+
+    def _close(self, leak=False):
         if not self._obj:
             return
 
@@ -194,7 +197,12 @@ class Cursor(object):
         # part because browse records keep a reference to the cursor.
         del self._obj
         self.__closed = True
-        self._pool.give_back(self._cnx)
+
+        if leak:
+            self._cnx.leaked = True
+        else:
+            keep_in_pool = self.dbname not in ('template1', 'template0', 'postgres')
+            self._pool.give_back(self._cnx, keep_in_pool=keep_in_pool)
 
     @check
     def autocommit(self, on):
@@ -214,6 +222,9 @@ class Cursor(object):
         return getattr(self._obj, name)
 
 
+class PsycoConnection(psycopg2.extensions.connection):
+    pass
+
 class ConnectionPool(object):
 
     __logger = logging.getLogger('db.connection_pool')
@@ -239,57 +250,64 @@ class ConnectionPool(object):
         count = len(self._connections)
         return "ConnectionPool(used=%d/count=%d/max=%d)" % (used, count, self._maxconn)
 
-    def _debug(self, msg):
-        self.__logger.debug(repr(self))
-        self.__logger.debug(msg)
+    def _debug(self, msg, *args):
+        msg = '%r ' + msg
+        self.__logger.debug(msg, self, *args)
 
     @locked
     def borrow(self, dsn):
-        self._debug('Borrow connection to %s' % (dsn,))
+        self._debug('Borrow connection to %r', dsn)
+
+        # free leaked connections
+        for i, (cnx, _) in tools.reverse_enumerate(self._connections):
+            if getattr(cnx, 'leaked', False):
+                delattr(cnx, 'leaked')
+                self._connections.pop(i)
+                self._connections.append((cnx, False))
+                self._debug('Free leaked connection to %r', cnx.dsn)
 
-        result = None
         for i, (cnx, used) in enumerate(self._connections):
             if not used and dsn_are_equals(cnx.dsn, dsn):
-                self._debug('Existing connection found at index %d' % i)
-
                 self._connections.pop(i)
                 self._connections.append((cnx, True))
+                self._debug('Existing connection found at index %d', i)
 
-                result = cnx
-                break
-        if result:
-            return result
+                return cnx
 
         if len(self._connections) >= self._maxconn:
             # try to remove the oldest connection not used
             for i, (cnx, used) in enumerate(self._connections):
                 if not used:
-                    self._debug('Removing old connection at index %d: %s' % (i, cnx.dsn))
                     self._connections.pop(i)
+                    self._debug('Removing old connection at index %d: %r', i, cnx.dsn)
                     break
             else:
                 # note: this code is called only if the for loop has completed (no break)
                 raise PoolError('The Connection Pool Is Full')
 
-        self._debug('Create new connection')
-        result = psycopg2.connect(dsn=dsn)
+        result = psycopg2.connect(dsn=dsn, connection_factory=PsycoConnection)
         self._connections.append((result, True))
+        self._debug('Create new connection')
         return result
 
     @locked
-    def give_back(self, connection):
-        self._debug('Give back connection to %s' % (connection.dsn,))
+    def give_back(self, connection, keep_in_pool=True):
+        self._debug('Give back connection to %r', connection.dsn)
         for i, (cnx, used) in enumerate(self._connections):
             if cnx is connection:
                 self._connections.pop(i)
-                self._connections.append((cnx, False))
+                if keep_in_pool:
+                    self._connections.append((cnx, False))
+                    self._debug('Put connection to %r in pool', cnx.dsn)
+                else:
+                    self._debug('Forgot connection to %r', cnx.dsn)
                 break
         else:
             raise PoolError('This connection does not below to the pool')
 
     @locked
     def close_all(self, dsn):
-        self._debug('Close all connections to %s' % (dsn,))
+        self._debug('Close all connections to %r', dsn)
         for i, (cnx, used) in tools.reverse_enumerate(self._connections):
             if dsn_are_equals(cnx.dsn, dsn):
                 cnx.close()
@@ -305,7 +323,7 @@ class Connection(object):
 
     def cursor(self, serialized=False):
         cursor_type = serialized and 'serialized ' or ''
-        self.__logger.debug('create %scursor to "%s"' % (cursor_type, self.dbname,))
+        self.__logger.debug('create %scursor to %r', cursor_type, self.dbname)
         return Cursor(self._pool, self.dbname, serialized=serialized)
 
     def serialized_cursor(self):
index 8f1f1ca..a629e97 100644 (file)
@@ -82,6 +82,8 @@ class configmanager(object):
             'login_message': False,
             'list_db' : True,
             'timezone' : False, # to override the default TZ
+            'test-disable' : False,
+            'test-commit' : False,
         }
 
         self.misc = {}
@@ -121,7 +123,6 @@ class configmanager(object):
         parser.add_option("--assert-exit-level", dest='assert_exit_level', type="choice", choices=self._LOGLEVELS.keys(),
                           help="specify the level at which a failed assertion will stop the server. Accepted values: %s" % (self._LOGLEVELS.keys(),))
         parser.add_option('--price_accuracy', dest='price_accuracy', default='2', help='deprecated since v6.0, replaced by module decimal_precision')
-        parser.add_option('--no-database-list', action="store_false", dest='list_db', default=True, help="disable the ability to return the list of databases")
 
         if self.has_ssl:
             group = optparse.OptionGroup(parser, "SSL Configuration")
@@ -135,6 +136,14 @@ class configmanager(object):
                               help="specify the private key file for the SSL connection")
             parser.add_option_group(group)
 
+        # Testing Group
+        group = optparse.OptionGroup(parser, "Testing Configuration")
+        group.add_option("--test-disable", action="store_true", dest="test_disable",
+                         default=False, help="Disable loading test files.")
+        group.add_option("--test-commit", action="store_true", dest="test_commit",
+                         default=False, help="Commit database changes performed by tests.")
+        parser.add_option_group(group)
+
         # Logging Group
         group = optparse.OptionGroup(parser, "Logging Configuration")
         group.add_option("--logfile", dest="logfile", help="file where the server log will be stored")
@@ -151,8 +160,7 @@ class configmanager(object):
         group.add_option('--email-from', dest='email_from', default='', help='specify the SMTP email address for sending email')
         group.add_option('--smtp', dest='smtp_server', default='', help='specify the SMTP server for sending email')
         group.add_option('--smtp-port', dest='smtp_port', default='25', help='specify the SMTP port', type="int")
-        if self.has_ssl:
-            group.add_option('--smtp-ssl', dest='smtp_ssl', default='', help='specify the SMTP server support SSL or not')
+        group.add_option('--smtp-ssl', dest='smtp_ssl', default='', help='specify the SMTP server support SSL or not')
         group.add_option('--smtp-user', dest='smtp_user', default='', help='specify the SMTP username for sending email')
         group.add_option('--smtp-password', dest='smtp_password', default='', help='specify the SMTP password for sending email')
         parser.add_option_group(group)
@@ -189,6 +197,13 @@ class configmanager(object):
                          action="callback", callback=self._check_addons_path, nargs=1, type="string")
         parser.add_option_group(group)
 
+        security = optparse.OptionGroup(parser, 'Security-related options')
+        security.add_option('--no-database-list', action="store_false", dest='list_db', default=True, help="disable the ability to return the list of databases")
+        security.add_option('--enable-code-actions', action='store_true',
+                            dest='server_actions_allow_code', default=False,
+                            help='Enables server actions of state "code". Warning, this is a security risk.')
+        parser.add_option_group(security)
+
     def parse_config(self):
         (opt, args) = self.parser.parse_args()
 
@@ -234,13 +249,13 @@ class configmanager(object):
             self.options['pidfile'] = False
 
         keys = ['interface', 'port', 'db_name', 'db_user', 'db_password', 'db_host',
-                'db_port', 'list_db', 'logfile', 'pidfile', 'smtp_port', 'cache_timeout',
+                'db_port', 'list_db', 'logfile', 'pidfile', 'smtp_port', 'cache_timeout','smtp_ssl',
                 'email_from', 'smtp_server', 'smtp_user', 'smtp_password', 'price_accuracy',
                 'netinterface', 'netport', 'db_maxconn', 'import_partial', 'addons_path',
                 'netrpc', 'xmlrpc', 'syslog', 'without_demo', 'timezone',]
 
         if self.has_ssl:
-            keys.extend(['smtp_ssl', 'secure_cert_file', 'secure_pkey_file'])
+            keys.extend(['secure_cert_file', 'secure_pkey_file'])
             keys.append('secure')
 
         for arg in keys:
@@ -248,7 +263,8 @@ class configmanager(object):
                 self.options[arg] = getattr(opt, arg)
 
         keys = ['language', 'translate_out', 'translate_in', 'debug_mode',
-                'stop_after_init', 'logrotate', 'without_demo', 'netrpc', 'xmlrpc', 'syslog', 'list_db']
+                'stop_after_init', 'logrotate', 'without_demo', 'netrpc', 'xmlrpc', 'syslog',
+                'list_db', 'server_actions_allow_code']
 
         if self.has_ssl and not self.options['secure']:
             keys.append('secure')
@@ -274,6 +290,8 @@ class configmanager(object):
 
         self.options['init'] = opt.init and dict.fromkeys(opt.init.split(','), 1) or {}
         self.options["demo"] = not opt.without_demo and self.options['init'] or {}
+        self.options["test-disable"] =  opt.test_disable
+        self.options["test-commit"] =  opt.test_commit
         self.options['update'] = opt.update and dict.fromkeys(opt.update.split(','), 1) or {}
 
         self.options['translate_modules'] = opt.translate_modules and map(lambda m: m.strip(), opt.translate_modules.split(',')) or ['all']
index 36f2740..a7e002e 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
@@ -26,11 +26,9 @@ import os.path
 import pickle
 import re
 import sys
-import time
 
 from datetime import datetime
 from lxml import etree
-
 import ir
 import misc
 import netsvc
@@ -79,6 +77,7 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
                 return f_val
             a_eval = node.get('eval','')
             if a_eval:
+                import time
                 idref2 = idref.copy()
                 idref2['time'] = time
                 idref2['DateTime'] = datetime
@@ -253,6 +252,14 @@ form: module.record_id""" % (xml_id,)
             self.pool.get(d_model).unlink(cr, self.uid, ids)
             self.pool.get('ir.model.data')._unlink(cr, self.uid, d_model, ids)
 
+    def _remove_ir_values(self, cr, name, value, model):
+        ir_value_ids = self.pool.get('ir.values').search(cr, self.uid, [('name','=',name),('value','=',value),('model','=',model)])
+        if ir_value_ids:
+            self.pool.get('ir.values').unlink(cr, self.uid, ir_value_ids)
+            self.pool.get('ir.model.data')._unlink(cr, self.uid, 'ir.values', ir_value_ids)
+
+        return True
+
     def _tag_report(self, cr, rec, data_node=None):
         res = {}
         for dest,f in (('name','string'),('model','model'),('report_name','name')):
@@ -262,16 +269,17 @@ form: module.record_id""" % (xml_id,)
             if rec.get(field):
                 res[dest] = rec.get(field).encode('utf8')
         if rec.get('auto'):
-            res['auto'] = eval(rec.get('auto'))
+            res['auto'] = eval(rec.get('auto','False'))
         if rec.get('sxw'):
             sxw_content = misc.file_open(rec.get('sxw')).read()
             res['report_sxw_content'] = sxw_content
         if rec.get('header'):
-            res['header'] = eval(rec.get('header'))
+            res['header'] = eval(rec.get('header','False'))
         if rec.get('report_type'):
             res['report_type'] = rec.get('report_type')
 
-        res['multi'] = rec.get('multi') and eval(rec.get('multi'))
+        res['multi'] = rec.get('multi') and eval(rec.get('multi','False'))
+
         xml_id = rec.get('id','').encode('utf8')
         self._test_xml_id(xml_id)
 
@@ -291,12 +299,16 @@ form: module.record_id""" % (xml_id,)
         id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.report.xml", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
         self.idref[xml_id] = int(id)
 
-        if not rec.get('menu') or eval(rec.get('menu','')):
+        if not rec.get('menu') or eval(rec.get('menu','False')):
             keyword = str(rec.get('keyword', 'client_print_multi'))
             keys = [('action',keyword),('res_model',res['model'])]
             value = 'ir.actions.report.xml,'+str(id)
             replace = rec.get('replace', True)
             self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, res['name'], [res['model']], value, replace=replace, isobject=True, xml_id=xml_id)
+        elif self.mode=='update' and eval(rec.get('menu','False'))==False:
+            # Special check for report having attribute menu=False on update
+            value = 'ir.actions.report.xml,'+str(id)
+            self._remove_ir_values(cr, res['name'], value, res['model'])
         return False
 
     def _tag_function(self, cr, rec, data_node=None):
@@ -313,7 +325,7 @@ form: module.record_id""" % (xml_id,)
         name = rec.get("name",'').encode('utf8')
         xml_id = rec.get('id','').encode('utf8')
         self._test_xml_id(xml_id)
-        multi = rec.get('multi','') and eval(rec.get('multi',''))
+        multi = rec.get('multi','') and eval(rec.get('multi','False'))
         res = {'name': string, 'wiz_name': name, 'multi': multi, 'model': model}
 
         if rec.get('groups'):
@@ -332,12 +344,16 @@ form: module.record_id""" % (xml_id,)
         id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.wizard", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
         self.idref[xml_id] = int(id)
         # ir_set
-        if (not rec.get('menu') or eval(rec.get('menu',''))) and id:
+        if (not rec.get('menu') or eval(rec.get('menu','False'))) and id:
             keyword = str(rec.get('keyword','') or 'client_action_multi')
             keys = [('action',keyword),('res_model',model)]
             value = 'ir.actions.wizard,'+str(id)
             replace = rec.get("replace",'') or True
             self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, string, [model], value, replace=replace, isobject=True, xml_id=xml_id)
+        elif self.mode=='update' and (rec.get('menu') and eval(rec.get('menu','False'))==False):
+            # Special check for wizard having attribute menu=False on update
+            value = 'ir.actions.wizard,'+str(id)
+            self._remove_ir_values(cr, string, value, model)
 
     def _tag_url(self, cr, rec, data_node=None):
         url = rec.get("string",'').encode('utf8')
@@ -351,12 +367,16 @@ form: module.record_id""" % (xml_id,)
         id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
         self.idref[xml_id] = int(id)
         # ir_set
-        if (not rec.get('menu') or eval(rec.get('menu',''))) and id:
+        if (not rec.get('menu') or eval(rec.get('menu','False'))) and id:
             keyword = str(rec.get('keyword','') or 'client_action_multi')
             keys = [('action',keyword)]
             value = 'ir.actions.url,'+str(id)
             replace = rec.get("replace",'') or True
             self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, url, ["ir.actions.url"], value, replace=replace, isobject=True, xml_id=xml_id)
+        elif self.mode=='update' and (rec.get('menu') and eval(rec.get('menu','False'))==False):
+            # Special check for URL having attribute menu=False on update
+            value = 'ir.actions.url,'+str(id)
+            self._remove_ir_values(cr, url, value, "ir.actions.url")
 
     def _tag_act_window(self, cr, rec, data_node=None):
         name = rec.get('name','').encode('utf-8')
@@ -369,21 +389,22 @@ form: module.record_id""" % (xml_id,)
         domain = rec.get('domain','').encode('utf-8') or '{}'
         context = rec.get('context','').encode('utf-8') or '{}'
         res_model = rec.get('res_model','').encode('utf-8')
-        src_model = rec.get('src_model','').encode('utf-8')        
+        src_model = rec.get('src_model','').encode('utf-8')
         view_type = rec.get('view_type','').encode('utf-8') or 'form'
         view_mode = rec.get('view_mode','').encode('utf-8') or 'tree,form'
-        
+
         usage = rec.get('usage','').encode('utf-8')
         limit = rec.get('limit','').encode('utf-8')
         auto_refresh = rec.get('auto_refresh','').encode('utf-8')
         uid = self.uid
         # def ref() added because , if context has ref('id') eval wil use this ref
 
-        active_id=str("active_id") # for further reference in client/bin/tools/__init__.py
+        active_id = str("active_id") # for further reference in client/bin/tools/__init__.py
 
         def ref(str_id):
             return self.id_get(cr, None, str_id)
-        context=eval(context)
+        context = eval(context)
+#        domain = eval(domain) # XXX need to test this line -> uid, active_id, active_ids, ...
 
         res = {
             'name': name,
@@ -720,7 +741,12 @@ form: module.record_id""" % (xml_id,)
                 if f_ref=="null":
                     f_val = False
                 else:
-                    f_val = self.id_get(cr, f_model, f_ref)
+                    if f_name in model._columns \
+                              and model._columns[f_name]._type == 'reference':
+                        val = self.model_id_get(cr, f_model, f_ref)
+                        f_val = val[0] + ',' + str(val[1])
+                    else:
+                        f_val = self.id_get(cr, f_model, f_ref)
             else:
                 f_val = _eval_xml(self,field, self.pool, cr, self.uid, self.idref)
                 if model._columns.has_key(f_name):
@@ -738,13 +764,17 @@ form: module.record_id""" % (xml_id,)
     def id_get(self, cr, model, id_str):
         if id_str in self.idref:
             return self.idref[id_str]
+        return self.model_id_get(cr, model, id_str)[1]
+
+    def model_id_get(self, cr, model, id_str):
+        model_data_obj = self.pool.get('ir.model.data')
         mod = self.module
         if '.' in id_str:
             mod,id_str = id_str.split('.')
-        result = self.pool.get('ir.model.data')._get_id(cr, self.uid, mod, id_str)
-        res = self.pool.get('ir.model.data').read(cr, self.uid, [result], ['res_id'])
+        result = model_data_obj._get_id(cr, self.uid, mod, id_str)
+        res = model_data_obj.read(cr, self.uid, [result], ['model', 'res_id'])
         if res and res[0] and res[0]['res_id']:
-            return int(res[0]['res_id'])
+            return res[0]['model'], int(res[0]['res_id'])
         return False
 
     def parse(self, de):
index 7aee1ae..1594ca5 100644 (file)
@@ -3,6 +3,7 @@
 #
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -33,6 +34,9 @@ import release
 import socket
 import re
 from itertools import islice
+import threading
+from which import which
+
 
 if sys.version_info[:2] < (2, 4):
     from threadinglocal import local
@@ -99,7 +103,7 @@ def init_db(cr):
                 values (%s, %s, %s, %s, %s, %s, %s, %s, %s)', (
             id, info.get('author', ''),
             info.get('website', ''), i, info.get('name', False),
-            info.get('description', ''), p_id, state, info.get('certificate')))
+            info.get('description', ''), p_id, state, info.get('certificate') or None))
         cr.execute('insert into ir_model_data \
             (name,model,module, res_id, noupdate) values (%s,%s,%s,%s,%s)', (
                 'module_meta_information', 'ir.module.module', i, id, True))
@@ -110,23 +114,19 @@ def init_db(cr):
         cr.commit()
 
 def find_in_path(name):
-    if os.name == "nt":
-        sep = ';'
-    else:
-        sep = ':'
-    path = [dir for dir in os.environ['PATH'].split(sep)
-            if os.path.isdir(dir)]
-    for dir in path:
-        val = os.path.join(dir, name)
-        if os.path.isfile(val) or os.path.islink(val):
-            return val
-    return None
+    try:
+        return which(name)
+    except IOError:
+        return None
 
 def find_pg_tool(name):
+    path = None
     if config['pg_path'] and config['pg_path'] != 'None':
-        return os.path.join(config['pg_path'], name)
-    else:
-        return find_in_path(name)
+        path = config['pg_path']
+    try:
+        return which(name, path=path)
+    except IOError:
+        return None
 
 def exec_pg_command(name, *args):
     prog = find_pg_tool(name)
@@ -472,7 +472,7 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
     for key, value in x_headers.iteritems():
         msg['X-OpenERP-%s' % key] = str(value)
         msg['%s' % key] = str(value)
-    
+
     if openobject_id:
         msg['Message-Id'] = "<%s-openobject-%s@%s>" % (time.time(), openobject_id, socket.gethostname())
 
@@ -818,6 +818,22 @@ class cache(object):
 def to_xml(s):
     return s.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;')
 
+def get_encodings():
+    yield 'utf8'
+    from locale import getpreferredencoding
+    prefenc = getpreferredencoding()
+    if prefenc:
+        yield prefenc
+
+        prefenc = {
+            'latin1': 'latin9',
+            'iso-8859-1': 'iso8859-15',
+            'cp1252': '1252',
+        }.get(prefenc.lower())
+        if prefenc:
+            yield prefenc
+
+
 def ustr(value):
     """This method is similar to the builtin `str` method, except
     it will return Unicode string.
@@ -827,29 +843,25 @@ def ustr(value):
     @rtype: unicode
     @return: unicode string
     """
+    orig = value
+    if isinstance(value, Exception):
+        return exception_to_unicode(value)
 
     if isinstance(value, unicode):
         return value
 
-    if hasattr(value, '__unicode__'):
+    try:
         return unicode(value)
-
-    if not isinstance(value, str):
-        value = str(value)
-
-    try: # first try utf-8
-        return unicode(value, 'utf-8')
     except:
         pass
 
-    try: # then extened iso-8858
-        return unicode(value, 'iso-8859-15')
-    except:
-        pass
+    for ln in get_encodings():
+        try:
+            return unicode(value, ln)
+        except:
+            pass
+    raise UnicodeError('unable de to convert %r' % (orig,))
 
-    # else use default system locale
-    from locale import getlocale
-    return unicode(value, getlocale()[1])
 
 def exception_to_unicode(e):
     if (sys.version_info[:2] < (2,6)) and hasattr(e, 'message'):
@@ -912,7 +924,7 @@ def get_languages():
         'fr_BE': u'French (BE) / Français (BE)',
         'fr_CH': u'French (CH) / Français (CH)',
         'fr_FR': u'French / Français',
-        'gl_ES': u'Galician / Spain',
+        'gl_ES': u'Galician / Galego',
         'gu_IN': u'Gujarati / India',
         'hi_IN': u'Hindi / India',
         'hr_HR': u'Croatian / hrvatski jezik',
@@ -937,8 +949,8 @@ def get_languages():
         'ro_RO': u'Romanian / limba română',
         'ru_RU': u'Russian / русский язык',
         'si_LK': u'Sinhalese / Sri Lanka',
-        'sk_SK': u'Slovak / Slovakia',
-        'sl_SL': u'Slovenian / slovenščina',
+        'sl_SI': u'Slovenian / slovenščina',
+        'sk_SK': u'Slovak / Slovenský jazyk',
         'sq_AL': u'Albanian / Shqipëri',
         'sr_RS': u'Serbian / Serbia',
         'sv_SE': u'Swedish / svenska',
@@ -1284,6 +1296,23 @@ if __name__ == '__main__':
     import doctest
     doctest.testmod()
 
+class upload_data_thread(threading.Thread):
+    def __init__(self, email, data, type):
+        self.args = [('email',email),('type',type),('data',data)]
+        super(upload_data_thread,self).__init__()
+    def run(self):
+        try:
+            import urllib
+            args = urllib.urlencode(self.args)
+            fp = urllib.urlopen('http://www.openerp.com/scripts/survey.php', args)
+            fp.read()
+            fp.close()
+        except:
+            pass
 
+def upload_data(email, data, type='SURVEY'):
+    a = upload_data_thread(email, data, type)
+    a.start()
+    return True
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
index 05f7f95..9277bf6 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
 #
@@ -15,7 +15,7 @@
 #    GNU Affero General Public License for more details.
 #
 #    You should have received a copy of the GNU Affero General Public License
-#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
 
@@ -596,23 +596,30 @@ def trans_generate(lang, modules, dbname=None):
                 push_translation(module, 'model', name, xml_name, encode(trad))
 
     # parse source code for _() calls
-    def get_module_from_path(path,mod_paths=None):
-        if not mod_paths:
-            # First, construct a list of possible paths
-            def_path = os.path.abspath(os.path.join(tools.config['root_path'], 'addons'))     # default addons path (base)
-            ad_paths= map(lambda m: os.path.abspath(m.strip()),tools.config['addons_path'].split(','))
-            mod_paths=[def_path]
-            for adp in ad_paths:
-                mod_paths.append(adp)
-                if not adp.startswith('/'):
-                    mod_paths.append(os.path.join(def_path,adp))
-                elif adp.startswith(def_path):
-                    mod_paths.append(adp[len(def_path)+1:])
-        
-        for mp in mod_paths:
-            if path.startswith(mp) and (os.path.dirname(path) != mp):
-                path = path[len(mp)+1:]
-                return path.split(os.path.sep)[0]
+    def get_module_from_path(path, mod_paths=None):
+#        if not mod_paths:
+##             First, construct a list of possible paths
+#            def_path = os.path.abspath(os.path.join(tools.config['root_path'], 'addons'))     # default addons path (base)
+#            ad_paths= map(lambda m: os.path.abspath(m.strip()),tools.config['addons_path'].split(','))
+#            mod_paths=[def_path]
+#            for adp in ad_paths:
+#                mod_paths.append(adp)
+#                if not adp.startswith('/'):
+#                    mod_paths.append(os.path.join(def_path,adp))
+#                elif adp.startswith(def_path):
+#                    mod_paths.append(adp[len(def_path)+1:])
+#        for mp in mod_paths:
+#            if path.startswith(mp) and (os.path.dirname(path) != mp):
+#                path = path[len(mp)+1:]
+#                return path.split(os.path.sep)[0]
+        path_dir = os.path.dirname(path[1:])
+        if path_dir:
+            if os.path.exists(os.path.join(tools.config['addons_path'],path[1:])):
+                return path.split(os.path.sep)[1]
+            else:
+                root_addons = os.path.join(tools.config['root_path'], 'addons')
+                if os.path.exists(os.path.join(root_addons,path[1:])):
+                    return path.split(os.path.sep)[1]
         return 'base'   # files that are not in a module are considered as being in 'base' module
 
     modobj = pool.get('ir.module.module')
@@ -699,6 +706,11 @@ def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=
             if not lang_name:
                 lang_name = tools.get_languages().get(lang, lang)
 
+            def fix_xa0(s):
+                if s == '\xa0':
+                    return '\xc2\xa0'
+                return s
+
             lang_info = {
                 'code': lang,
                 'iso_code': iso_lang,
@@ -706,9 +718,10 @@ def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=
                 'translatable': 1,
                 'date_format' : str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y')),
                 'time_format' : str(locale.nl_langinfo(locale.T_FMT)),
-                'decimal_point' : str(locale.localeconv()['decimal_point']).replace('\xa0', '\xc2\xa0'),
-                'thousands_sep' : str(locale.localeconv()['thousands_sep']).replace('\xa0', '\xc2\xa0'),
+                'decimal_point' : fix_xa0(str(locale.localeconv()['decimal_point'])),
+                'thousands_sep' : fix_xa0(str(locale.localeconv()['thousands_sep'])),
             }
+
             try:
                 lang_obj.create(cr, uid, lang_info)
             finally:
@@ -767,7 +780,7 @@ def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=
                 # the same source
                 obj = pool.get(model)
                 if obj:
-                    if not field in obj._columns:
+                    if field not in obj.fields_get_keys(cr, uid):
                         continue
                     ids = obj.search(cr, uid, [(field, '=', dic['src'])])
 
diff --git a/bin/tools/which.py b/bin/tools/which.py
new file mode 100644 (file)
index 0000000..66b264b
--- /dev/null
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+""" Which - locate a command
+
+    * adapted from Brian Curtin's http://bugs.python.org/file15381/shutil_which.patch
+    * see http://bugs.python.org/issue444582
+    * uses ``PATHEXT`` on Windows
+    * searches current directory before ``PATH`` on Windows,
+      but not before an explicitly passed path
+    * accepts both string or iterable for an explicitly passed path, or pathext
+    * accepts an explicitly passed empty path, or pathext (either '' or [])
+    * does not search ``PATH`` for files that have a path specified in their name already
+    * moved defpath and defpathext lists initialization to module level,
+      instead of initializing them on each function call
+    * changed interface: which_files() returns generator, which() returns first match,
+      or raises IOError(errno.ENOENT)
+
+    .. function:: which_files(file [, mode=os.F_OK | os.X_OK[, path=None[, pathext=None]]])
+
+       Return a generator which yields full paths in which the *file* name exists
+       in a directory that is part of the file name, or on *path*,
+       and has the given *mode*.
+       By default, *mode* matches an inclusive OR of os.F_OK and os.X_OK
+        - an existing executable file.
+       The *path* is, by default, the ``PATH`` variable on the platform,
+       or the string/iterable passed in as *path*.
+       In the event that a ``PATH`` variable is not found, :const:`os.defpath` is used.
+       On Windows, a current directory is searched before using the ``PATH`` variable,
+       but not before an explicitly passed *path*.
+       The *pathext* is only used on Windows to match files with given extensions appended as well.
+       It defaults to the ``PATHEXT`` variable, or the string/iterable passed in as *pathext*.
+       In the event that a ``PATHEXT`` variable is not found,
+       default value for Windows XP/Vista is used.
+       The command is always searched without extension first,
+       even when *pathext* is explicitly passed.
+
+    .. function:: which(file [, mode=os.F_OK | os.X_OK[, path=None[, pathext=None]]])
+       Return first match generated by which_files(file, mode, path, pathext),
+       or raise IOError(errno.ENOENT).
+
+"""
+__docformat__ = 'restructuredtext en'
+__all__ = 'which which_files pathsep defpath defpathext F_OK R_OK W_OK X_OK'.split()
+
+import sys
+from os import access, defpath, pathsep, environ, F_OK, R_OK, W_OK, X_OK
+from os.path import exists, dirname, split, join
+
+windows = sys.platform.startswith('win')
+
+defpath = environ.get('PATH', defpath).split(pathsep)
+
+if windows:
+    defpath.insert(0, '.') # can insert without checking, when duplicates are removed
+    # given the quite usual mess in PATH on Windows, let's rather remove duplicates
+    seen = set()
+    defpath = [dir for dir in defpath if dir.lower() not in seen and not seen.add(dir.lower())]
+    del seen
+
+    defpathext = [''] + environ.get('PATHEXT',
+        '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC').lower().split(pathsep)
+else:
+    defpathext = ['']
+
+def which_files(file, mode=F_OK | X_OK, path=None, pathext=None):
+    """ Locate a file in a path supplied as a part of the file name,
+        or the user's path, or a supplied path.
+        The function yields full paths (not necessarily absolute paths),
+        in which the given file name matches an existing file in a directory on the path.
+
+        >>> def test_which(expected, *args, **argd):
+        ...     result = list(which_files(*args, **argd))
+        ...     assert result == expected, 'which_files: %s != %s' % (result, expected)
+        ...
+        ...     try:
+        ...         result = [ which(*args, **argd) ]
+        ...     except IOError:
+        ...         result = []
+        ...     assert result[:1] == expected[:1], 'which: %s != %s' % (result[:1], expected[:1])
+
+        >>> if windows: cmd = environ['COMSPEC']
+        >>> if windows: test_which([cmd], 'cmd')
+        >>> if windows: test_which([cmd], 'cmd.exe')
+        >>> if windows: test_which([cmd], 'cmd', path=dirname(cmd))
+        >>> if windows: test_which([cmd], 'cmd', pathext='.exe')
+        >>> if windows: test_which([cmd], cmd)
+        >>> if windows: test_which([cmd], cmd, path='<nonexistent>')
+        >>> if windows: test_which([cmd], cmd, pathext='<nonexistent>')
+        >>> if windows: test_which([cmd], cmd[:-4])
+        >>> if windows: test_which([cmd], cmd[:-4], path='<nonexistent>')
+
+        >>> if windows: test_which([], 'cmd', path='<nonexistent>')
+        >>> if windows: test_which([], 'cmd', pathext='<nonexistent>')
+        >>> if windows: test_which([], '<nonexistent>/cmd')
+        >>> if windows: test_which([], cmd[:-4], pathext='<nonexistent>')
+
+        >>> if not windows: sh = '/bin/sh'
+        >>> if not windows: test_which([sh], 'sh')
+        >>> if not windows: test_which([sh], 'sh', path=dirname(sh))
+        >>> if not windows: test_which([sh], 'sh', pathext='<nonexistent>')
+        >>> if not windows: test_which([sh], sh)
+        >>> if not windows: test_which([sh], sh, path='<nonexistent>')
+        >>> if not windows: test_which([sh], sh, pathext='<nonexistent>')
+
+        >>> if not windows: test_which([], 'sh', mode=W_OK)  # not running as root, are you?
+        >>> if not windows: test_which([], 'sh', path='<nonexistent>')
+        >>> if not windows: test_which([], '<nonexistent>/sh')
+    """
+    filepath, file = split(file)
+
+    if filepath:
+        path = (filepath,)
+    elif path is None:
+        path = defpath
+    elif isinstance(path, str):
+        path = path.split(pathsep)
+
+    if pathext is None:
+        pathext = defpathext
+    elif isinstance(pathext, str):
+        pathext = pathext.split(pathsep)
+
+    if not '' in pathext:
+        pathext.insert(0, '') # always check command without extension, even for custom pathext
+
+    for dir in path:
+        basepath = join(dir, file)
+        for ext in pathext:
+            fullpath = basepath + ext
+            if exists(fullpath) and access(fullpath, mode):
+                yield fullpath
+
+def which(file, mode=F_OK | X_OK, path=None, pathext=None):
+    """ Locate a file in a path supplied as a part of the file name,
+        or the user's path, or a supplied path.
+        The function returns full path (not necessarily absolute path),
+        in which the given file name matches an existing file in a directory on the path,
+        or raises IOError(errno.ENOENT).
+
+        >>> # for doctest see which_files()
+    """
+    try:
+        return iter(which_files(file, mode, path, pathext)).next()
+    except StopIteration:
+        try:
+            from errno import ENOENT
+        except ImportError:
+            ENOENT = 2
+        raise IOError(ENOENT, '%s not found' % (mode & X_OK and 'command' or 'file'), file)
+
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
index 90bece8..df825f0 100644 (file)
@@ -254,38 +254,48 @@ class YamlInterpreter(object):
             b = bool(value)
         else:
             b = default
-        return b 
-    
+        return b
+
+    def create_osv_memory_record(self, record, fields):
+        model = self.get_model(record.model)
+        record_dict = self._create_record(model, fields)
+        id_new=model.create(self.cr, self.uid, record_dict, context=self.context)
+        self.id_map[record.id] = int(id_new)
+        return record_dict
+
     def process_record(self, node):
+        import osv
         record, fields = node.items()[0]
-
-        self.validate_xml_id(record.id)
-        if self.isnoupdate(record) and self.mode != 'init':
-            id = self.pool.get('ir.model.data')._update_dummy(self.cr, self.uid, record.model, self.module, record.id)
-            # check if the resource already existed at the last update
-            if id:
-                self.id_map[record] = int(id)
-                return None
-            else:
-                if not self._coerce_bool(record.forcecreate):
+        model = self.get_model(record.model)
+        if isinstance(model, osv.osv.osv_memory):
+            record_dict=self.create_osv_memory_record(record, fields)
+        else:
+            self.validate_xml_id(record.id)
+            if self.isnoupdate(record) and self.mode != 'init':
+                id = self.pool.get('ir.model.data')._update_dummy(self.cr, self.uid, record.model, self.module, record.id)
+                # check if the resource already existed at the last update
+                if id:
+                    self.id_map[record] = int(id)
                     return None
+                else:
+                    if not self._coerce_bool(record.forcecreate):
+                        return None
+
+            record_dict = self._create_record(model, fields)
+            self.logger.debug("RECORD_DICT %s" % record_dict)
+            id = self.pool.get('ir.model.data')._update(self.cr, self.uid, record.model, \
+                    self.module, record_dict, record.id, noupdate=self.isnoupdate(record), mode=self.mode)
+            self.id_map[record.id] = int(id)
+            if config.get('import_partial'):
+                self.cr.commit()
 
-        model = self.get_model(record.model)
-        record_dict = self._create_record(model, fields)
-        self.logger.debug("RECORD_DICT %s" % record_dict)
-        id = self.pool.get('ir.model.data')._update(self.cr, self.uid, record.model, \
-                self.module, record_dict, record.id, noupdate=self.isnoupdate(record), mode=self.mode)
-        self.id_map[record.id] = int(id)
-        if config.get('import_partial', False):
-            self.cr.commit()
-    
     def _create_record(self, model, fields):
         record_dict = {}
         for field_name, expression in fields.items():
             field_value = self._eval_field(model, field_name, expression)
             record_dict[field_name] = field_value
-        return record_dict        
-    
+        return record_dict
+
     def process_ref(self, node, column=None):
         if node.search:
             if node.model:
@@ -307,10 +317,10 @@ class YamlInterpreter(object):
         else:
             value = None
         return value
-    
+
     def process_eval(self, node):
         return eval(node.expression, self.eval_context)
-    
+
     def _eval_field(self, model, field_name, expression):
         # TODO this should be refactored as something like model.get_field() in bin/osv
         if field_name in model._columns:
@@ -390,6 +400,10 @@ class YamlInterpreter(object):
             uid = workflow.uid
         else:
             uid = self.uid
+        self.cr.execute('select distinct signal from wkf_transition')
+        signals=[x['signal'] for x in self.cr.dictfetchall()]
+        if workflow.action not in signals:
+            raise YamlImportException('Incorrect action %s. No such action defined' % workflow.action)
         wf_service = netsvc.LocalService("workflow")
         wf_service.trg_validate(uid, workflow.model, id, workflow.action, self.cr)
     
@@ -528,15 +542,19 @@ class YamlInterpreter(object):
                     'tree_but_open', 'Menuitem', [('ir.ui.menu', int(parent_id))], action, True, True, xml_id=node.id)
 
     def process_act_window(self, node):
+        assert getattr(node, 'id'), "Attribute %s of act_window is empty !" % ('id',)
+        assert getattr(node, 'name'), "Attribute %s of act_window is empty !" % ('name',)
+        assert getattr(node, 'res_model'), "Attribute %s of act_window is empty !" % ('res_model',)
         self.validate_xml_id(node.id)
         view_id = False
         if node.view:
             view_id = self.get_id(node.view)
-        context = eval(node.context, self.eval_context)
-
+        if not node.context:
+            node.context={}
+        context = eval(str(node.context), self.eval_context)
         values = {
             'name': node.name,
-            'type': type or 'ir.actions.act_window',
+            'type': node.type or 'ir.actions.act_window',
             'view_id': view_id,
             'domain': node.domain,
             'context': context,
@@ -566,13 +584,17 @@ class YamlInterpreter(object):
         # TODO add remove ir.model.data
 
     def process_delete(self, node):
-        if len(node.search):
-            ids = self.pool.get(node.model).search(self.cr, self.uid, eval(node.search, self.eval_context))
+        assert getattr(node, 'model'), "Attribute %s of delete tag is empty !" % ('model',)
+        if self.pool.get(node.model):
+            if len(node.search):
+                ids = self.pool.get(node.model).search(self.cr, self.uid, eval(node.search, self.eval_context))
+            else:
+                ids = [self.get_id(node.id)]
+            if len(ids):
+                self.pool.get(node.model).unlink(self.cr, self.uid, ids)
+                self.pool.get('ir.model.data')._unlink(self.cr, self.uid, node.model, ids)
         else:
-            ids = [self.get_id(node.id)]
-        if len(ids):
-            self.pool.get(node.model).unlink(self.cr, self.uid, ids)
-            self.pool.get('ir.model.data')._unlink(self.cr, self.uid, node.model, ids)
+            self.logger.log(logging.TEST, "Record not deleted.")
     
     def process_url(self, node):
         self.validate_xml_id(node.id)
@@ -649,6 +671,8 @@ class YamlInterpreter(object):
         """
         Processes a Yaml string. Custom tags are interpreted by 'process_' instance methods.
         """
+        yaml_tag.add_constructors()
+
         is_preceded_by_comment = False
         for node in yaml.load(yaml_string):
             is_preceded_by_comment = self._log(node, is_preceded_by_comment)
@@ -658,7 +682,7 @@ class YamlInterpreter(object):
                 self.logger.exception(e)
             except Exception, e:
                 self.logger.exception(e)
-                raise e
+                raise
     
     def _process_node(self, node):
         if is_comment(node):
index cdc892d..817f7d5 100644 (file)
@@ -48,9 +48,7 @@ class Workflow(YamlTag):
         super(Workflow, self).__init__(**kwargs)
 
 class ActWindow(YamlTag):
-    def __init__(self, model, action, **kwargs):
-        self.model = model
-        self.action = action
+    def __init__(self, **kwargs):
         super(ActWindow, self).__init__(**kwargs)
 
 class Function(YamlTag):
@@ -67,10 +65,7 @@ class Report(YamlTag):
         super(Report, self).__init__(**kwargs)
 
 class Delete(YamlTag):
-    def __init__(self, model, id, search, **kwargs):
-        self.model = model
-        self.id = id
-        self.search = search
+    def __init__(self, **kwargs):
         super(Delete, self).__init__(**kwargs)
 
 class Context(YamlTag):
@@ -156,17 +151,19 @@ def ir_set_constructor(loader, node):
 # Registers constructors for custom tags.
 # Constructors are actually defined globally: do not redefined them in another
 # class/file/package.  This means that module recorder need import this file.
-yaml.add_constructor(u"!assert", assert_constructor)
-yaml.add_constructor(u"!record", record_constructor)
-yaml.add_constructor(u"!python", python_constructor)
-yaml.add_constructor(u"!menuitem", menuitem_constructor)
-yaml.add_constructor(u"!workflow", workflow_constructor)
-yaml.add_constructor(u"!act_window", act_window_constructor)
-yaml.add_constructor(u"!function", function_constructor)
-yaml.add_constructor(u"!report", report_constructor)
-yaml.add_constructor(u"!context", context_constructor)
-yaml.add_constructor(u"!delete", delete_constructor)
-yaml.add_constructor(u"!url", url_constructor)
-yaml.add_constructor(u"!eval", eval_constructor)
-yaml.add_multi_constructor(u"!ref", ref_constructor)
-yaml.add_constructor(u"!ir_set", ir_set_constructor)
+def add_constructors():
+    yaml.add_constructor(u"!assert", assert_constructor)
+    yaml.add_constructor(u"!record", record_constructor)
+    yaml.add_constructor(u"!python", python_constructor)
+    yaml.add_constructor(u"!menuitem", menuitem_constructor)
+    yaml.add_constructor(u"!workflow", workflow_constructor)
+    yaml.add_constructor(u"!act_window", act_window_constructor)
+    yaml.add_constructor(u"!function", function_constructor)
+    yaml.add_constructor(u"!report", report_constructor)
+    yaml.add_constructor(u"!context", context_constructor)
+    yaml.add_constructor(u"!delete", delete_constructor)
+    yaml.add_constructor(u"!url", url_constructor)
+    yaml.add_constructor(u"!eval", eval_constructor)
+    yaml.add_multi_constructor(u"!ref", ref_constructor)
+    yaml.add_constructor(u"!ir_set", ir_set_constructor)
+add_constructors()
\ No newline at end of file
index 10988ff..9f0ac82 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index a7f111c..453990a 100644 (file)
@@ -9,13 +9,13 @@ msgstr ""
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2009-08-24 22:41+0300\n"
 "PO-Revision-Date: 2009-12-14 06:11+0000\n"
-"Last-Translator: Jordi Esteve - http://www.zikzakmedia.com "
+"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
 "<jesteve@zikzakmedia.com>\n"
 "Language-Team: Catalan <ca@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index f6d691f..c3bfefd 100644 (file)
@@ -7,20 +7,20 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: openerp-server@packages.debian.org\n"
 "POT-Creation-Date: 2009-08-24 22:41+0300\n"
-"PO-Revision-Date: 2009-11-26 07:45+0000\n"
-"Last-Translator: Vitezslav Kotrla <vitezslav.kotrla@gmail.com>\n"
+"PO-Revision-Date: 2010-05-06 04:36+0000\n"
+"Last-Translator: OpenERP Administrators <Unknown>\n"
 "Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:53+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
 #. Description
 #: ../openerp-server.templates:1001
 msgid "Dedicated system account for the Open ERP server:"
-msgstr "Vyhrazený systémový účet, pod kterým bude běžet Open ERP server:"
+msgstr "Vyhrazený systémový účet, pod kterým poběží Open ERP server:"
 
 #. Type: string
 #. Description
index f00efa2..644e67f 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index de7abf0..6e3fd53 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index d3a64eb..27691d9 100644 (file)
@@ -9,13 +9,13 @@ msgstr ""
 "Report-Msgid-Bugs-To: openerp-server@packages.debian.org\n"
 "POT-Creation-Date: 2009-08-24 22:41+0300\n"
 "PO-Revision-Date: 2009-12-14 06:11+0000\n"
-"Last-Translator: Jordi Esteve - http://www.zikzakmedia.com "
+"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
 "<jesteve@zikzakmedia.com>\n"
 "Language-Team: Spanish <debian-l10n-spanish@lists.debian.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index d37e062..093b4b3 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 6a6b682..70dbd05 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 5e6f023..25be4b8 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 258e213..11a5057 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index bf30f6c..e86e982 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index caf3eee..0d6d8cb 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index ef6c4f7..f340f7f 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index cf6443a..7f2cc12 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 592ae4d..a87dcf2 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 62a6e59..497a1a5 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 226ac90..4df9ad5 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index d9e3767..c25c651 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 92cb719..26bc4f9 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 6dbd80b..4822f9f 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 389c912..e56a829 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 38c7d84..be95628 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index a5bf80b..338e0e4 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 "X-Poedit-Language: Swedish\n"
 
index b16df19..0fc44a1 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 0015b61..f6039af 100644 (file)
@@ -14,7 +14,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
index 5073bfd..e0c8dd9 100644 (file)
@@ -13,7 +13,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 03:54+0000\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
 #. Type: string
diff --git a/debian/po/zh_TW.po b/debian/po/zh_TW.po
new file mode 100644 (file)
index 0000000..d75b737
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright (C) 2009 Deng Xiyue <manphiz-guest@users.alioth.debian.org>
+# This file is distributed under the same license as the openerp-server package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-server\n"
+"Report-Msgid-Bugs-To: openerp-server@packages.debian.org\n"
+"POT-Creation-Date: 2009-08-24 22:41+0300\n"
+"PO-Revision-Date: 2010-05-21 04:19+0000\n"
+"Last-Translator: OpenERP Administrators <Unknown>\n"
+"Language-Team: 桃園小白 <hasrhgni@msn.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+"X-Poedit-Country: TAIWAN\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#. Type: string
+#. Description
+#: ../openerp-server.templates:1001
+msgid "Dedicated system account for the Open ERP server:"
+msgstr "Open ERP 專屬系統管理員帳號:"
+
+#. Type: string
+#. Description
+#: ../openerp-server.templates:1001
+msgid ""
+"The Open ERP server must use a dedicated account for its operation so that "
+"the system's security is not compromised by running it with superuser "
+"privileges."
+msgstr "Open ERP 必須指定一個專屬系統管理員帳號來進行操作,如此才不會因最高權限管理者在運行時損毀了系統的安全性。"
+
+#. Type: string
+#. Description
+#: ../openerp-server.templates:1001
+msgid "Please choose that account's username."
+msgstr "請選擇帳號的用戶名稱。"
index 85f3271..3c63a7e 100644 (file)
-2009-12-03: 5.0.7
+2010-05-05: 5.0.10
+==================
+
+Bugfixes (server)
+-----------------
+
+ * Not linked to a bug report:
+   * Server Actions: Cleaner legend help and error message
+   * use of tail text in preprocessor of report engine
+   * added support for missing Persian/Farsi (official language in Iran), with backport of the translations from trunk for base module
+ * https://launchpad.net/bugs/534769
+ * https://launchpad.net/bugs/452854
+   * res_currency: revert to correct rounding mechanism
+ * https://launchpad.net/bugs/540840
+   * Groups if removed, should remove relavent access rights too
+ * https://launchpad.net/bugs/558460
+   * Add the pixmaps and win32 directories in the MANIFEST to have
+ * https://launchpad.net/bugs/559346
+   * Copy() of ir_model_fields corected
+ * https://launchpad.net/bugs/541545
+ * https://launchpad.net/bugs/574394
+   * Workflow : print of workflow should not be broken if there is no flow_stop
+ * https://launchpad.net/bugs/552386
+   * _store_function dictionary should  get updated when field changes its type from function to any other storable
+ * https://launchpad.net/bugs/535559
+   * Illustration tag beahvior corrected
+ * https://launchpad.net/bugs/552457
+   * Raise a detailed exception if the record does not exist in the ir_model_data object
+ * https://launchpad.net/bugs/513278
+   * res_currency: revert to correct rounding mechanism
+ * https://launchpad.net/bugs/564926
+   * _constraints : Multiple constraints on the same field should be allowed
+
+
+Improvements (server)
+---------------------
+
+ * setup.cfg: Improve the setup of the server
+
+
+Bugfixes (addons)
+-----------------
+
+ * Not linked to a bug report:
+   * Remove the bad translation files
+   * Rename the oc_OC translation files to oc_FR
+   * l10n_be: intracom declaration compliancy with Intervat 5.1.0
+   * l10n_be: compliancy of belgian vat declaration with Intervat 5.1.0 (from 05 feb 2010)
+   * account: fixed the onchange partner of bank_statement
+   * audittrail: context={} -> context=None in method signature
+   * audittrail: indentation problems
+   * audittrail: wrong class passed to super
+ * https://launchpad.net/bugs/515590
+ * https://launchpad.net/bugs/552455
+   * Account_analytic_default : Invoice creation from SO corected
+ * https://launchpad.net/bugs/546004
+   * Account : Overdue report corrected
+ * https://launchpad.net/bugs/552519
+   * account_invoice_layout : Added translation entries
+ * https://launchpad.net/bugs/571978
+ * https://launchpad.net/bugs/553881
+   * Account : Added a link to view unreconciled receivables/payables from Invoices
+ * https://launchpad.net/bugs/566185
+   * Remove the unused translation files
+ * https://launchpad.net/bugs/559478
+   * only Grouped field should appear in groupby clause, graph orientation corrected
+ * https://launchpad.net/bugs/570652
+   * Locations when M2O,should not be among view type
+ * https://launchpad.net/bugs/519133
+   * Account : Added centralization check on write() of move line
+ * https://launchpad.net/bugs/532728
+   * sale: UoS qty visible for everyone
+ * https://launchpad.net/bugs/559347
+   * Purchase : Product_uom_change should respect fiscal position related to product_id_change
+ * https://launchpad.net/bugs/570132
+   * Account : code improved for move line creation
+ * https://launchpad.net/bugs/551522
+   * Account : Manual reconcilation should work with the option of Skip Draft Entries of Journal
+ * https://launchpad.net/bugs/539408
+   * Audittrail : Correction made to avoid crash on configuration wizard
+ * https://launchpad.net/bugs/564530
+   * Account : Copying bank statement should not copy move lines
+ * https://launchpad.net/bugs/568537
+   * Account : __compute() optimized a little
+ * https://launchpad.net/bugs/461801
+ * https://launchpad.net/bugs/568436
+   * Purchase : Merge PO should consider fiscal position
+ * https://launchpad.net/bugs/552447
+   * Account : Tax :If type=code,python_compute has to be mandatory;if applicable_type=python_code,python_appliacble has to be mandatory
+ * https://launchpad.net/bugs/561318
+   * Account/Document_ICS/MRP_Operations : datetime.datetime.strptime() replaced by mx.DateTime.strptime()
+ * https://launchpad.net/bugs/559055
+   * account_payment: Remove the duplicated 'bank_id' field in the payment.line tree view
+ * https://launchpad.net/bugs/564779
+   * Mrp_repair : Corrected make invoice process and Quotation report
+ * https://launchpad.net/bugs/557501
+   * Account_Voucher : Correction in creating account.move from voucher
+ * https://launchpad.net/bugs/519034
+   * Sale : progressbar for picking should be set when SO is picked 100%(including its procurement is done)
+ * https://launchpad.net/bugs/569036
+   * mrp_subproduct : Corrected action_confirm method
+ * https://launchpad.net/bugs/562803
+   * Membership : Copy() overridden for setting membership lines blank
+ * https://launchpad.net/bugs/552503
+   * Account : Raising an exception when journal_id is missing
+ * https://launchpad.net/bugs/564486
+   * Base_report_creator : Export method corrected
+ * https://launchpad.net/bugs/532073
+ * https://launchpad.net/bugs/489239
+   * mrp_operations : starting production order should start work order too.
+ * https://launchpad.net/bugs/557373
+ * https://launchpad.net/bugs/515507
+   * Support for ftp_server_host for setting the FTP interface for DMS server,
+ * https://launchpad.net/bugs/535109
+   * Account:
+ * https://launchpad.net/bugs/399817
+ * https://launchpad.net/bugs/452854
+   * account: finish fix of generation of account.move.lines from invoice by providing extension hook
+   * account: corrected move balance check - rounding correctly based on price_accuracy
+ * https://launchpad.net/bugs/570561
+   * Account_payment : Import of move line should include the date of search due date
+ * https://launchpad.net/bugs/567987
+   * Account_analytic_default : Invoice creation from SO corected
+ * https://launchpad.net/bugs/563713
+   * account_analytic_plans : Minor correction on a method to unlink entries
+ * https://launchpad.net/bugs/513278
+   * account: corrected move balance check - rounding correctly based on price_accuracy
+ * https://launchpad.net/bugs/551570
+   * Account_payment : Date will be asked to user while importing payment order into bank statement
+ * https://launchpad.net/bugs/550742
+   * Account : Refund invoice wizard should have current_date as default
+
+
+Improvements (addons)
+---------------------
+
+ * Add the new version of Swiss Localization:
+ * sale: unit tests for bug #461801
+ * sale: warning instead of error in some unit tests
+ * sale: demo tax account type
+ * account: test case for bug #452854
+ * account: renamed test
+ * sale: minor test  changes
+ * Account_followup : Domain improved for an act_window from Partner
+
+
+2010-04-06: 5.0.9
+=================
+
+Bugfixes (server)
+-----------------
+
+ * https://launchpad.net/bugs/556634
+   * By pass a missing field in the translation
+
+
+2010-04-02: 5.0.8
 =================
 
 Bugfixes (server)
 -----------------
 
  * Not linked to a bug report:
+   * res_lang : if value of thousands_sep is not present in language,method will give error- 'moentary' name is not defined [IMP] clear cache of language on write,to be sure to get right value if value of language is changed before cache timeout
+   * bin/tools/convert.py: no need to import time since the eval(domain) is probably going to be removed or wrapped in an exception handler
+   * sql_db: avoid deadlock when releasing leaked cursors
+   * bin/tools/convert.py: reverted revision 2017.1.1: could not eval some strings. Need a dict with uid, active_id, active_ids, ...
+   * bin/tools/convert.py: missing time module
+   * i18n: fr_FR: missing information
+   * In the case we want to generate the RPM package, we change the version
+   * DONT pformat() each RPC request !
+   * reporting: change the way that para style are computed
+   * add cache to res.lang format() function
+   * fixed a bug in copy_data: it now copies the original (not translated) field value as the source value
+   * disabled "code" server action due to the security threat it poses, added --enable-code-actions command-line flag to enable it
+   * only admin can delete ir.property
+   * when deleting ir.property, do not delete the linked field
+   * correct import rng file
+   * 'Partner Manager' group should see the Partner menu
+   * removed python-xml from list of debian packages in doc/INSTALL
+   * remove ubuntu-related pyxml/python-xml hacks from openerp-server.py as pyxml shouldn't be used anywhere anymore
+   * Remove python-xml reference in setup.py
+ * https://launchpad.net/bugs/495948
+   * Corrected language code for Slovenian and Danish locales. Renamed corresponding PO files.
+ * https://launchpad.net/bugs/531430
+   * Remove the default values on the --no-netrpc and --no-xmlrpc
+ * https://launchpad.net/bugs/538399
+   * netrpc: Close the socket if there is a raised exception
+ * https://launchpad.net/bugs/532365
+   * Document : It should be allowed to browse through FTP,disregard to --no-databse-list option
+ * https://launchpad.net/bugs/531026
+   * Exploit Broken : Search  should have checked access rights of read
+ * https://launchpad.net/bugs/513290
+   * Export should honor the current locale(language) settings of the user.
+ * https://launchpad.net/bugs/535551
+   * Uninstalling a board_* module removes dashboard action, but user shuold be allowed to login with default action
+ * https://launchpad.net/bugs/514273
+   * Remove the libxml2 and libxslt dependencies for the packaging
+ * https://launchpad.net/bugs/314973
+   * do not keep connections to template1, template0 and postgres in the connection pool
+ * https://launchpad.net/bugs/544087
+   * Behaviour of fields.related corrected for copy() and write() calls
+ * https://launchpad.net/bugs/551664
+   * Evaluate domain in act_window element is now possible
+ * https://launchpad.net/bugs/528624
+   * Import : Any exception should be raised in well-manner
+ * https://launchpad.net/bugs/543521
+   * Export : Correction made when selection field value if False.
+ * https://launchpad.net/bugs/516568
+   * retro-compatibility: 'obj' is available in ir.action.server code
+ * https://launchpad.net/bugs/380955
+   * setup.py: add the missing librairies for the windows packaging
+ * https://launchpad.net/bugs/497364
+   * base: respect the limit and offset arguments of the search method
+
+
+Improvements (server)
+---------------------
+
+ * sql_db: improve logging
+ * The act_window does not show groups.This adds groups and rearranges the view with a notebook to ensure that the addition of this m2m field doesnt introduce a scroll
+
+
+Bugfixes (addons)
+-----------------
+
+ * Not linked to a bug report:
+   * base_contact: res.partner.job: when partner is set, the address is required. Add onchange on partner and on address.
+   * membership: bugfix + improved inheritance of membership_state field.function
+   * Base_contact : search() of job improved
+   * account_payment: added journal_id field in account.move.line.tree view
+   * Sale : Fiscal position from SO for invoice should be priorly taken from SO rather than Partner's properties
+   * Delivery : Better functional computation of weight based on move
+   * sale: move the product_uos_qty and product_uos fields to the
+   * event: made wizard of invoice creating more flexible (use onchange) + code refactoring
+   * audittrail: Check if the object exists or Not and raise an exception if it's not the case'
+   * hr_timesheet_sheet: Add a default value for the context keyword
+   * Improved mrp_jit smoke test in case the sale config wizard was run before installing mrp_jit. There is a side-effect but it's only on demo databases, and we'll fix this test in trunk when we can write better tests.
+   * account: product_id onchange on invoice lines were returning {} when no product_id was given. This was causing problems in other modules (account_analytic_default, account_analytic_plans) that inherited because of a key error 'value'. It now returns {'value':{}}.
+   * l10n_be: adaptation du module de localisation belge conformément à la nouvelle législation TVA pour les services intracom
+   * event: invoice creation from registrations
+   * purchase: security file update: added rights for manager. Fixed rights for user
+ * https://launchpad.net/bugs/524521
+   * Account : USer will be notified for unreconciling partial reconcilatins if he tries to cancel the invoice
+ * https://launchpad.net/bugs/540128
+ * https://launchpad.net/bugs/535098
+   * Account : Only those accounts are eligible to be Parents which have type=View
+ * https://launchpad.net/bugs/552455
+   * Sale : Make Invoice wizard should only create invoice for uninvoiced lines
+ * https://launchpad.net/bugs/528889
+   * Account : name_search() of account.tax.code overridden for better search
+ * https://launchpad.net/bugs/519220
+   * Delivery : Proper Weight calculation of stock picking
+ * https://launchpad.net/bugs/535058
+   * Purchase : Seperate packign should not be created if chained locations are used
+ * https://launchpad.net/bugs/545032
+   * Stock : Invoice from Stock should respect context for translations.
+   * stock: context lost in invoice wizard
+ * https://launchpad.net/bugs/530081
+   * Sale : Sale order's Invoice should have invoice reference of customer Invoice
+ * https://launchpad.net/bugs/545868
+   * Sale_crm : proper options set on wizard makesale
+ * https://launchpad.net/bugs/467880
+   * MRP : stock.warehouse.orderpoint for qty_multiple check of 0
+ * https://launchpad.net/bugs/544287
+   * Invoice object's Partner onchange had wrong parameter
+ * https://launchpad.net/bugs/535655
+   * Base_setup : Better display of Currency selection(Name + Code)
+ * https://launchpad.net/bugs/532728
+   * sale: Remove the product.group_uos group on the product_uos and product_uos_qty fields.
+ * https://launchpad.net/bugs/540443
+   * Sale : Fiscal position value has to be passed when Invoice is created from SO
+ * https://launchpad.net/bugs/532673
+   * delivery: replace 'id' with active_id in passing context of order(takes built in function id in webclient).
+ * https://launchpad.net/bugs/528871
+   * Account : Dupliacting tax code should not copy move lines
+ * https://launchpad.net/bugs/539707
+ * https://launchpad.net/bugs/514273
+   * Base_report_designer : Replaced libxslt/libxsml2 code by lxml
+ * https://launchpad.net/bugs/540946
+   * Hr_holidays : Constraint corrected for Holidays request(start date cannot be greater than end date)
+ * https://launchpad.net/bugs/548494
+   * Account : Account should not be removed/deactivated if it is linked to any property/partner
+ * https://launchpad.net/bugs/418080
+   * Document : Browse__files_using_ftp wizard corrected
+ * https://launchpad.net/bugs/541006
+   * MRP/Purchase : Seller delay has to be converted into integer for date calculations.
+ * https://launchpad.net/bugs/528978
+ * https://launchpad.net/bugs/528929
+   * Account : Tax code tree view should have company.
+ * https://launchpad.net/bugs/552461
+   * Scrum : Burndown chart was crashing when a taskwork entry is without date
+ * https://launchpad.net/bugs/553168
+   * Account : Journal's name_search() did not use context well
+ * https://launchpad.net/bugs/494352
+   * Sale : account_invoice_end() corrected/optimized so that it does not create any regression of duplicated pickings for SO
+ * https://launchpad.net/bugs/531238
+   * improved regression tests in sale and mrp_jit modules to test separately auto-chained locations. (bug 531238)
+   * mrp: use correct location chaining by calling action_confirm() on stock move instead of directly writing the status (bug 531238).
+ * https://launchpad.net/bugs/540151
+   * Event : Notify user before sending an email on confirming event
+ * https://launchpad.net/bugs/542379
+   * Account : Terp file had duplicated author,depends keys
+ * https://launchpad.net/bugs/539073
+   * account_date_check: If the date of the move line, is not in the
+ * https://launchpad.net/bugs/532073
+ * https://launchpad.net/bugs/526081
+   * MRP : Ondelete=cascade applied to important fields of stock.warehouse.orderpoint
+ * https://launchpad.net/bugs/535642
+   * Stock : Unlink() of Move corrected
+   * Stock :Picking removal should remove moves too
+ * https://launchpad.net/bugs/506431
+   * Use the file name instead of the content
+ * https://launchpad.net/bugs/531638
+   * Sale_crm : Code improved for partner onchange to take effect on SO
+ * https://launchpad.net/bugs/530926
+   * Account : Invoice group was missing access rights for tax and tax code
+ * https://launchpad.net/bugs/531416
+ * https://launchpad.net/bugs/535601
+   * Account : Proper query generation for computing debit.credit,balance
+ * https://launchpad.net/bugs/532365
+   * Document : It should be allowed to browse through FTP,disregard to --no-databse-list option
+ * https://launchpad.net/bugs/399817
+   * Sale : Cancelled partial packing should affect Sale order's Shipped field
+ * https://launchpad.net/bugs/538064
+   * Sale : Translations for RML texts entered into po/pot
+ * https://launchpad.net/bugs/531479
+   * Stock : drop view check added for stock_report_prodlots
+ * https://launchpad.net/bugs/504353
+   * Product : Conversion from unmatched categorized UoM now raises exception
+ * https://launchpad.net/bugs/532716
+   * MRP : Split production wizard corrected
+ * https://launchpad.net/bugs/538419
+
+
+Improvements (addons)
+---------------------
+
+ * base_contact: res.partner.address: use domain instead of value in context
+ * Stock :Layout for  Moves under Picking Improved
+ * Account : Fiscalyear and Period now have name_search
+ * Product : Duplicated demo data corrected
+ * purchase: moved smoke test into separate test dir and renamed demo data for consistency with sale/mrp smoke tests
+ * l10n_be: attribution de nouveaux codes plus explicites pour les taxes
+ * Account_voucher : Accounting entries should only be available for non-view accounts
+ * Account : Better view of Reconciled and Partially Reconciled entried with Entry Lines
+ * Account : Setting tax code name translateable (to be consistent with tax name)
+
+
+2010-03-01: 5.0.7
+=================
+
+Bugfixes (server)
+-----------------
+
+ * Not linked to a bug report:
+   * --smtp-ssl is not a dependent on the server ssl mode
+   * bug:504718
+   * orm: ensure the cursor is valid before computing parent_store values
+   * correct ustr. avoid a crash if getlocale() return None
+   * Fields.function : if store={}/True is removed,column should be dropped with cascaded effect
+   * Base.sql : added relation field column to ir_model_feilds
+   * Fields : relational field was not getting written to ir_model_fields,in case of one2many
+   * allow to create menu executing ir.actions.server
+   * orm: bug when browsing _inherits object
+   * Search made working for function/related fields with store=True/{...} or fnct_search=method
+   * _inherits table may delete the record which is parental to other object but not required.
+   * remove the lock on database connections
+   * correct threading problems in cache
+   * Server Action : Email can be sent with non-English characters now
+   * quality_integration_server: if db exits, db should removed on database creation
+   * Currency : Rounding improved
+   * Importation when fails,needs cursor to be rolled back
+   * handle the case of missing "#:" formated comment in po files
+   * custom report xml creation
+   * better locking when accessing to template1 database
+   * remove minidom from report/custom, replace with lxml
+   * leftover call to minidom in ps_form even though minidom isn't imported there anymore
+   * Remove leftover instances of libxslt and libxml2, replace them by lxml
+   * hang in OSX when trying to shutdown server via SIGINT
+   * set absolute path for the config file to avoid the save() method breaking on single file, since os.path.exists('') returns false and you can't create the current directory
+   * quality_integration_server: fixed problem in make link
    * translation: modify msg id where it contains python code in translations po files
    * use env for python shebang rather than hardcoding /usr/bin/python
    * base: wrong fr_FR translation for 'Delete Permission'
@@ -32,65 +407,188 @@ Bugfixes (server)
    * recursive child_of on one2many and many2many
    * default context
  * https://launchpad.net/bugs/463415
- * https://launchpad.net/bugs/490604
-   * RAW reports creation corrected
+ * https://launchpad.net/bugs/525962
+   * Ir_model : Made an offensive check of context
  * https://launchpad.net/bugs/430133
    * Name_search() is having now record limit to be 80 instead of None
- * https://launchpad.net/bugs/434341
-   * Export : Selection field gets imported by its external name  if export is not import compatible
+ * https://launchpad.net/bugs/407667
+   * Allowed SQL reserved keywords to be used in _order,group by ,etc.[Make sure , your _order should look like _order='to' instead of to]
+ * https://launchpad.net/bugs/495636
+   * Warning for reports for header attributes used in .py
+ * https://launchpad.net/bugs/523071
+   * Default_get : fields of _inherits for default values should be considered
+ * https://launchpad.net/bugs/493548
+   * Ir_actions : Unicode error corrected
+ * https://launchpad.net/bugs/409354
+   * Browse with _inherits issue fixed  if more than one M2O to parent objct exists
+ * https://launchpad.net/bugs/430805
+   * Import made successful when field is O2M and it has relation under that.
+ * https://launchpad.net/bugs/462506
+   * Priority on fields.function with store dictionary made working.
+ * https://launchpad.net/bugs/483527
+ * https://launchpad.net/bugs/373176
+   * Behavior of server corrected if addons-path is wrong
  * https://launchpad.net/bugs/489355
    * fields: '_fnct_write' should pass context object to the 'write' method
+ * https://launchpad.net/bugs/491867
+   * revert bad fix
+   * fields.related were misbehaving
+ * https://launchpad.net/bugs/433886
+   * Update Module : Float8 to float and numeric to float casting made possible
  * https://launchpad.net/bugs/410191
    * Record rule : domain evaluation problem corrected
- * https://launchpad.net/bugs/420507
-   * Domain was getting failed when trying to work upon M2M,O2M field of object
+ * https://launchpad.net/bugs/519468
+   * Fields : Only one2many fields can have relation_field,avoid checks for others
+ * https://launchpad.net/bugs/523971
+   * Missing imports of _ of tools.translate provided
+ * https://launchpad.net/bugs/500571
+   * Record Rules : domain_force made working
+ * https://launchpad.net/bugs/519204
+   * Base : Country can be searched on Country codes independent to case
+ * https://launchpad.net/bugs/493545
+   * Allowed <notebook> to be added into an inherited view(under field)
+ * https://launchpad.net/bugs/456978
+   * O2M should check existing relations for its concerned M2O
+ * https://launchpad.net/bugs/522227
+   * Fixed error notification on parent_store=true with a column without ondelete=cascade
+ * https://launchpad.net/bugs/516030
+   * Export translations + Cache on translations + Resynchronization wizard Corrections
+ * https://launchpad.net/bugs/430728
+   * Allowing sql keywords as fields(don't use them in order by clause)
+ * https://launchpad.net/bugs/480782
+ * https://launchpad.net/bugs/524588
+   * translate: error with workaround about \xa0 in decimal_point and thousands_sep
  * https://launchpad.net/bugs/453269
+   * Amount_To_Text Corrected
    * Amount to text conversions made better
- * https://launchpad.net/bugs/488234
-   * connection pool when database password is provided (thanks to Syleam Crew)
- * https://launchpad.net/bugs/430805
-   * Import made successful when field is O2M and it has relation under that.
+ * https://launchpad.net/bugs/490604
+   * RAW reports creation corrected
+ * https://launchpad.net/bugs/425350
+   * Menu attribute to report/wizard/url made behaving correctly
+ * https://launchpad.net/bugs/504584
+ * https://launchpad.net/bugs/495948
+   * Corrected language code for Slovenian and Danish locales. Renamed corresponding PO files.
  * https://launchpad.net/bugs/480301
    * M2M : values filtering on set()
- * https://launchpad.net/bugs/462506
-   * Priority on fields.function with store dictionary made working.
- * https://launchpad.net/bugs/433886
-   * Update Module : Float8 to float and numeric to float casting made possible
+ * https://launchpad.net/bugs/503278
+   * Search : searching translated fields made possible(related,one2many,many2many)
+ * https://launchpad.net/bugs/504243
+ * https://launchpad.net/bugs/490125
+   * Custom fields should be removed from _columns too
+ * https://launchpad.net/bugs/490337
+   * Corrections made when removing a module and updating the module database:                                                                    Entry from ir_model_data should also be removed when moudle is removed
+ * https://launchpad.net/bugs/496433
+   * Server Action: Help message of Legend corrected
+ * https://launchpad.net/bugs/417023
+   * Installation should alert user if any no pool record found for M2M/M2O.
+ * https://launchpad.net/bugs/493657
+   * Custom fields won't disturb anything while updating server
+ * https://launchpad.net/bugs/435933
+   * Encoding error corrected for client_action(ir_values-tree view)
+ * https://launchpad.net/bugs/514231
+   * M2O : Unfair behavior of M2O for access denial records and normal ones(All records were hidden by access denied if one had failed to meet access rights).
+ * https://launchpad.net/bugs/499501
+   * Report : Proper Message notification when RML file is not found
+ * https://launchpad.net/bugs/523762
+   * Expression.py corrected when M2O search returns no IDs
+ * https://launchpad.net/bugs/420507
+   * Domain was getting failed when trying to work upon M2M,O2M field of object
+ * https://launchpad.net/bugs/523123
+   * Not allowing Duplicate shortcuts
+ * https://launchpad.net/bugs/516469
+   * Wizard should raise exception to user when writte inside 'choice' type
+ * https://launchpad.net/bugs/488234
+   * connection pool when database password is provided (thanks to Syleam Crew)
  * https://launchpad.net/bugs/491365
    * Translation: Error parsing .po files when application puts comments in a single line
- * https://launchpad.net/bugs/460560
-   * Ir_attachment : Context updation corrected on preview
+ * https://launchpad.net/bugs/433395
+ * https://launchpad.net/bugs/462285
+   * Remove the useless cr.commit() in the get_id() method of the ir.sequence object
  * https://launchpad.net/bugs/356628
    * allow related fields to point to one2many and many2many fields
- * https://launchpad.net/bugs/483527
- * https://launchpad.net/bugs/435933
-   * Encoding error corrected for client_action(ir_values-tree view)
- * https://launchpad.net/bugs/430728
-   * Allowing sql keywords as fields(don't use them in order by clause)
+ * https://launchpad.net/bugs/460560
+   * Ir_attachment : Context updation corrected on preview
+ * https://launchpad.net/bugs/437729
+   * Export Translation : Warning on Non-existing record instead of breaking flow
+ * https://launchpad.net/bugs/503445
+   * Partner : Name_get() of res.partner.address corrected
+ * https://launchpad.net/bugs/445252
+   * Translation was not getting inserted to DB on write()
+ * https://launchpad.net/bugs/497364
+   * revert previous patch about linked bug (lp:497364)
+   * Menu : Search method corrected for the non-Admin user
+ * https://launchpad.net/bugs/434341
+   * Export : Selection field gets imported by its external name  if export is not import compatible
+ * https://launchpad.net/bugs/489573
+   * Manual object and field creation with searchable
+ * https://launchpad.net/bugs/520854
+ * https://launchpad.net/bugs/449516
+   * Warning raised for server action with SMS facility
+ * https://launchpad.net/bugs/519699
+   * Export translations: module name from path calculations corrected
+ * https://launchpad.net/bugs/516965
+   * User / Preferences should always display translatable languages.
+ * https://launchpad.net/bugs/516964
+   * default_FIELD from context should not overwrite modified FIELD value while creating record
+ * https://launchpad.net/bugs/516044
+   * Graph : report corrected
+ * https://launchpad.net/bugs/516962
+   * modifying a cron from client make it run concurrently multiple times
+ * https://launchpad.net/bugs/447819
+   * Ir_values : reading of default values correted
+ * https://launchpad.net/bugs/510600
+   * Import should raise an uncaught exception if not identified
+ * https://launchpad.net/bugs/413121
+   * Related with O2M behavior corrected
  * https://launchpad.net/bugs/487836
    * Custom Object xml arch needed encoding.
+ * https://launchpad.net/bugs/516969
  * https://launchpad.net/bugs/487723
    * Module informtion was not getting updated on upgrading module
- * https://launchpad.net/bugs/480782
+ * https://launchpad.net/bugs/372747
+   * Disable the cache for the ir.rules
  * https://launchpad.net/bugs/478724
    * Export : M2M field name was missing last character
- * https://launchpad.net/bugs/437729
-   * Export Translation : Warning on Non-existing record instead of breaking flow
+ * https://launchpad.net/bugs/497423
+   * FormatLang : Dates if specified into String,will be formatted into language-specific format
  * https://launchpad.net/bugs/429519
- * https://launchpad.net/bugs/433395
  * https://launchpad.net/bugs/479915
    * Added lxml as required module on setup
+ * https://launchpad.net/bugs/495374
+   * Partner : titlee can have a choice to be null
+ * https://launchpad.net/bugs/509629
+   * Expression : Domain calculation of M2M/O2M corrected
+ * https://launchpad.net/bugs/504720
+ * https://launchpad.net/bugs/516568
+   * Server Actions: evaluating dict corrected
+ * https://launchpad.net/bugs/512682
+   * avoid sql injection in sequences
  * https://launchpad.net/bugs/400614
    * Use an alternative for the locale.RADIXCHAR if this one doesn't exist
  * https://launchpad.net/bugs/491462
    * Pickling issue solved with ir_values (get method)
+ * https://launchpad.net/bugs/507429
+   * Encoding problm corrected on report contents
+   * If RML contains unicode characters and title in the same <para>,it would have failed.
 
 
 Improvements (server)
 ---------------------
 
+ * orm: allow import and record creation to defer the computation of parent_left/right
+ * orm: do not update parent_left/right if the parent haven't been changed
+ * Licensing options : Added AGPL-3 and others in choices
+ * Groups : Better duplication terminology.
+ * sql_db: better logging
+ * osv: log (in debug) access errors
+ * web_service: remove log (debug) when creating database
+ * exported method check_connectivity
+ * Sequence : Legend improved to help user understand the usage of %(year)s
+ * remove useless comment
+ * Launchpad export translation files
+ * removal of usages of the deprecated node.getchildren call, better usage of the attributes & tostring ET APIs, style fixes
+ * improve usage of the ET API, use SubElement instead of Element/append, kwarg attributes setting instead of node.set
  * add option to disable the database listing
- * sql_log
  * quality_integration_server: added net_port option in script
  * better connection pool (global)
  * ir_cron : added active feild on list view
@@ -101,18 +599,75 @@ Improvements (server)
  * base_quality_interrrogation: put message if the score of quality less then minimal and remove unit test condition
  * quality_integration_server: quality log : add new option to specify qualitylog path to store html pages of log
  * default value for module
+ * updated changelog file for 5.0.6 release
 
 
 Bugfixes (addons)
 -----------------
 
  * Not linked to a bug report:
+   * event: make invoice wizard now creates invoice line with better label
+   * membership:
+   * Sale : Onchange of product/qty corrected when uos is present.Product: Help corrected for uom to uos conversion.
+   * Remove the bad translation files
+   * membership: membership amount field corect name of digits in field defination
+   * audittrail: correct dependencies
+   * audittrail: ensure cursor is closed
+   * invoice: translate the product description only if partner's language is set.
+   * account: avoid a traceback if credit/debit/balance sum can be computed
+   * mrp: fixed demo data when default_code is overridded in a custom module
+   * crm: removed debugging code
+   * document: fixed problem on window on filezilla
+   * sale_crm: CRM->Opportunities: 'convert to quote' now sets the salesman from the partner (or the user if there is none)
+   * sale: onchange on partner_id now set the partner's dedicated salesman as the sale salesman or the user if there is no dedicated salesman on that partner
+   * base_contact: search for a contact in a contact job now searches in firstname and lastname
+   * product: pricelist: ondelete cascade to avoid errors when deleting pricelists and versions ('null value in column "price_version_id" violates not-null constraint')
+   * sale_delivery_report: production lot reference was missing
+   * sale: onchange on partner_id now set the partner's dedicated salesman as the sale salesman
+   * sale_delivery_report: typo in french translation file
+   * Analytic_user_function : Corrected the  Wrong way call to the  method of product.uom
+   * base_contact: search in "Contact's Jobs" now also search in firstname and lastname of contacts
+   * Base_report_creator : ilike query generation problem corrected
+   * account: At the time of invoice cancel it will remove partial reconcile id from entry
+   * Account: Bank statement line,if has write-off entries,should pass write off account to move line
+   * account: set correct journal while opening customer and supplier invoices and refunds
+   * fix a prolem for the wiki content for the indexing
+   * product: Now pricelist objects price get function will pass context to price_get method of product and compute method of currency object
+   * base_module_quality: add import statment for _ and give size to name field on save report wizard so that it can display long name also
+   * Account : Wrong residual amount comes if company currency and invoice currency are different(provided no currency defined on journal)
+   * account: wizard of fiscal year closing fixed: the entries of all previous fiscal years have to be deffered, not only the last one
+   * l10n_be: fixed data of l10n_be module
+   * Analytic account report corrected
+   * Account_Voucher : Reports corrected
+   * Sale_CRM : write() was sending wrong data
+   * MRP : Accounting Entries were duplicated when processing production order with accounting configuration for locations.
+   * base_contact: domain problem on job object
+   * project: extra info tab of task view shouldn't be readonly if the task'state is 'draft'
+   * account_followup: the followup level of a partner which was removed from the proposed partner to remind was still raised although we didn't select him.
+   * change class names for all model in voucher from Account = account_account
+   * Base_report_creator : Wizard is available only for custom query,not for the custom result
+   * Point_of_sale : Receipt report corrected
+   * Account_tax_include : improvements when invoice lines are created prior to invoice
+   * Account_tax_include : Minor modif
+   * account_analytic_plans: analytic distribution are now created on invoice line when confirming sale orders (if a line is matching account analytic default rule)
+   * account: partial reconciliation check was wrongly computed
+   * base_module_quality: get_ids method problem
+   * account: no need to do a call to 'translate', method '_' is sufficient.
+   * base_module_quality: solve translate string error
+   * Stock: Moves have no state 'auto',its 'waiting'
+   * base_module_record second range problem when second is 59
+   * Project_timesheet : Removal of task with task work should affect Analytic lines
+   * Track Incoming / Outgoing products:
+   * account_analytic_default: add stock dependancy
+   * removed print statement
+   * picked in SO
    * Project : remove unused import causing a DeprecationWarning under Python 2.6
    * l10n_be: corrected internal type of vat account in l10n_be: set other instead of payable/receivable
    * Hr_timesheet_sheet : setting type=workflow to 2 buttons
    * Account: text made translatable
-   * Stock : Added Product UoS to the Stock Move view
    * fix the problem of menus uring installation
+   * Regression in SO from Jeroen and Jay, picked state see bug #491375
+   * Stock : Added Product UoS to the Stock Move view
    * Base_contact : Making Email field of address visible on Address form view
    * Stock : Added translations
    * Account_invoice_layout : Reports improved and SXWs made compatible to RML
@@ -148,177 +703,376 @@ Bugfixes (addons)
    * set the access right
    * base_module_quality: speed test if read method has exception
    * account_analytic_plans: avoid encoding errors
- * https://launchpad.net/bugs/458415
-   * document_ics : solved accent problem
+ * https://launchpad.net/bugs/528289
+   * membership: printing report crashes on graph view
+ * https://launchpad.net/bugs/522696
+   * Stock : Split moves wizard should respect current language
+ * https://launchpad.net/bugs/528281
+   * membership: membership state not correctly updated with associated partner
+ * https://launchpad.net/bugs/524425
+ * https://launchpad.net/bugs/416810
+   * Document: attachment linked with Files
+ * https://launchpad.net/bugs/470359
+ * https://launchpad.net/bugs/438725
+   * Purchase : Setting the value of payment term while creatying invoice from PO
+ * https://launchpad.net/bugs/492793
+   * Project_gtd : Improved fields_view_get() andmade it compatible to stable
+ * https://launchpad.net/bugs/525314
+   * membership: membership date from and to required now on product form
+ * https://launchpad.net/bugs/453030
+   * Avoid display write-off in pay invoice wizard : take care of partial payment
+   * Avoid display write-off in pay invoice wizard. Put the right date and currency for conversion
+ * https://launchpad.net/bugs/448591
+   * Account : Refund wizard wasnt calculating taxes for new invoices
+ * https://launchpad.net/bugs/489241
+   * mrp_operations : work order calculation corrected
+ * https://launchpad.net/bugs/493704
+   * Small stock tracking problem
+ * https://launchpad.net/bugs/518914
+   * Unable to validate supplier invoice/refund with reference greater than 32 characters. The reference is used as reference for the move lines and the analytic account line but the reference of these objects are limited to 32 characters, raising an sql error. It also broke the workflow of the invoice.
+ * https://launchpad.net/bugs/481130
+   * Stock: Shipping Address has to be in.po/.pot
+ * https://launchpad.net/bugs/427869
+   * Residual amount in invoice when currency rating change
+ * https://launchpad.net/bugs/474337
+   * [CRITICAL] warning : missing import statement for "_"
+ * https://launchpad.net/bugs/513983
+   * Sale : Order lines should be not editable for non-draft SO.
+ * https://launchpad.net/bugs/433898
+   * fix a problem Point of sale create outgoing shipments incl. service items
+ * https://launchpad.net/bugs/516746
+   * Account : Bank statements should not be altered/removed when state is confirmed
+ * https://launchpad.net/bugs/445267
+   * Mrp_subproduct : Wrong calculation of QTYs corrected(Product qty,UOS qty)
+ * https://launchpad.net/bugs/496889
+   * Account : wizard_pay_invoice corrected (Check made to calculate only receivable,payable lines)
+   * Account: Better calculation of invoice amount
+ * https://launchpad.net/bugs/428926
+   * account_payment when importing payment lines (currency not set correctly)
+ * https://launchpad.net/bugs/502984
+   * Hr_holidays: leaves' calculation corrected on removal of leaves
+ * https://launchpad.net/bugs/434628
+   * Account : In bank statements,Move Lines should be imported only once
+ * https://launchpad.net/bugs/503741
+   * Purchase : Purchase/user was missing account.tax access rights
+ * https://launchpad.net/bugs/457188
+   * Account_analytic_analysis : Summary of Months calculation Corrected
+ * https://launchpad.net/bugs/528292
+   * membership: membership cancel date is not updated
+ * https://launchpad.net/bugs/351083
+   * Account : Partner Balance report gets printed with respect to the company selected
+ * https://launchpad.net/bugs/497365
+   * Account : Supplier Invoices new record creation corrected for web client
+ * https://launchpad.net/bugs/435298
+   * Subscription : Disallowed to change the Object linked to the document type.
+ * https://launchpad.net/bugs/490883
+   * MRP: Proper context value passed for PO creation from packing via SO
+ * https://launchpad.net/bugs/479886
+   * Account : Total field on supplier invoice set to 0.0 to amke it Web-client compatible
+ * https://launchpad.net/bugs/398562
+   * MRP : Accounting Entries were duplicated when processing production order with accounting configuration for locations.
+ * https://launchpad.net/bugs/445547
+   * Stock: Picking report correction
+ * https://launchpad.net/bugs/507694
+   * Properly cancel a draft purchase.order when unlinking it, so correct workflow signals can be propagated to parent workflows if there are any.
+ * https://launchpad.net/bugs/460924
+   * Stock : force_assign won't create duplicate entries
+ * https://launchpad.net/bugs/516100
+   * Account : Invoice line should display complete name of product from the onchange
+   * Stock : Onchange corrected to have an effect of translations
+ * https://launchpad.net/bugs/492174
+   * Base_report_creator : encoding eror corrected on adding filters
+ * https://launchpad.net/bugs/446205
+   * CRM : Mailgate script has host as parameter now onwards
+ * https://launchpad.net/bugs/501625
+   * Account : General Ledger report in Landscape made transltable
+ * https://launchpad.net/bugs/440557
+   * Purchase : POL had a wrong tree view which is unused till now
+ * https://launchpad.net/bugs/452854
+   * Correct the validate function for balanced move into account.py (after Fabien Warning)
+   * Use price_accuracy to verify balanced entry insteed of fixed '0,0001'. Add price_accuracy on debit and credit move lines
+ * https://launchpad.net/bugs/522532
+   * Stock : Priority assigned to stock.location list view
+ * https://launchpad.net/bugs/522629
+ * https://launchpad.net/bugs/480035
+   * CRM : action name improved
+ * https://launchpad.net/bugs/439469
+   * Product : Pricelist types getting translated on Pricelist
+ * https://launchpad.net/bugs/512682
+   * avoid sql injection in sequences
+ * https://launchpad.net/bugs/476343
  * https://launchpad.net/bugs/447402
    * Project_timesheet : Wrong synchro on analytic line creation fro tasks(for name).
  * https://launchpad.net/bugs/490318
    * Account : Ondelete=cascade added to bank statement line
- * https://launchpad.net/bugs/446520
-   * [account_followup] wrong sender for email
- * https://launchpad.net/bugs/454536
-   * Warning : Onchange Methods were malfunctioned.Corrected and made messages available for translations
- * https://launchpad.net/bugs/450180
-   * Hr_timesheet_invoice : Wrong domain was sent for opening invoices created
- * https://launchpad.net/bugs/383057
-   * Stock-MRP : Split production wizard made individual to mrp if mrp is not installed
+ * https://launchpad.net/bugs/459027
+   * Sale : SOL's subtotal was missign price-accuracy
+ * https://launchpad.net/bugs/509496
+   * Account_tax_include : Refund of invioce was not counting price_type.
+ * https://launchpad.net/bugs/366944
+   * Base_vat : Spanish numbers validation corrected
  * https://launchpad.net/bugs/488869
    * Stock/MRP : Track line wizard improved
- * https://launchpad.net/bugs/446681
-   * Account : Refund wuzard malfunctioned with modify invoice option
- * https://launchpad.net/bugs/446391
-   * Base_report_creator : Allowing to use current userid
- * https://launchpad.net/bugs/479747
- * https://launchpad.net/bugs/470359
- * https://launchpad.net/bugs/460701
-   * Document : Attachment with document can now be deleted
- * https://launchpad.net/bugs/439469
-   * Product : Pricelist types getting translated on Pricelist
- * https://launchpad.net/bugs/489355
-   * account, invoice, sale: description (product sold, invoice line and account entry line) was not translated
- * https://launchpad.net/bugs/435160
-   * [IMP] Correct write-off date, add analytic account, better interface between all way to reconcile
+ * https://launchpad.net/bugs/474340
+   * Stock : Wizard improvements from Lionel
+ * https://launchpad.net/bugs/445306
+   * document: put warning message in module descrition regarding lost files which are exits before installing document
+ * https://launchpad.net/bugs/491867
+   * base_contact: fix bad related field
  * https://launchpad.net/bugs/481524
    * Stock : Forecast report: unicode error corrected
- * https://launchpad.net/bugs/458553
-   * Account : Onchange of amount/base amount of Invocie tax corrected
+ * https://launchpad.net/bugs/493369
+   * Hr_attendance : Sign out entries were not possible when we 'change work'
  * https://launchpad.net/bugs/438705
    * Stock : Stock move lines on Production Order well-structured
- * https://launchpad.net/bugs/441609
-   * Account : Fiscal Position Template was missing a requireed field in form view
+ * https://launchpad.net/bugs/500096
+   * Base_report_creator : Support of count(*) added
+ * https://launchpad.net/bugs/521106
+   * Account : Analytic charts of accounts was raising exception on displaying chart
+ * https://launchpad.net/bugs/464578
+   * project_timesheet: analytic entries are fully not updated, when changing task project
+ * https://launchpad.net/bugs/483583
+   * Sale/Purcghase : Function fields did not have digits attribute for precision accuracy
+ * https://launchpad.net/bugs/461720
+   * Scrum : Wrong view,widgetless fields on scrum view made correct
+ * https://launchpad.net/bugs/491898
+   * Purchase : Fields set readonly on done state
+ * https://launchpad.net/bugs/480856
+   * Warning : the super of onchange may return {},covered the same
+ * https://launchpad.net/bugs/496898
+   * Account : Fields were missing in Account chart template form view
+ * https://launchpad.net/bugs/502065
+   * Stock : Product Packaging field was missing domain
+ * https://launchpad.net/bugs/351167
+ * https://launchpad.net/bugs/459196
+   * Account : Partner Ledger Report formatting problem solved
+ * https://launchpad.net/bugs/465010
+   * Stock : Notification Message made translatable
+ * https://launchpad.net/bugs/491892
+   * Reconcilation problem corrected when foreign currency rate changes
+ * https://launchpad.net/bugs/504781
+   * Project : Task delegation was calling write() wrongly
+ * https://launchpad.net/bugs/494245
+   * Services product included on BOM now creates a task on Project
+ * https://launchpad.net/bugs/475135
+   * Account : Warning message was missing _ import
  * https://launchpad.net/bugs/467880
    * MRP : Procurement can only be confirmed when qty>0.0
- * https://launchpad.net/bugs/486783
-   * Point_of_sale : Report for Reciept corrected
- * https://launchpad.net/bugs/448591
-   * Account : Refund wizard wasnt calculating taxes for new invoices
- * https://launchpad.net/bugs/395160
-   * Project_timesheet : Analytic line creation/edition takes user based information
- * https://launchpad.net/bugs/436008
-   * Sale: Passing Contact address for invoices from SO
- * https://launchpad.net/bugs/428926
-   * account_payment when importing payment lines (currency not set correctly)
+ * https://launchpad.net/bugs/401801
+   * Sale/Purchase : Worfklow instance had to ve removed while setting record's workflow back to draft state
+ * https://launchpad.net/bugs/449583
+   * Sale : Better error message when account is missing from SOL for Invioce
  * https://launchpad.net/bugs/439041
    * Report_project :wrong average of closing days counting
+ * https://launchpad.net/bugs/517018
+ * https://launchpad.net/bugs/487641
+   * Purchase : MOQ-pricing problem corrected
+ * https://launchpad.net/bugs/500062
+   * Account : On Confirming the statement, Moves shoould have the bank statement line date
+ * https://launchpad.net/bugs/525229
+   * call fields_view_get with not specify the context raise an exception on product with stock module installed
+ * https://launchpad.net/bugs/441609
+   * Account : Fiscal Position Template was missing a requireed field in form view
+ * https://launchpad.net/bugs/483723
+   * CRM : Case form view priority issue resolved
+ * https://launchpad.net/bugs/440734
+   * Stock : Picking did not have 'type' field on display(inconsistent behavior from eTiny,koo) to work upon domain.
+ * https://launchpad.net/bugs/419720
+   * Sale : Delivery Date delay computation made corrected when days are passed with fractions
+ * https://launchpad.net/bugs/439208
+   * Hr_timesheet : Allowing user to enter Analytic Journal if not linked with employee(Working hours tree view)
+ * https://launchpad.net/bugs/379118
+   * Stock : Partial Picking wizard was making the back order reference jump to 2 numbers,notification given on packing done.
+ * https://launchpad.net/bugs/526930
+   * Account : act_link added for better options of viewing move lines from partner
+   * Account : act_link from partners for account entries should contain only receivable/payable accounts
+ * https://launchpad.net/bugs/526417
+   * Sale_delivery_report : Report corrected
+ * https://launchpad.net/bugs/450180
+   * Hr_timesheet_invoice : Wrong domain was sent for opening invoices created
+ * https://launchpad.net/bugs/446391
+   * Base_report_creator : Allowing to use current userid
+ * https://launchpad.net/bugs/519225
+ * https://launchpad.net/bugs/522011
+   * fix a problem of 0 amount entries
+ * https://launchpad.net/bugs/505697
+   * Account : Analytic check report should consider expenses are debits
+ * https://launchpad.net/bugs/519220
+   * Weight on Picking has to be calculated from the Moves
+ * https://launchpad.net/bugs/519433
+   * Sale : Invoice from packing should pass proper notes to invoice
+ * https://launchpad.net/bugs/500078
+ * https://launchpad.net/bugs/527151
+   * CRM_configuration : Menu action for all Unassigned opportunities had wrong domain
+ * https://launchpad.net/bugs/486783
+   * Point_of_sale : Report for Reciept corrected
+ * https://launchpad.net/bugs/503894
+   * Base_report_crearor :Models with _inherits made working
+ * https://launchpad.net/bugs/371681
+   * Residual amount was calculated wrongly when invoice had payment term lines
+ * https://launchpad.net/bugs/454536
+   * Warning : Onchange Methods were malfunctioned.Corrected and made messages available for translations
+ * https://launchpad.net/bugs/504670
+   * Functional fields should have context as an argument when we use fnct_searc method
+ * https://launchpad.net/bugs/507094
  * https://launchpad.net/bugs/396637
    * account_analytic_analysis : Analytic account functional field methods corrected.
    * Account : Analytic account functional field methods corrected.
- * https://launchpad.net/bugs/445547
-   * Stock: Picking report correction
- * https://launchpad.net/bugs/443069
-   * Project: wrong domain for 'Tasks in Progress' menuitem
- * https://launchpad.net/bugs/483723
-   * CRM : Case form view priority issue resolved
- * https://launchpad.net/bugs/427869
-   * Residual amount in invoice when currency rating change
- * https://launchpad.net/bugs/416810
-   * Document: attachment linked with Files
- * https://launchpad.net/bugs/461801
-   * Sale : Workflow behaviour fixed when order is set to draft
- * https://launchpad.net/bugs/461720
-   * Scrum : Wrong view,widgetless fields on scrum view made correct
- * https://launchpad.net/bugs/474337
-   * [CRITICAL] warning : missing import statement for "_"
+ * https://launchpad.net/bugs/495948
+   * Corrected language code for Slovenian and Danish locales and renamed corresponding PO files.
+ * https://launchpad.net/bugs/470815
+   * l10n_chart_uk_minimal : Demo account.tax.code needed negative sign
+ * https://launchpad.net/bugs/513240
+ * https://launchpad.net/bugs/421636
+   * Account : Restricting Payment term lines percentage insertion from 0 to 1
+ * https://launchpad.net/bugs/516636
+   * Project_timesheet: Product_uom supplied to Analytic entries
+ * https://launchpad.net/bugs/492211
+   * MRP : procurement does not need cancel button when its Running
+ * https://launchpad.net/bugs/401035
+   * Audittrail : Assigned Access Rights to non-admin user.
+ * https://launchpad.net/bugs/511198
+ * https://launchpad.net/bugs/499120
+   * Stock : While removing the picking,moves should not call picking's write()
+ * https://launchpad.net/bugs/438690
+   * Account : Accounts containing moves cannot be deleted
+ * https://launchpad.net/bugs/490965
+   * Sale : SO was getting stuck when invoice is cancelled and SOL is with product.
+ * https://launchpad.net/bugs/446520
+   * [account_followup] wrong sender for email
+ * https://launchpad.net/bugs/528418
+   * membership: all products are considered to be memberships
+ * https://launchpad.net/bugs/522862
+   * document: Fixed non-closed Cursor problem
+ * https://launchpad.net/bugs/451310
+ * https://launchpad.net/bugs/479747
+ * https://launchpad.net/bugs/486794
+   * Hr_holidays: Spell mistake corrected
  * https://launchpad.net/bugs/443132
    * Sale : Passing customer ref. of picking to invoice
+ * https://launchpad.net/bugs/481372
+   * Project : If company has no Project time unit,it would have crashed.
+ * https://launchpad.net/bugs/476428
+   * Stock : Partial Picking wizard was missing translation import statement
+ * https://launchpad.net/bugs/500591
+   * Account: Spell corrected in order to display separator on subscription wizard
+   * Account: Creation of Moves to Subscription entries Corrected
+ * https://launchpad.net/bugs/436174
+   * Account: Supplier invoices was not taking product price on onchange of product
  * https://launchpad.net/bugs/488809
    * Sale : State was written wrongly
- * https://launchpad.net/bugs/465010
-   * Stock : Notification Message made translatable
- * https://launchpad.net/bugs/490342
-   * Account : making the default_get() eTiny compatible
- * https://launchpad.net/bugs/453030
-   * Avoid display write-off in pay invoice wizard : take care of partial payment
-   * Avoid display write-off in pay invoice wizard. Put the right date and currency for conversion
- * https://launchpad.net/bugs/445267
-   * Mrp_subproduct : Wrong calculation of QTYs corrected(Product qty,UOS qty)
- * https://launchpad.net/bugs/401035
-   * Audittrail : Assigned Access Rights to non-admin user.
- * https://launchpad.net/bugs/421636
-   * Account : Restricting Payment term lines percentage insertion from 0 to 1
+ * https://launchpad.net/bugs/490327
+   * Reverted bad commit from Joel@CamptoCamp
+ * https://launchpad.net/bugs/383057
+   * Stock-MRP : Split production wizard made individual to mrp if mrp is not installed
+ * https://launchpad.net/bugs/440711
+   * Purchase : PO with different pricelists should not be merged
+ * https://launchpad.net/bugs/516143
+   * Base_report_designer : Latin-1 encoding replaced by utf-8
+ * https://launchpad.net/bugs/525768
+   * membership: now membership state not depends on current date
+ * https://launchpad.net/bugs/513230
+   * Product :Uom conversion was made 2 times
+ * https://launchpad.net/bugs/522977
+   * Fixed mrp to ensure that mrp_jit can trigger the procurement assignation properly. See bug 522977.
+ * https://launchpad.net/bugs/510692
+   * Account : Onchange of product should affect price on supplier invoice line
+ * https://launchpad.net/bugs/458415
+   * document_ics : solved accent problem
+ * https://launchpad.net/bugs/428873
+   * purchase: chain location does not work
+ * https://launchpad.net/bugs/489355
+   * account, invoice, sale: description (product sold, invoice line and account entry line) was not translated
+ * https://launchpad.net/bugs/515590
+ * https://launchpad.net/bugs/499645
+   * Project_mrp: Better effect for service products creating tasks/projects
+ * https://launchpad.net/bugs/466658
+   * Account : Action window of anlytic entries was missing name
+ * https://launchpad.net/bugs/510217
+   * Added Missing import statements of translations( from tools.translate import _)
+ * https://launchpad.net/bugs/460701
+   * Document : Attachment with document can now be deleted
+ * https://launchpad.net/bugs/498047
+   * Account_tax_include : Rounding corrections
+ * https://launchpad.net/bugs/435160
+   * [IMP] Correct write-off date, add analytic account, better interface between all way to reconcile
+ * https://launchpad.net/bugs/458553
+   * Account : Onchange of amount/base amount of Invocie tax corrected
+ * https://launchpad.net/bugs/446681
+   * Account : Refund wuzard malfunctioned with modify invoice option
+ * https://launchpad.net/bugs/493444
+   * Account_analytic_default : Analytic Account value set from picking,sale
+   * account_analytic_default: now it will make entry in anayltic account on invoice line when picking done
+ * https://launchpad.net/bugs/395160
+   * Project_timesheet : Analytic line creation/edition takes user based information
  * https://launchpad.net/bugs/425671
    * Stock : Moves offer onchange on UOM to affect UOS
  * https://launchpad.net/bugs/489083
    * Account :customer refund was displaying supplier invoice view, corrected
- * https://launchpad.net/bugs/480856
-   * Warning : the super of onchange may return {},covered the same
- * https://launchpad.net/bugs/459196
-   * Account : Partner Ledger Report formatting problem solved
- * https://launchpad.net/bugs/483583
-   * Sale/Purcghase : Function fields did not have digits attribute for precision accuracy
- * https://launchpad.net/bugs/475135
-   * Account : Warning message was missing _ import
- * https://launchpad.net/bugs/457188
-   * Account_analytic_analysis : Summary of Months calculation Corrected
+ * https://launchpad.net/bugs/499038
+   * CRM_profiling : Segmentation form was missing one field
+ * https://launchpad.net/bugs/496991
+   * HR_Timesheet_sheet : timesheet cannot be deleted which have attendance entries encoded
+ * https://launchpad.net/bugs/507638
+   * Account : General Ledger report corrected for debit/credit if 0
+ * https://launchpad.net/bugs/461801
+   * Sale : Workflow behaviour fixed when order is set to draft
+ * https://launchpad.net/bugs/516361
+   * POS : for Invoice created from POS,Consistency should be maintained as SO.
+ * https://launchpad.net/bugs/439027
+   * MRP :Arguemnt of context was missing
+ * https://launchpad.net/bugs/490342
+   * Account : making the default_get() eTiny compatible
+ * https://launchpad.net/bugs/504824
+   * account: credit/debit/balance of consolidated accounts
+ * https://launchpad.net/bugs/522632
+   * Sale : Sale order list view should have sum attribute
  * https://launchpad.net/bugs/435178
    * [CRITICAL]subscription: crash subscription process
- * https://launchpad.net/bugs/480035
-   * CRM : action name improved
+ * https://launchpad.net/bugs/522161
+   * base_module_quality: speed_test
  * https://launchpad.net/bugs/487091
    * Stock :Invoice created from manual picking might miss UoS.
- * https://launchpad.net/bugs/435298
-   * Subscription : Disallowed to change the Object linked to the document type.
- * https://launchpad.net/bugs/436651
-   * mrp : workcentre load report had a query malformed
- * https://launchpad.net/bugs/479886
-   * Account : Total field on supplier invoice set to 0.0 to amke it Web-client compatible
+ * https://launchpad.net/bugs/379581
+   * Base_report_creator: Export of custom reports made working
  * https://launchpad.net/bugs/479195
    * Base_vat : Romania VAT validation corrected
- * https://launchpad.net/bugs/351083
-   * Account : Partner Balance report gets printed with respect to the company selected
- * https://launchpad.net/bugs/451310
- * https://launchpad.net/bugs/449583
-   * Sale : Better error message when account is missing from SOL for Invioce
- * https://launchpad.net/bugs/486794
-   * Hr_holidays: Spell mistake corrected
- * https://launchpad.net/bugs/351167
- * https://launchpad.net/bugs/438725
-   * Purchase : Setting the value of payment term while creatying invoice from PO
+ * https://launchpad.net/bugs/436008
+   * Sale: Passing Contact address for invoices from SO
+ * https://launchpad.net/bugs/443069
+   * Project: wrong domain for 'Tasks in Progress' menuitem
+ * https://launchpad.net/bugs/518824
+   * Project : 100% completed project should dislay proper message on Gantt chart,instead of getting failed
  * https://launchpad.net/bugs/471052
    * Product : Pricelist Item cannot use Main pricelist as the other pricelist
- * https://launchpad.net/bugs/481372
-   * Project : If company has no Project time unit,it would have crashed.
  * https://launchpad.net/bugs/458030
    * Account : Ledger Report Landscape report adjusted for A4.
- * https://launchpad.net/bugs/446205
-   * CRM : Mailgate script has host as parameter now onwards
- * https://launchpad.net/bugs/487641
-   * Purchase : MOQ-pricing problem corrected
- * https://launchpad.net/bugs/476428
-   * Stock : Partial Picking wizard was missing translation import statement
- * https://launchpad.net/bugs/366944
-   * Base_vat : Spanish numbers validation corrected
- * https://launchpad.net/bugs/466658
-   * Account : Action window of anlytic entries was missing name
- * https://launchpad.net/bugs/440557
-   * Purchase : POL had a wrong tree view which is unused till now
- * https://launchpad.net/bugs/452854
-   * Correct the validate function for balanced move into account.py (after Fabien Warning)
-   * Use price_accuracy to verify balanced entry insteed of fixed '0,0001'. Add price_accuracy on debit and credit move lines
+ * https://launchpad.net/bugs/495933
+   * Account : Made amount field of account.move searchable
+ * https://launchpad.net/bugs/440248
+   * Hr_timesheet_invoice : Line once invoiced,should not be invoiced again
  * https://launchpad.net/bugs/491241
    * Stock : Removal of picking shuold affect product stock
- * https://launchpad.net/bugs/490327
-   * Reverted bad commit from Joel@CamptoCamp
- * https://launchpad.net/bugs/440734
-   * Stock : Picking did not have 'type' field on display(inconsistent behavior from eTiny,koo) to work upon domain.
- * https://launchpad.net/bugs/436174
-   * Account: Supplier invoices was not taking product price on onchange of product
- * https://launchpad.net/bugs/474340
-   * Stock : Wizard improvements from Lionel
- * https://launchpad.net/bugs/440711
-   * Purchase : PO with different pricelists should not be merged
- * https://launchpad.net/bugs/439208
-   * Hr_timesheet : Allowing user to enter Analytic Journal if not linked with employee(Working hours tree view)
- * https://launchpad.net/bugs/379118
-   * Stock : Partial Picking wizard was making the back order reference jump to 2 numbers,notification given on packing done.
- * https://launchpad.net/bugs/476343
- * https://launchpad.net/bugs/419720
-   * Sale : Delivery Date delay computation made corrected when days are passed with fractions
+ * https://launchpad.net/bugs/510604
+   * Account: Sequence and main seq. should be different
+ * https://launchpad.net/bugs/436651
+   * mrp : workcentre load report had a query malformed
 
 
 Improvements (addons)
 ---------------------
 
+ * Update Translations
+ * Don't specify default value for dict, that return None if value doesn't exists
+ * Account_payment: showing account feild on move line when importing invoice for payment
+ * Account/base_iban : bank and iban displayed on list view of O2M to partner
+ * MRP : BOM structure report should follow hierarchy.
+ * event_project: change the string on event object all task to remaining task and put the domain on retro planning wizard(open only projects with state=template)
+ * Account : Reference allocation to move/move.line improved
+ * Launchpad export translation files
+ * Added GNU licence
+ * Unit Test cases for Sale
+ * unit test in base quality module
  * MRP : mrp.routing.workcenter made deletable on cascade effect
  * Account : Entry Line action Name Improved
  * Stock : Improved names of Stock move tree view
diff --git a/doc/Changelog-6.x b/doc/Changelog-6.x
new file mode 100644 (file)
index 0000000..05b5f58
--- /dev/null
@@ -0,0 +1,10 @@
+2010-07-XX: 6.0.0
+=================
+
+Improvements (server)
+---------------------
+
+ * support of 'ref' attribute for importing 'reference' field values, as for many2one fields.
+ * experimental xml2yml script in /tools for conversion of XML data/test files to the new YAML format
+
+
index d8e3b9c..c920547 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -6,7 +6,7 @@ formats=rpm
 
 [bdist_rpm]
 # release must exactly match 'release' as set in bin/release.py
-release=3
+release=10
 
 requires=python >= 2.4
 #build-requires=python-devel >= 2.3
index 2e004e7..39fda77 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -34,6 +34,7 @@ import glob
 
 from distutils.core import setup, Command
 from distutils.command.install import install
+from distutils.sysconfig import get_python_lib
 
 has_py2exe = False
 if os.name == 'nt':
@@ -44,7 +45,7 @@ sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin"))
 
 execfile(join('bin', 'release.py'))
 
-if sys.argv[1] == 'bdist_rpm':
+if 'bdist_rpm' in sys.argv:
     version = version.split('-')[0]
 
 # get python short version
@@ -60,6 +61,7 @@ required_modules = [
     ('pytz', 'Timezone handling library for Python'),
     ('reportlab', 'reportlab module'),
     ('yaml', 'YAML parser and emitter for Python'),
+    ('pywebdav', 'PyWebDAV is a standards compliant WebDAV server and library written in Python'),
 ]
 
 def check_modules():
@@ -121,7 +123,7 @@ def data_files():
         files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'),
                       filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*'))))
 
-        openerp_site_packages = join('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server')
+        openerp_site_packages = join(get_python_lib(prefix=''), 'openerp-server')
 
         files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),
                                               join('bin', 'server.pkey'),
@@ -133,7 +135,7 @@ def data_files():
                                                    join('python25-compat','SocketServer.py')]))
 
         for addonname, add_path in find_addons():
-            addon_path = join('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server','addons', addonname)
+            addon_path = join(get_python_lib(prefix=''), 'openerp-server','addons', addonname)
             for root, dirs, innerfiles in os.walk(add_path):
                 innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles)
                 if innerfiles:
@@ -176,11 +178,14 @@ options = {
         "compressed": 1,
         "optimize": 2,
         "dist_dir": 'dist',
-        "packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
-                     "lxml.objectify", "decimal", "xml", "encodings",
-                     "dateutil", "wizard", "pychart", "PIL", "pyparsing",
-                     "pydot", "asyncore","asynchat", "reportlab", "vobject",
-                     "HTMLParser", "select", "yaml"],
+        "packages": [
+                 "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
+                 "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath",
+                 "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing",
+                 "pydot", "asyncore","asynchat", "reportlab", "vobject",
+                 "HTMLParser", "select", "mako", "poplib",
+                 "imaplib", "smtplib", "email", "yaml","pywebdav",
+                 ],
         "excludes" : ["Tkconstants","Tkinter","tcl"],
     }
 }
diff --git a/tools/gen_graph.sh b/tools/gen_graph.sh
new file mode 100755 (executable)
index 0000000..a56780d
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/bash
+##############################################################################
+#
+# Copyright (c) 2004-2009 TINY SPRL. (http://tiny.be)
+#
+# $Id$
+#
+# 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 contact a Free Software
+# Service Company
+#
+# 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 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.
+#
+##############################################################################
+
+./module_graph.py $@ | dot -Tpng -o > module_graph.png
+
diff --git a/tools/module_graph.py b/tools/module_graph.py
new file mode 100755 (executable)
index 0000000..05bb058
--- /dev/null
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+# TODO handle the case of zip modules
+
+import os
+import optparse
+import sys
+import glob
+
+def load_information_from_description_file(module):
+    """
+    :param module: The name of the module (sale, purchase, ...)
+    """
+    for filename in ['__openerp__.py', '__terp__.py']:
+        description_file = os.path.join(module, filename)
+        if os.path.isfile(description_file):
+            return eval(file(description_file).read())
+
+    return {}
+
+def get_valid_path(paths, module):
+    for path in paths:
+        full = os.path.join(path, module)
+        if os.path.exists(full):
+            return full
+    return None
+
+parser = optparse.OptionParser(usage="%prog [options] [module1 [module2 ...]]")
+parser.add_option("-p", "--addons-path", dest="path", help="addons directory", action="append")
+(opt, args) = parser.parse_args()
+
+modules = []
+if not opt.path:
+    opt.path = ["."]
+
+if not args:
+    for path in opt.path:
+        modules += map(os.path.dirname, glob.glob(os.path.join(path, '*', '__openerp__.py')))
+        modules += map(os.path.dirname, glob.glob(os.path.join(path, '*', '__terp__.py')))
+else:
+    for module in args:
+        valid_path = get_valid_path(opt.path, module)
+        if valid_path:
+            modules.append(valid_path)
+
+all_modules = set(map(os.path.basename, modules))
+print 'digraph G {'
+while len(modules):
+    f = modules.pop(0)
+    module_name = os.path.basename(f)
+    all_modules.add(module_name)
+    info = load_information_from_description_file(f)
+    if info.get('installable', True):
+        for name in info.get('depends',[]):
+            valid_path = get_valid_path(opt.path, name)
+            if name not in all_modules:
+                if valid_path:
+                    modules.append(valid_path)
+                else:
+                    all_modules.add(name)
+                    print '\t%s [color=red]' % (name,)
+            print '\t%s -> %s;' % (module_name, name)
+print '}'
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/tools/xml2yml.py b/tools/xml2yml.py
new file mode 100755 (executable)
index 0000000..e926ddf
--- /dev/null
@@ -0,0 +1,345 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 OpenERP SA (<http://openerp.com>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+"""
+Experimental script for conversion between OpenERP's XML serialization format
+and the new YAML serialization format introduced in OpenERP 6.0.
+Intended to be used as a quick preprocessor for converting data/test files, then
+to be fine-tuned manually.
+"""
+
+import yaml
+import logging
+from lxml import etree
+
+__VERSION__ = '0.0.2'
+
+def toString(value):
+    value='"' + value + '"'
+    return value
+
+class XmlTag(etree.ElementBase):
+    def _to_yaml(self):
+        child_tags = []
+        for node in self:
+            if hasattr(node, '_to_yaml'):
+                child_tags.append(node._to_yaml())
+        return self.tag(attrib=self.attrib, child_tags=child_tags)
+
+class YamlTag(object):
+    """
+    Superclass for constructors of custom tags defined in yaml file.
+    """
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+        self.attrib = self.__dict__.get('attrib', {})
+        self.child_tags = self.__dict__.get('child_tags', '')
+    def __getitem__(self, key):
+        return getattr(self, key)
+    def __getattr__(self, attr):
+        return None
+    def __repr__(self):
+        for k,v in self.attrib.iteritems():
+            if str(v) and str(v)[0] in ['[', '{', '#', '*', '(']:
+                self.attrib[k] = toString(self.attrib[k]).replace("'", '')
+        st = self.yaml_tag + ' ' + str(self.attrib)
+        return st
+
+# attrib tags
+class ref(YamlTag):
+    yaml_tag = u'!ref'
+    def __init__(self, expr="False"):
+        self.expr = expr
+    def __repr__(self):
+        return "'%s'"%str(self.expr)
+
+class Eval(YamlTag):
+    yaml_tag = u'!eval'
+    def __init__(self, expr="False"):
+        self.expr = expr
+    def __repr__(self):
+        value=str(self.expr)
+        if value.find("6,") != -1:
+            value = eval(str(eval(value)))
+            value=value[0][2]
+            value = [[value]]
+        else:
+            try:
+                value=int(value)
+            except:
+                if value and value[0] in ['[', '{', '#', '*', '(']:
+                    value = value.replace('"', r'\"')
+                    value = toString(value)
+                else:
+                    try:
+                        value = eval(value)
+                    except Exception:
+                        pass
+        return value
+
+class Search(YamlTag):
+    yaml_tag = u'!ref'
+
+# test tag
+class xml_test(XmlTag):
+    def _to_yaml(self):
+        expr = self.attrib.get('expr')
+        text = self.text
+        if text:
+            expr = expr + ' == ' + '"%s"'%text
+        return [[expr]]
+
+class xml_data(etree.ElementBase):
+    def _to_yaml(self):
+        value = self.attrib.get('noupdate', "0")
+        return data(value)
+
+# field tag:
+class xml_field(etree.ElementBase):
+    def _to_yaml(self):
+        field = '  ' + self.attrib.pop('name','unknown')
+
+        if self.attrib.get('search', None):
+            value = Search(attrib=self.attrib, child_tags='').__repr__()
+        else:
+            attr = (self.attrib.get('ref', None) and 'ref') or (self.attrib.get('eval', None) and 'eval') or 'None'
+            value = Eval(self.attrib.get(attr, self.text)).__repr__() or ''
+        return {field: value}
+
+# value tag
+class xml_value(etree.ElementBase):
+    def _to_yaml(self):
+
+        if self.attrib.get('eval', None):
+            key, val = 'eval', '"'+self.attrib.get('eval')+'"'
+        elif self.attrib.get('model', None):
+            key, val = 'model', self.attrib.get('model')
+        val=val.replace("'",'""')
+        self.attrib.pop(key)
+        d={}
+        for k,v in self.attrib.iteritems():
+            if k == 'search':
+                v = '"' + v + '"'
+            k='--' + k
+            v=v.replace("'",'""')
+            d[k] = v
+        if d:
+            ls=[[{key:val},dict(d)]]
+        else:
+            ls=[[{key:val}]]
+        return ls
+
+# data tag
+class data(YamlTag):
+    yaml_tag = u'!context'
+    def __init__(self, noupdate="0"):
+        self.child_tags = {'    noupdate':noupdate}
+    def __repr__(self):
+        return "!!context"
+
+# Record tag
+class Record(YamlTag):
+    yaml_tag = u'!record'
+class xml_record(XmlTag):
+    tag=Record
+    def _to_yaml(self):
+        child_tags = {}
+        for node in self:
+            if hasattr(node, '_to_yaml'):
+                child_tags.update(node._to_yaml())
+        return Record(attrib=self.attrib, child_tags=child_tags)
+
+# ir_set tag
+class Ir_Set(YamlTag):
+    yaml_tag = u'!ir_set'
+    def __repr__(self):
+        st = self.yaml_tag
+        return st
+class xml_ir_set(XmlTag):
+    tag=Ir_Set
+    def _to_yaml(self):
+        child_tags = {}
+        for node in self:
+            if hasattr(node, '_to_yaml'):
+                child_tags.update(node._to_yaml())
+        return Ir_Set(attrib=self.attrib, child_tags=child_tags)
+
+# workflow tag
+class Workflow(YamlTag):
+    yaml_tag = u'!workflow'
+class xml_workflow(XmlTag):
+    tag=Workflow
+
+# function tag
+class Function(YamlTag):
+    yaml_tag = u'!function'
+class xml_function(XmlTag):
+    tag=Function
+
+# function tag
+class Assert(YamlTag):
+    yaml_tag = u'!assert'
+class xml_assert(XmlTag):
+    tag=Assert
+
+# menuitem tagresult.append(yaml.safe_dump(obj, default_flow_style=False, allow_unicode=True).replace("'",''))
+class MenuItem(YamlTag):
+    yaml_tag = u'!menuitem'
+class xml_menuitem(XmlTag):
+    tag=MenuItem
+
+# act_window tag
+class ActWindow(YamlTag):
+    yaml_tag = u'!act_window'
+class xml_act_window(XmlTag):
+    tag=ActWindow
+
+# report tag
+class Report(YamlTag):
+    yaml_tag = u'!report'
+class xml_report(XmlTag):
+    tag=Report
+
+# deletes tag
+class Delete(YamlTag):
+    yaml_tag = u'!delete'
+class xml_delete(XmlTag):
+    tag=Delete
+
+# python tag
+class Python(YamlTag):
+    yaml_tag = u'!python'
+class xml_python(XmlTag):
+    tag=Python
+
+# context tag
+class Context(YamlTag):
+    yaml_tag = u'!context'
+class xml_context(XmlTag):
+    tag=Context
+
+# url tag
+class Url(YamlTag):
+    yaml_tag = u'!url'
+class xml_url(XmlTag):
+    tag=Url
+
+# delete tag
+class Delete(YamlTag):
+    yaml_tag = u'!delete'
+class xml_delete(XmlTag):
+    tag=Delete
+
+def represent_data(dumper, data):
+        return dumper.represent_mapping(u'tag:yaml.org,2002:map', [('!'+str(data), data.child_tags)])
+
+yaml.SafeDumper.add_representer(Record, represent_data)
+yaml.SafeDumper.add_representer(data, represent_data)
+yaml.SafeDumper.add_representer(Workflow, represent_data)
+yaml.SafeDumper.add_representer(Function, represent_data)
+yaml.SafeDumper.add_representer(Assert, represent_data)
+yaml.SafeDumper.add_representer(MenuItem, represent_data)
+yaml.SafeDumper.add_representer(Ir_Set, represent_data)
+yaml.SafeDumper.add_representer(Python, represent_data)
+yaml.SafeDumper.add_representer(Context, represent_data)
+
+class MyLookup(etree.CustomElementClassLookup):
+    def lookup(self, node_type, document, namespace, name):
+        if node_type=='element':
+            return {
+                'data': xml_data,
+                'record': xml_record,
+                'field': xml_field,
+                'workflow': xml_workflow,
+                'function': xml_function,
+                'value': xml_value,
+                'assert': xml_assert,
+                'test': xml_test,
+                'menuitem': xml_menuitem,
+                'act_window': xml_act_window,
+                'report': xml_report,
+                'delete': xml_delete,
+                'python': xml_python,
+                'context': xml_context,
+                'url': xml_url,
+                'ir_set': xml_ir_set,
+            }.get(name, None)
+        elif node_type=='comment':
+            return None#xml_comment
+        return None
+
+class xml_parse(object):
+    def __init__(self):
+        self.context = {}
+    def parse(self, fname):
+        parser = etree.XMLParser()
+        parser.setElementClassLookup(MyLookup())
+        result = []
+        self.root = etree.XML(file(fname).read(), parser)
+        for data in self.root:
+            if hasattr(data, '_to_yaml'):
+                obj = data._to_yaml()
+                if obj.yaml_tag == '!context':
+                    result.append(yaml.dump(str(obj)).replace("'",'').split('\n')[0])
+                    result.append(yaml.dump(obj.child_tags, default_flow_style=False).replace("'",''))
+                else:
+                    result.append(yaml.safe_dump(obj, default_flow_style=False, allow_unicode=True).replace("'",''))
+            self.context.update(data.attrib)
+            for tag in data:
+                if tag.tag == etree.Comment:
+                    result.append(tag)
+                else:
+                    if hasattr(tag, '_to_yaml'):
+                        obj = tag._to_yaml()
+                        if not obj.child_tags:
+                            result.append(yaml.dump('!'+str(obj), default_flow_style=False, allow_unicode=True, width=999).replace("'",''))
+                        else:
+                            result.append(yaml.safe_dump(obj, default_flow_style=False, allow_unicode=True, width=999).replace('\n:', ':\n').replace("'",''))
+        print "# Experimental OpenERP xml-to-yml conversion! (v%s)"%__VERSION__
+        print "# Please use this as a first conversion/preprocessing step,"
+        print "# not as a production-ready tool!"
+        for record in result:
+            if type(record) != type(''):
+                record=str(record)
+                l= record.split("\n")
+                for line in l:
+                    print '#' + str(line)
+                continue
+            record=str(record)
+            record = record.replace('- --','  ')        #for value tag
+            record = record.replace('!!', '- \n  !')    #for all parent tags
+            record = record.replace('- - -', '    -')   #for many2many fields
+            record = record.replace('? ', '')           #for long expressions
+            record = record.replace('""', "'")          #for string-value under value tag
+            print record
+
+if __name__=='__main__':
+    import optparse
+    import sys
+    parser = optparse.OptionParser(
+        usage = '%s file.xml' % sys.argv[0])
+    (opt, args) = parser.parse_args()
+    if len(args) != 1:
+        parser.error("incorrect number of arguments")
+    fname = sys.argv[1]
+    p = xml_parse()
+    p.parse(fname)
+