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/
</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"
</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>
<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">
<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 -->
<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 -->
<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 -->
<?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 -->
<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 -->
<?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 -->
<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 -->
<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>
<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 -->
<openerp>
<data>
+ <menuitem
+ id="menu_hr_config_applicant"
+ name="Applicant"
+ parent="hr.menu_hr_configuration"
+ />
+
# ------------------------------------------------------
# Job Categories
# ------------------------------------------------------
<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
<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'}"/>
<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"/>
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>
<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
<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="['&', ('date_planned::date','<', 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>
<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>
<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>
<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="['&', ('date_planned::date','<', 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>
</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>
<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>
<?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>
<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>
<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<0;red:bool(date_deadline) and (date_deadline<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<0 and state in ('pending');red:bool(date_deadline) and (date_deadline<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','<>',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','>=',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','>=',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>
<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','<=', time.strftime('%%Y-%%m-%%d')),('date_start','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('date_start','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('date_start','>',(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">
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):
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"/>'''
<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>
<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)"/>
<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>
<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','<', time.strftime('%%Y-%%m-%%d')), ('date','>=',(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','<', time.strftime('%%Y-%%m-%%d')), ('date','>=',(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"/>
<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','<=', time.strftime('%%Y-%%m-%%d')), ('create_date','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('create_date','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('create_date','>',(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')]"/>
</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')]"/>
'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"),
<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"/>
<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>
<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')]}">
<button icon="gtk-cancel" special="cancel" string="_Cancel"/>
<button icon="gtk-ok" name="check_selection" string="_Compute" type="object"/>
</group>
+ </group>
</form>
</field>
</record>
<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>
<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>
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:
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'])
#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:
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 = []
})
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")
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)
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, ({}, []))
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():
'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,
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:
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):
_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
<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<=current_date;black:date_planned>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"/>
<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','<=', time.strftime('%%Y-%%m-%%d')),('date','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('date','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('date','>',(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')]"/>
<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"/>
<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">
<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">
<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>
<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"/>
<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>
<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>
<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','<=', time.strftime('%%Y-%%m-%%d')),('date','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('date','>',(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','<=', time.strftime('%%Y-%%m-%%d')), ('date','>',(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">
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)
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:
<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','<>', 1),('state','=','done')]" separator="1"/>
+ <filter icon="terp-gtk-go-back-rtl" string="To Invoice" domain="[('invoiced','<>', 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','<>', 1),('state','<>','draft'),('state','<>','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>
<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"/>
<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>
</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>
</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>
<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>
</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>
<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">
</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>
_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 = {
'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'),
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),
<?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>
<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>
<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>
<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>
<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="['|','&',('sprint_id.date_start','<=',time.strftime('%%Y-%%m-%%d')), ('sprint_id.date_stop','>=',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>
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)
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,))
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={}):
'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."),
'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={}):
'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):
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'),
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 = [], [], []
<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 & 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>
#
# 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
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')
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'):
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()
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'))
--- /dev/null
+# -*- 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:
+++ /dev/null
-# -*- 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:
<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>
<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>
<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>
-"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"
"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
"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
"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
#. module: base
#: view:workflow.activity:0
msgid "Outgoing transitions"
-msgstr "Изходящи промени"
+msgstr "Изходящи преходи"
#. module: base
#: selection:ir.report.custom,frequency:0
#: 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
#. module: base
#: selection:maintenance.contract.wizard,state:0
msgid "Unvalidated"
-msgstr "Непроверен"
+msgstr "Невалидирано"
#. module: base
#: model:ir.ui.menu,name:base.next_id_9
#: 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
#: 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
#: 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
#. 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
#. module: base
#: view:workflow.activity:0
msgid "Incoming transitions"
-msgstr "Входящи промени"
+msgstr "Входящи преходи"
#. module: base
#: model:res.country,name:base.cn
#. 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
"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
"invoice, then `object.invoice_address_id.mobile` is the field which gives "
"the correct mobile number"
msgstr ""
-"Оказва полетата които ще се използват за доставяне на мобилен номер, напр., "
+"Указва полетата които ще се използват за доставяне на мобилен номер, напр., "
"когато изберете фактура, тогава 'object.invoice_address_id.mobile' е полето "
"което дава правилния мобилен номер"
#. module: base
#: field:ir.exports,name:0
msgid "Export Name"
-msgstr "Име на извлечането"
+msgstr "Име на изнасянето"
#. module: base
#: help:res.partner.address,type:0
"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
"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
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"
" "
"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
"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
#: 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
#. 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
#. module: base
#: field:res.currency,rate:0
msgid "Current Rate"
-msgstr "Tasa"
+msgstr "Taxa"
#. module: base
#: selection:module.lang.install,init,lang:0
"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
#: 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
#. module: base
#: model:res.country,name:base.nt
msgid "Neutral Zone"
-msgstr "Zona Neutral"
+msgstr "Zona neutral"
#. module: base
#: view:ir.model:0
#. 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
"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
#. 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
"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
"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
"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
"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"
--- /dev/null
+# 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 / русский язык"
"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
"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
"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
"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
#: 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
#. 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
"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
"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
"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
"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"
"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
"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
#. 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
"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
#: 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
#: 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
"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
"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
"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"
"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
"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
"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
"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
#. 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
#. 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
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
#. module: base
#: field:res.partner,vat:0
msgid "VAT"
-msgstr "IVA"
+msgstr "Partita IVA"
#. module: base
#: view:res.lang:0
#. 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
#. 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
#. 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
#. 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
"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
"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
"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
"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
#. 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
#. 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
#. module: base
#: view:res.partner:0
msgid "My Partners"
-msgstr ""
+msgstr "Mani Partneri"
#. module: base
#: model:res.country,name:base.es
#: 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
#: 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
#: code:addons/base/res/res_user.py:0
#, python-format
msgid " (copy)"
-msgstr ""
+msgstr " (kopija)"
#. module: base
#: view:ir.sequence:0
#. module: base
#: view:res.partner.address:0
msgid "Search Contact"
-msgstr ""
+msgstr "Meklēt Kontaktu"
#. module: base
#: view:ir.module.module:0
#. module: base
#: selection:module.lang.install,init,lang:0
msgid "Greek / Ελληνικά"
-msgstr ""
+msgstr "Grieķu / Ελληνικά"
#. module: base
#: view:ir.values:0
#. 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
#: 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
#: 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
#: 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
#: 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
#. module: base
#: selection:ir.translation,type:0
msgid "SQL Constraint"
-msgstr ""
+msgstr "SQL Ierobežojums"
#. module: base
#: field:ir.actions.server,srcmodel_id:0
#. module: base
#: selection:module.lang.install,init,lang:0
msgid "Finland / Suomi"
-msgstr ""
+msgstr "Somu / Suomi"
#. module: base
#: model:res.country,name:base.bo
#. 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
#. 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
#. 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
#. 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
#. 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
#. 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
#. 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
#. 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
#: 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
#. 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
"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
"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
"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
"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
#. module: base
#: model:res.country,name:base.md
msgid "Moldavia"
-msgstr ""
+msgstr "Mołdawia"
#. module: base
#: view:ir.module.module:0
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
import ir_report_custom
import ir_attachment
import ir_cron
+import ir_filters
import ir_values
import ir_translation
import ir_exports
<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>
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
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')
'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
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)
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']
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:
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:
obj_pool = None
res_id = False
-
+
model = action.copy_object.split(',')[0]
cid = action.copy_object.split(',')[1]
obj_pool = self.pool.get(model)
'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={
# -*- 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/>.
#
##############################################################################
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)):
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:
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)
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()
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()
--- /dev/null
+# -*- 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:
# -*- 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 logging
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)
'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 = {
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)
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']):
self.pool.get(vals['model'])._auto_init(cr, ctx)
return res
-
+
ir_model_fields()
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'),
'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
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]
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()
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
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
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:
# 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 = []
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
'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 = [
'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:
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'),
--- /dev/null
+# -*- 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))
+
--- /dev/null
+# -*- 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)
+
#
# 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
import re
import urllib
import os
+import imp
import tools
from osv import fields, osv, orm
import zipfile
'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 !!
], 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),
_defaults = {
'state': lambda *a: 'uninstalled',
'demo': lambda *a: False,
- 'license': lambda *a: 'GPL-2',
+ 'license': lambda *a: 'AGPL-3',
}
_order = 'name'
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 !'))
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:
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]
# 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
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',
<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"/>
#
# 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
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:
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))
import res_user
import res_request
import res_lang
-
+import res_log
import ir_property
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
<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>
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,
##############################################################################
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()
<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>
_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:
-
<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>
# -*- 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 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'
'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'),
'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={}):
_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),
'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),
_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:
<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>
<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>
<?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>
<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 & 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>
<?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>
# -*- 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:
--- /dev/null
+# -*- 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:
+
--- /dev/null
+<?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>
+++ /dev/null
-# -*- 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:
-
import tools
from tools.translate import _
-
class multi_company_default(osv.osv):
"""
Manage multi company default value
'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):
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)
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>
_defaults = {
'currency_id': _get_euro,
'rml_header':_get_header,
- 'rml_header2': _get_header2
+ 'rml_header2': _get_header2,
+ 'logo':_get_logo
}
_constraints = [
#
##############################################################################
+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
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):
'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):
<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>
('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
if not grouping:
return (s, 0)
+
result = ""
seps = 0
spaces = ""
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:
--- /dev/null
+# -*- 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()
+
--- /dev/null
+<?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>
<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>
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 _
_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),
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('-'):
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):
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]
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"
'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'),
'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 ):
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 !'))
]
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
'menu_id': _get_menu,
'action_id': _get_menu,
'company_id': _get_company,
+ 'company_ids': _get_companies,
'groups_id': _get_group,
'address_id': False,
}
_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):
}
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:
<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>
<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>
"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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
+++ /dev/null
-#!/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
-
+++ /dev/null
-#!/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:
-
<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>
<rng:empty />
</rng:choice>
</rng:element>
- </rng:oneOrMore>
+ </rng:zeroOrMore>
</rng:element>
</rng:define>
<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/>
#
##############################################################################
+import errno
import logging
import logging.handlers
import os
+import socket
import sys
import threading
import time
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
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:
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
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):
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)
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:
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)
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:
import warnings
import tools
-
+from tools.translate import _
def _symbol_set(symb):
if symb == None or symb == False:
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)
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)):
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 \
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 = {}
# - 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)
def intersect(la, lb):
return filter(lambda x: x in lb, la)
-
class except_orm(Exception):
def __init__(self, name, value):
self.name = name
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
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" % (
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:
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,
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__
_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,))
'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,
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':
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)
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]
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
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 \
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
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:
#
# 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)
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)
)
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
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')
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 = {}
column = False
if column:
- relation = column._obj
+ relation = self.pool.get(column._obj)
+
childs = False
views = {}
for f in node:
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'):
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:
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 = {}
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:
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 = []
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:
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
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
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:
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]
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):
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()
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,))
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"):
cr.commit()
if store_compute:
self._parent_store_compute(cr)
+ cr.commit()
return todo_end
def __init__(self, cr):
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
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
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'))
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 = []
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))
"""
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 = []
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)
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:
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
# 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):
* '&' (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)
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):
"""
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):
"""
: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:
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:
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'])
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):
"""
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:
import sys
import traceback
import logging
-from psycopg2 import IntegrityError
+from psycopg2 import IntegrityError, errorcodes
from tools.func import wraps
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
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
##############################################################################
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
import misc
import cStringIO
from lxml import etree
+from tools.translate import _
class external_pdf(render.render):
def __init__(self, pdf):
# -*- 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/>.
#
##############################################################################
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):
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)
# -*- 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/>.
#
##############################################################################
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')
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):
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
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):
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'))
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''):
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]
"""
from websrv_lib import *
import netsvc
+import errno
import threading
import tools
import os
+import select
import socket
import xmlrpclib
"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):
import threading
import tools
import os
+import select
import socket
import tiny_socket
self.sock = None
def run(self):
- # import select
self.running = True
try:
ts = tiny_socket.mysocket(self.sock)
"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
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")
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))
## 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')
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):
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)
@check
def close(self):
+ return self._close(False)
+
+ def _close(self, leak=False):
if not self._obj:
return
# 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):
return getattr(self._obj, name)
+class PsycoConnection(psycopg2.extensions.connection):
+ pass
+
class ConnectionPool(object):
__logger = logging.getLogger('db.connection_pool')
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()
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):
'login_message': False,
'list_db' : True,
'timezone' : False, # to override the default TZ
+ 'test-disable' : False,
+ 'test-commit' : False,
}
self.misc = {}
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")
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")
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)
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()
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:
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')
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']
# -*- 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 pickle
import re
import sys
-import time
from datetime import datetime
from lxml import etree
-
import ir
import misc
import netsvc
return f_val
a_eval = node.get('eval','')
if a_eval:
+ import time
idref2 = idref.copy()
idref2['time'] = time
idref2['DateTime'] = datetime
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')):
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)
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):
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'):
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')
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')
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,
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):
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):
#
# 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
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
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))
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)
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())
def to_xml(s):
return s.replace('&','&').replace('<','<').replace('>','>')
+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.
@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'):
'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',
'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',
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:
# -*- 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/>.
#
##############################################################################
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')
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,
'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:
# 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'])])
--- /dev/null
+#!/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()
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:
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:
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)
'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,
# 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)
"""
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)
self.logger.exception(e)
except Exception, e:
self.logger.exception(e)
- raise e
+ raise
def _process_node(self, node):
if is_comment(node):
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):
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):
# 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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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
"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"
"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
"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
"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
--- /dev/null
+# 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 "請選擇帳號的用戶名稱。"
-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'
* 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
* 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
* 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
--- /dev/null
+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
+
+
[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
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':
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
('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():
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'),
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:
"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"],
}
}
--- /dev/null
+#!/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
+
--- /dev/null
+#!/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:
+
--- /dev/null
+# -*- 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)
+