[MERGE] Sync with trunk.

bzr revid: tde@openerp.com-20130226155252-vi618lsx000a1i01
This commit is contained in:
Thibault Delavallée
2013-02-26 16:52:52 +01:00
41 changed files with 882 additions and 164 deletions
+3 -3
View File
@@ -334,11 +334,11 @@
<label for="currency_id" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="currency_id" class="oe_inline"/>
<!-- note fp: I don't think we need this feature ?
<button name="%(action_account_change_currency)d" type="action"
icon="terp-stock_effects-object-colorize"
class="oe_inline oe_link oe_edit_only"
string="(change)"
attrs="{'invisible':[('state','!=','draft')]}"
groups="account.group_account_user"/> -->
groups="account.group_account_user"/>
</div>
</group>
</group>
+5 -5
View File
@@ -8,19 +8,19 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2011-05-06 12:05+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2013-02-25 14:55+0000\n"
"Last-Translator: Софче Димитријева <Unknown>\n"
"Language-Team: Macedonian <mk@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: 2012-12-22 06:02+0000\n"
"X-Generator: Launchpad (build 16378)\n"
"X-Launchpad-Export-Date: 2013-02-26 05:09+0000\n"
"X-Generator: Launchpad (build 16506)\n"
#. module: account_accountant
#: model:ir.actions.client,name:account_accountant.action_client_account_menu
msgid "Open Accounting Menu"
msgstr ""
msgstr "Отвори го менито за сметководство"
#~ msgid ""
#~ "\n"
@@ -68,6 +68,22 @@
<field name="search_view_id" ref="view_account_analytic_default_form_search"/>
<field name="context">{"search_default_current":1}</field>
</record>
<record id="action_product_default_list" model="ir.actions.act_window">
<field name="name">Analytic Defaults</field>
<field name="res_model">account.analytic.default</field>
<field name="context">{'search_default_product_id': [active_id], 'default_product_id': active_id}</field>
</record>
<record model="ir.ui.view" id="product_form_view_default_analytic_button">
<field name="name">product.product.stock.move</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Analytic Rules" name= "%(action_product_default_list)d" type="action" groups="analytic.group_analytic_accounting" />
</xpath>
</field>
</record>
<act_window
name="Entries"
@@ -99,13 +115,5 @@
context="{'search_default_user_id': [active_id], 'default_user_id': active_id}"
groups="analytic.group_analytic_accounting"/>
<act_window
name="Analytic Rules"
res_model="account.analytic.default"
id="analytic_rule_action_product"
src_model="product.product"
context="{'search_default_product_id': [active_id], 'default_product_id': active_id}"
groups="analytic.group_analytic_accounting"/>
</data>
</openerp>
+1 -1
View File
@@ -152,7 +152,7 @@
name="action_button_convert2opportunity"
states="open,pending"
icon="gtk-index"
type="action" attrs="{'invisible':[('opportunity_id','!=',False)]}"/>
type="object" attrs="{'invisible':[('opportunity_id','!=',False)]}"/>
</tree>
</field>
</record>
+188
View File
@@ -0,0 +1,188 @@
# Arabic translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-02-25 21:35+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Arabic <ar@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: 2013-02-26 05:09+0000\n"
"X-Generator: Launchpad (build 16506)\n"
#. module: google_docs
#: code:addons/google_docs/google_docs.py:139
#, python-format
msgid "Key Error!"
msgstr ""
#. module: google_docs
#: view:google.docs.config:0
msgid ""
"for a presentation (slide show) document with url like "
"`https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id"
".p`, the ID is `presentation:123456789`"
msgstr ""
#. module: google_docs
#: view:google.docs.config:0
msgid ""
"for a text document with url like "
"`https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is "
"`document:123456789`"
msgstr ""
#. module: google_docs
#: field:google.docs.config,gdocs_resource_id:0
msgid "Google Resource ID to Use as Template"
msgstr ""
#. module: google_docs
#: view:google.docs.config:0
msgid ""
"for a drawing document with url like "
"`https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is "
"`drawings:123456789`"
msgstr ""
#. module: google_docs
#. openerp-web
#: code:addons/google_docs/static/src/xml/gdocs.xml:6
#, python-format
msgid "Add Google Doc..."
msgstr ""
#. module: google_docs
#: view:google.docs.config:0
msgid ""
"This is the id of the template document, on google side. You can find it "
"thanks to its URL:"
msgstr ""
#. module: google_docs
#: model:ir.model,name:google_docs.model_google_docs_config
msgid "Google Docs templates config"
msgstr ""
#. module: google_docs
#. openerp-web
#: code:addons/google_docs/static/src/js/gdocs.js:25
#, python-format
msgid ""
"The user google credentials are not set yet. Contact your administrator for "
"help."
msgstr ""
#. module: google_docs
#: view:google.docs.config:0
msgid ""
"for a spreadsheet document with url like "
"`https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, "
"the ID is `spreadsheet:123456789`"
msgstr ""
#. module: google_docs
#: code:addons/google_docs/google_docs.py:101
#, python-format
msgid ""
"Your resource id is not correct. You can find the id in the google docs URL."
msgstr ""
#. module: google_docs
#: code:addons/google_docs/google_docs.py:125
#, python-format
msgid "Creating google docs may only be done by one at a time."
msgstr ""
#. module: google_docs
#: code:addons/google_docs/google_docs.py:56
#: code:addons/google_docs/google_docs.py:101
#: code:addons/google_docs/google_docs.py:125
#, python-format
msgid "Google Docs Error!"
msgstr ""
#. module: google_docs
#: code:addons/google_docs/google_docs.py:56
#, python-format
msgid "Check your google configuration in Users/Users/Synchronization tab."
msgstr ""
#. module: google_docs
#: model:ir.ui.menu,name:google_docs.menu_gdocs_config
msgid "Google Docs configuration"
msgstr ""
#. module: google_docs
#: model:ir.actions.act_window,name:google_docs.action_google_docs_users_config
#: model:ir.ui.menu,name:google_docs.menu_gdocs_model_config
msgid "Models configuration"
msgstr ""
#. module: google_docs
#: field:google.docs.config,model_id:0
msgid "Model"
msgstr ""
#. module: google_docs
#. openerp-web
#: code:addons/google_docs/static/src/js/gdocs.js:28
#, python-format
msgid "User Google credentials are not yet set."
msgstr ""
#. module: google_docs
#: code:addons/google_docs/google_docs.py:139
#, python-format
msgid "Your Google Doc Name Pattern's key does not found in object."
msgstr ""
#. module: google_docs
#: help:google.docs.config,name_template:0
msgid ""
"Choose how the new google docs will be named, on google side. Eg. "
"gdoc_%(field_name)s"
msgstr ""
#. module: google_docs
#: view:google.docs.config:0
msgid "Google Docs Configuration"
msgstr ""
#. module: google_docs
#: help:google.docs.config,gdocs_resource_id:0
msgid ""
"\n"
"This is the id of the template document, on google side. You can find it "
"thanks to its URL: \n"
"*for a text document with url like "
"`https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is "
"`document:123456789`\n"
"*for a spreadsheet document with url like "
"`https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, "
"the ID is `spreadsheet:123456789`\n"
"*for a presentation (slide show) document with url like "
"`https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id"
".p`, the ID is `presentation:123456789`\n"
"*for a drawing document with url like "
"`https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is "
"`drawings:123456789`\n"
"...\n"
msgstr ""
#. module: google_docs
#: model:ir.model,name:google_docs.model_ir_attachment
msgid "ir.attachment"
msgstr ""
#. module: google_docs
#: field:google.docs.config,name_template:0
msgid "Google Doc Name Pattern"
msgstr ""
+5
View File
@@ -93,6 +93,10 @@ class hr_job(osv.osv):
_inherit = ['mail.thread']
_columns = {
'name': fields.char('Job Name', size=128, required=True, select=True),
# TO CLEAN: when doing a cleaning, we should change like this:
# no_of_recruitment: a function field
# expected_employees: float
# This would allow a clean update when creating new employees.
'expected_employees': fields.function(_no_of_employee, string='Total Forecasted Employees',
help='Expected number of employees for this job position after new recruitment.',
store = {
@@ -146,6 +150,7 @@ class hr_employee(osv.osv):
_name = "hr.employee"
_description = "Employee"
_inherits = {'resource.resource': "resource_id"}
_inherit = ['mail.thread']
def _get_image(self, cr, uid, ids, name, args, context=None):
result = dict.fromkeys(ids, False)
+4
View File
@@ -84,6 +84,10 @@
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
+7 -4
View File
@@ -116,7 +116,10 @@ class hr_holidays(osv.osv):
},
}
def _employee_get(self, cr, uid, context=None):
def _employee_get(self, cr, uid, context=None):
emp_id = context.get('default_employee_id', False)
if emp_id:
return emp_id
ids = self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)
if ids:
return ids[0]
@@ -203,9 +206,9 @@ class hr_holidays(osv.osv):
leave_ids = obj_res_leave.search(cr, uid, [('holiday_id', 'in', ids)], context=context)
return obj_res_leave.unlink(cr, uid, leave_ids, context=context)
def onchange_type(self, cr, uid, ids, holiday_type):
result = {'value': {'employee_id': False}}
if holiday_type == 'employee':
def onchange_type(self, cr, uid, ids, holiday_type, employee_id=False, context=None):
result = {}
if holiday_type == 'employee' and not employee_id:
ids_employee = self.pool.get('hr.employee').search(cr, uid, [('user_id','=', uid)])
if ids_employee:
result['value'] = {
+3 -3
View File
@@ -78,7 +78,7 @@
<field name="category_id" attrs="{'required':[('holiday_type','=','category')], 'invisible':[('holiday_type','=','employee')], 'readonly':[('state','!=','draft'), ('state','!=','confirm')]}"/>
</group>
<group>
<field name="holiday_type" on_change="onchange_type(holiday_type)" attrs="{'readonly':[('state','!=','draft')]}" width="130" string="Mode" groups="base.group_hr_user"/>
<field name="holiday_type" on_change="onchange_type(holiday_type, employee_id)" attrs="{'readonly':[('state','!=','draft')]}" width="130" string="Mode" groups="base.group_hr_user"/>
<field name="employee_id" attrs="{'required':[('holiday_type','=','employee')],'invisible':[('holiday_type','=','category')]}" on_change="onchange_employee(employee_id)" groups="base.group_hr_user"/>
<field name="department_id" attrs="{'readonly':[('holiday_type','=','category')]}" groups="base.group_hr_user"/>
</group>
@@ -206,7 +206,8 @@
<field name="arch" type="xml">
<tree colors="red:state == 'refuse';blue:state == ' draft';black:state in ('confirm','validate','validate1')" string="Leave Requests">
<field name="employee_id"/>
<field name="holiday_type" string="Mode" groups="base.group_hr_user"/>
<field name="holiday_type" string="Mode" groups="base.group_no_one"/>
<field name="holiday_status_id"/>
<field name="name"/>
<field name="date_from"/>
<field name="date_to"/>
@@ -214,7 +215,6 @@
<field name="state"/>
<field name="category_id" invisible="1"/>
<field name="department_id" invisible="not context.get('set_visible',False)"/>
<field name="holiday_status_id" invisible="1"/>
<field name="manager_id" invisible="1"/>
<field name="user_id" invisible="1"/>
</tree>
+5 -4
View File
@@ -420,12 +420,13 @@ class hr_applicant(base_stage, osv.Model):
act_window = self.pool.get('ir.actions.act_window')
emp_id = False
for applicant in self.browse(cr, uid, ids, context=context):
address_id = False
address_id = contact_name = False
if applicant.partner_id:
address_id = self.pool.get('res.partner').address_get(cr,uid,[applicant.partner_id.id],['contact'])['contact']
if applicant.job_id:
contact_name = self.pool.get('res.partner').name_get(cr,uid,[applicant.partner_id.id])[0][1]
if applicant.job_id and (applicant.partner_name or contact_name):
applicant.job_id.write({'no_of_recruitment': applicant.job_id.no_of_recruitment - 1})
emp_id = hr_employee.create(cr,uid,{'name': applicant.partner_name or applicant.name,
emp_id = hr_employee.create(cr,uid,{'name': applicant.partner_name or contact_name,
'job_id': applicant.job_id.id,
'address_home_id': address_id,
'department_id': applicant.department_id.id
@@ -433,7 +434,7 @@ class hr_applicant(base_stage, osv.Model):
self.write(cr, uid, [applicant.id], {'emp_id': emp_id}, context=context)
self.case_close(cr, uid, [applicant.id], context)
else:
raise osv.except_osv(_('Warning!'), _('You must define Applied Job for this applicant.'))
raise osv.except_osv(_('Warning!'), _('You must define an Applied Job and a Contact Name for this applicant.'))
action_model, action_id = model_data.get_object_reference(cr, uid, 'hr', 'open_view_employee_list')
dict_act_window = act_window.read(cr, uid, action_id, [])
@@ -10,3 +10,4 @@ access_hr_recruitment_source_hr_officer,hr.recruitment.source,model_hr_recruitme
access_hr_recruitment_source_all,hr.recruitment.source,model_hr_recruitment_source,,1,0,0,0
access_hr_applicant_category,hr.applicant_category,model_hr_applicant_category,,1,1,1,0
access_hr_applicant_category_manager,hr.applicant_category,model_hr_applicant_category,base.group_hr_manager,1,1,1,1
access_crm_meeting_type_hr_officer,crm.meeting.type.officer,base_calendar.model_crm_meeting_type,base.group_hr_user,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
10 access_hr_recruitment_source_all hr.recruitment.source model_hr_recruitment_source 1 0 0 0
11 access_hr_applicant_category hr.applicant_category model_hr_applicant_category 1 1 1 0
12 access_hr_applicant_category_manager hr.applicant_category model_hr_applicant_category base.group_hr_manager 1 1 1 1
13 access_crm_meeting_type_hr_officer crm.meeting.type.officer base_calendar.model_crm_meeting_type base.group_hr_user 1 1 1 0
+2
View File
@@ -69,6 +69,7 @@
<field name="date"/>
<field name="order_line_ids"/>
<filter name='is_mine' string="My Orders" domain="[('user_id','=',uid)]"/>
<filter name='by_users' string="Users" context="{'group_by':'user_id'}"/>
</search>
</field>
</record>
@@ -304,6 +305,7 @@
<field name="arch" type="xml">
<tree string="Orders Tree">
<field name="date"/>
<field name='user_id'/>
<field name="order_line_ids"/>
<field name="state" />
<field name="total" sum="Total"/>
+15 -23
View File
@@ -980,26 +980,6 @@
</field>
</record>
<act_window
context="{'search_default_product_id': [active_id]}"
id="act_product_manufacturing_open"
name="Manufacturing Orders"
view_id="mrp_production_tree_view"
res_model="mrp.production"
src_model="product.product"/>
<act_window
id="action_product_bom_structure"
name="Product BoM Structure"
domain="[('product_id', 'in', active_ids),('bom_id','=',False)]"
context="{'default_product_id': active_id}"
view_type="tree"
view_mode="tree"
view_id="mrp_bom_tree_view"
res_model="mrp.bom"
src_model="product.product"
groups="mrp.group_mrp_user"/>
<!-- Menu for Resource for MRP-->
<record id="mrp_workcenter_action" model="ir.actions.act_window">
@@ -1034,21 +1014,33 @@
id="menu_mrp_production_order_action" name="Order Planning"
parent="menu_mrp_planning" sequence="1"/>
<record id="act_product_mrp_bom_open" model="ir.actions.act_window">
<field name="name">BoM Structure</field>
<field name="context">{'default_product_id': active_id}</field>
<field name="domain">[('product_id', 'in', active_ids),('bom_id','=',False)]</field>
<field name="res_model">mrp.bom</field>
</record>
<record model="ir.actions.act_window" id="product_open_bom">
<field name="context">{'default_product_id': active_id, 'search_default_product_id': active_id}</field>
<field name="name">Bill of Materials</field>
<field name="domain">[('bom_id','=',False)]</field>
<field name="res_model">mrp.bom</field>
</record>
<record id="act_product_mrp_production" model="ir.actions.act_window">
<field name="context">{'search_default_product_id': [active_id]}</field>
<field name="name">Manufacturing Orders</field>
<field name="res_model">mrp.production</field>
<field name="view_id" ref="mrp_production_tree_view"/>
</record>
<record model="ir.ui.view" id="product_form_view_bom_button">
<field name="name">product.product.procurement</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Bill of Materials" name="%(product_open_bom)d" type="action"/>
<button string="Bill of Materials" name="%(product_open_bom)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}"/>
<button string="BoM Structure" name="%(act_product_mrp_bom_open)d" type="action" groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}"/>
<button string="Manufacturing Orders" name="%(act_product_mrp_production)d" type="action" groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}"/>
</xpath>
</field>
</record>
+8
View File
@@ -27,6 +27,14 @@
<li> MS Outlook 2005 or above.</li>
<li> MS .Net Framework 3.5 or above.</li>
</ol>
<p>Outlook plug-in installation:</p>
<ol>
<li>Save the outlook plugin corresponding to your Office version (Office x86 or Office x64).</li>
<li>Double-click on the executable file and install the plugin.</li>
<li>Open Outlook (close it and open it again if it is already closed).</li>
<li>From the Outlook menubar: OpenERP -> Configuration.</li>
<li>Configure your openerp server.</li>
</ol>
</xpath>
<separator string="title" position="attributes">
<attribute name="string"></attribute>
+59
View File
@@ -0,0 +1,59 @@
# Slovenian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-02-24 12:33+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Slovenian <sl@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: 2013-02-25 05:08+0000\n"
"X-Generator: Launchpad (build 16506)\n"
#. module: portal_event
#: view:event.event:0
msgid "Portal Settings"
msgstr "Nastavitve portala"
#. module: portal_event
#: model:ir.actions.act_window,help:portal_event.action_event_view
msgid "There are no public events."
msgstr "Ni javnih dogodkov"
#. module: portal_event
#: selection:event.event,visibility:0
msgid "Private"
msgstr "Zasebno"
#. module: portal_event
#: model:ir.model,name:portal_event.model_event_event
msgid "Event"
msgstr "Dogodek"
#. module: portal_event
#: model:ir.actions.act_window,name:portal_event.action_event_view
#: model:ir.ui.menu,name:portal_event.portal_company_events
msgid "Events"
msgstr "Dogodki"
#. module: portal_event
#: field:event.event,visibility:0
msgid "Visibility"
msgstr "Vidljivost"
#. module: portal_event
#: help:event.event,visibility:0
msgid "Event's visibility in the portal's contact page"
msgstr "Vidljivost dogodka na kontaktni strani portala"
#. module: portal_event
#: selection:event.event,visibility:0
msgid "Public"
msgstr "Javno"
+5 -3
View File
@@ -312,11 +312,13 @@
<record model="ir.ui.view" id="product_form_view_procurement_button">
<field name="name">product.product.procurement</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="inherit_id" ref="stock.view_normal_procurement_locations_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='incoming_qty']" position="after">
<button string="⇒ Request Procurement" name="%(act_make_procurement)d" type="action" class="oe_link"/>
</xpath>
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Request Procurement" name="%(act_make_procurement)d" type="action"/>
<button string="Orderpoints" name="%(product_open_orderpoint)d" type="action"/>
<button string="Orderpoints" name="%(product_open_orderpoint)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}"/>
</xpath>
<xpath expr="//field[@name='cost_method']" position="before">
<field name="procure_method" groups="base.group_user"/>
+5 -1
View File
@@ -372,7 +372,11 @@
</header>
<sheet string="Task">
<h1>
<field name="name" placeholder="Task summary..."/>
<field name="name" placeholder="Task summary..." class="oe_inline"/>
<field name="kanban_state" invisible='1'/>
<button name="set_kanban_state_done" help="In Progress" attrs="{'invisible': [('kanban_state', 'in', ['done','blocked'])]}" type="object" icon="gtk-normal" class="oe_link oe_right"/>
<button name="set_kanban_state_blocked" help="Ready for Next Stage" attrs="{'invisible': [('kanban_state', 'in', ['normal','blocked'])]}" type="object" icon="gtk-yes" class="oe_link oe_right"/>
<button name="set_kanban_state_normal" help="Blocked" attrs="{'invisible': [('kanban_state', 'in', ['done','normal'])]}" type="object" icon="gtk-no" class="oe_link oe_right"/>
</h1>
<group>
<group>
+1 -1
View File
@@ -34,7 +34,7 @@ class project_configuration(osv.osv_memory):
This installs the module project_mrp."""),
'module_pad': fields.boolean("Use integrated collaborative note pads on task",
help="""Lets the company customize which Pad installation should be used to link to new pads
(by default, http://ietherpad.com/).
(for example: http://ietherpad.com/).
This installs the module pad."""),
'module_project_timesheet': fields.boolean("Record timesheet lines per tasks",
help="""This allows you to transfer the entries under tasks defined for Project Management to
@@ -21,3 +21,4 @@ access_project_task_history_cumulative,project.task.history project,project.mode
access_resource_calendar,project.resource_calendar manager,resource.model_resource_calendar,project.group_project_manager,1,0,0,0
access_project_category,project.project_category,model_project_category,,1,0,0,0
access_project_category_manager,project.project_category,model_project_category,project.group_project_manager,1,1,1,1
access_mail_alias,mail.alias,mail.model_mail_alias,project.group_project_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
21 access_resource_calendar project.resource_calendar manager resource.model_resource_calendar project.group_project_manager 1 0 0 0
22 access_project_category project.project_category model_project_category 1 0 0 0
23 access_project_category_manager project.project_category model_project_category project.group_project_manager 1 1 1 1
24 access_mail_alias mail.alias mail.model_mail_alias project.group_project_manager 1 1 1 1
+7 -1
View File
@@ -68,7 +68,13 @@
</header>
<sheet string="Issue">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
<h1>
<field name="name" class="oe_inline"/>
<field name="kanban_state" invisible='1'/>
<button name="set_kanban_state_done" help="In Progress" attrs="{'invisible': [('kanban_state', 'in', ['done','blocked'])]}" type="object" icon="gtk-normal" class="oe_link oe_right"/>
<button name="set_kanban_state_blocked" help="Ready for Next Stage" attrs="{'invisible': [('kanban_state', 'in', ['normal','blocked'])]}" type="object" icon="gtk-yes" class="oe_link oe_right"/>
<button name="set_kanban_state_normal" help="Blocked" attrs="{'invisible': [('kanban_state', 'in', ['done','normal'])]}" type="object" icon="gtk-no" class="oe_link oe_right"/>
</h1>
<group>
<group groups="base.group_user">
<field name="user_id"/>
+11 -13
View File
@@ -334,8 +334,8 @@
<field name="name">Quotations</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="context">{'search_default_draft': 1, 'search_default_to_approve': 1}</field>
<field name="domain">[('state','in',('draft','sent','confirmed'))]</field>
<field name="context">{}</field>
<field name="domain">[('state','in',('draft','sent','cancel'))]</field>
<field name="view_mode">tree,form,graph,calendar</field>
<field name="search_view_id" ref="view_purchase_order_filter"/>
<field name="help" type="html">
@@ -492,15 +492,6 @@
</field>
</record>
<act_window
context="{'search_default_product_id': [active_id], 'default_product_id': active_id}"
id="action_purchase_line_product_tree"
name="Purchases"
res_model="purchase.order.line"
src_model="product.product"
groups="purchase.group_purchase_user"/>
<record id="purchase_line_form_action2" model="ir.actions.act_window">
<field name="name">On Purchase Order Lines</field>
<field name="type">ir.actions.act_window</field>
@@ -613,12 +604,20 @@
</field>
</field>
</record>
<record model="ir.actions.act_window" id="action_purchase_line_product_tree">
<field name="context">{'search_default_product_id': active_id, 'default_product_id': active_id}</field>
<field name="name">Purchases</field>
<field name="res_model">purchase.order.line</field>
<field name="view_id" ref="purchase_order_line_tree"/>
</record>
<record id="view_product_account_purchase_ok_form" model="ir.ui.view">
<field name="name">product.account.purchase.ok.form.inherit</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="account.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Purchases" name="%(action_purchase_line_product_tree)d" type="action" groups="purchase.group_purchase_user"/>
</xpath>
<xpath expr="//field[@name='property_account_expense']" position="replace" >
<field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" groups="account.group_account_user"/>
</xpath>
@@ -627,6 +626,5 @@
</xpath>
</field>
</record>
</data>
</openerp>
+1 -1
View File
@@ -30,7 +30,7 @@ class purchase_config_settings(osv.osv_memory):
_columns = {
'default_invoice_method': fields.selection(
[('manual', 'Based on purchase order lines'),
('picking', 'Based on receptions'),
('picking', 'Based on incoming shipments'),
('order', 'Pre-generate draft invoices based on purchase orders'),
], 'Default invoicing control method', required=True, default_model='purchase.order'),
'group_purchase_pricelist':fields.boolean("Manage pricelist per supplier",
+1 -1
View File
@@ -49,7 +49,7 @@
name="view_picking"
string="Incoming Shipments" states="approved"/>
<button type="object" name="invoice_open"
string="Invoices" attrs="{'invisible': [('state', '=', 'draft')]}"/>
string="Invoices" attrs="{'invisible': [('state', 'in', ['draft','sent'])]}"/>
</div>
</xpath>
</field>
+318
View File
@@ -0,0 +1,318 @@
# Mongolian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-02-25 09:32+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Mongolian <mn@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: 2013-02-26 05:09+0000\n"
"X-Generator: Launchpad (build 16506)\n"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Cancelled Invoice"
msgstr "Цуцлагдсан нэхэмжлэл"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Total (inclu. taxes):"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Disc. (%)"
msgstr "Хөнгөлөлт. (%)"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Supplier Invoice"
msgstr "Нийлүүлэгчийн Нэхэмжлэл"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Unit Price"
msgstr "Нэгжийн үнэ"
#. module: report_intrastat
#: selection:report.intrastat,type:0
msgid "Import"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
#: field:report.intrastat.code,description:0
msgid "Description"
msgstr "Тайлбар"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "VAT :"
msgstr "НӨАТ :"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Document"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "PRO-FORMA"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Taxes:"
msgstr ""
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "March"
msgstr "3-р сар"
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "August"
msgstr "8-р сар"
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "May"
msgstr "5-р сар"
#. module: report_intrastat
#: field:report.intrastat,type:0
msgid "Type"
msgstr "Төрөл"
#. module: report_intrastat
#: model:ir.actions.report.xml,name:report_intrastat.invoice_intrastat_id
msgid "Invoice Intrastat"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Invoice Date"
msgstr "Нэхэмлэлийн Огноо"
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "June"
msgstr "6-р сар"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Tel. :"
msgstr "Утас:"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Base"
msgstr ""
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "January"
msgstr "1-р сар"
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "July"
msgstr "7-р сар"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Quantity"
msgstr "Тоо хэмжээ"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Partner Ref."
msgstr ""
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "February"
msgstr "2-р сар"
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "October"
msgstr "10-р сар"
#. module: report_intrastat
#: model:ir.model,name:report_intrastat.model_report_intrastat
msgid "Intrastat report"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Invoice"
msgstr "Нэхэмжлэл"
#. module: report_intrastat
#: model:ir.model,name:report_intrastat.model_res_country
msgid "Country"
msgstr "Улс"
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "September"
msgstr "9-р сар"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Taxes"
msgstr ""
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "April"
msgstr "4-р сар"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Amount"
msgstr "Дүн"
#. module: report_intrastat
#: view:report.intrastat:0
msgid "Intrastat Data"
msgstr ""
#. module: report_intrastat
#: field:report.intrastat,value:0
msgid "Value"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
#: model:ir.actions.act_window,name:report_intrastat.action_report_intrastat_tree_all
#: model:ir.ui.menu,name:report_intrastat.menu_report_intrastat_all
msgid "Intrastat"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Draft Invoice"
msgstr "Ноорог нэхэмжлэл"
#. module: report_intrastat
#: field:report.intrastat,supply_units:0
msgid "Supply Units"
msgstr ""
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "November"
msgstr "11-р сар"
#. module: report_intrastat
#: model:ir.model,name:report_intrastat.model_report_intrastat_code
#: field:product.template,intrastat_id:0
#: field:report.intrastat,intrastat_id:0
#: view:report.intrastat.code:0
msgid "Intrastat code"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Refund"
msgstr ""
#. module: report_intrastat
#: field:report.intrastat,ref:0
msgid "Source document"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Fiscal Position Remark :"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
#: field:report.intrastat,weight:0
msgid "Weight"
msgstr "Жин"
#. module: report_intrastat
#: model:ir.model,name:report_intrastat.model_product_template
msgid "Product Template"
msgstr "Барааны үлгэр"
#. module: report_intrastat
#: field:res.country,intrastat:0
msgid "Intrastat member"
msgstr ""
#. module: report_intrastat
#: selection:report.intrastat,month:0
msgid "December"
msgstr "12-р сар"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Tax"
msgstr "Татвар"
#. module: report_intrastat
#: field:report.intrastat,code:0
msgid "Country code"
msgstr "Улсын код"
#. module: report_intrastat
#: field:report.intrastat,month:0
msgid "Month"
msgstr "Сар"
#. module: report_intrastat
#: field:report.intrastat,currency_id:0
msgid "Currency"
msgstr "Валют"
#. module: report_intrastat
#: selection:report.intrastat,type:0
msgid "Export"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Fax :"
msgstr "Факс :"
#. module: report_intrastat
#: field:report.intrastat,name:0
msgid "Year"
msgstr "Жил"
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Supplier Refund"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Total (excl. taxes):"
msgstr ""
#. module: report_intrastat
#: report:account.invoice.intrastat:0
msgid "Price"
msgstr "Үнэ"
#. module: report_intrastat
#: model:ir.actions.act_window,name:report_intrastat.action_report_intrastat_code_tree
#: model:ir.ui.menu,name:report_intrastat.menu_report_intrastat_code
#: view:report.intrastat.code:0
#: field:report.intrastat.code,name:0
msgid "Intrastat Code"
msgstr ""
+1
View File
@@ -36,5 +36,6 @@ import webkit_report
import ir_report
import wizard
import convert
import report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+3
View File
@@ -89,6 +89,9 @@ TODO:
'header_view.xml',
'ir_report_view.xml',
],
'demo': [
"report/webkit_report_demo.xml",
],
'installable': True,
'auto_install': False,
'images': ['images/companies_webkit.jpeg','images/header_html.jpeg','images/header_img.jpeg'],
+6 -6
View File
@@ -55,7 +55,7 @@
<body style="border:0; margin: 0;" onload="subst()">
<table class="header" style="border-bottom: 0px solid black; width: 100%">
<tr>
<td>${helper.embed_logo_by_name('camptocamp_logo')|n}</td>
<td>${helper.embed_company_logo()|safe}</td>
<td style="text-align:right"> </td>
</tr>
<tr>
@@ -63,21 +63,21 @@
<td style="text-align:right"> </td>
</tr>
<tr>
<td>${company.partner_id.name |entity}</td>
<td>${company.partner_id.name}</td>
<td/>
</tr>
<tr>
<td >${company.partner_id.street or ''|entity}</td>
<td >${company.partner_id.street or ''}</td>
<td/>
</tr>
<tr>
<td>Phone: ${company.partner_id.phone or ''|entity} </td>
<td>Phone: ${company.partner_id.phone or ''} </td>
<td/>
</tr>
<tr>
<td>Mail: ${company.partner_id.email or ''|entity}<br/></td>
<td>Mail: ${company.partner_id.email or ''}<br/></td>
</tr>
</table> ${_debug or ''|n} </body>
</table> ${_debug or ''|safe} </body>
</html>]]>
</field>
<field eval="55.0" name="margin_top"/>
+2 -2
View File
@@ -39,13 +39,13 @@ def register_report(name, model, tmpl_path, parser=rml_parse):
"""Register the report into the services"""
name = 'report.%s' % name
if name in openerp.report.interface.report_int._reports:
service = openerp.report.interface.report_int[name]
service = openerp.report.interface.report_int._reports[name]
if isinstance(service, WebKitParser):
#already instantiated properly, skip it
return
if hasattr(service, 'parser'):
parser = service.parser
del openerp.report.interface.report_int[name]
del openerp.report.interface.report_int._reports[name]
WebKitParser(name, model, tmpl_path, parser=parser)
+7 -5
View File
@@ -7,11 +7,13 @@
<field name="arch" type="xml">
<xpath expr="//page[@string='Security']" position="before" >
<page string="Webkit" attrs="{'invisible':[('report_type','!=','webkit')]}">
<field name="webkit_header"/>
<field name="webkit_debug"/>
<field name="precise_mode"/>
<separator string="Webkit Template (used if Report File is not found)" colspan="4"/>
<field name="report_webkit_data" colspan="4" nolabel="1"/>
<group>
<field name="webkit_header"/>
<field name="webkit_debug"/>
<field name="precise_mode"/>
<separator string="Webkit Template (used if Report File is not found)" colspan="4"/>
<field name="report_webkit_data" colspan="4" nolabel="1"/>
</group>
</page>
</xpath>
</field>
+2
View File
@@ -0,0 +1,2 @@
import webkit_report_demo
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<style type="text_css">${css}</style>
</head>
<body>
<h1>List of reports:</h1>
<ul>
% for report in objects:
<li>${report.name}</li>
% endfor
</ul>
<p>The administrator name is: ${admin_name}</p>
<p>If this report does not contain headers, it is because you have a badly compiled wkhtmltopdf. Consider installing
the static version distributed on the official web site: <a href="https://code.google.com/p/wkhtmltopdf/">https://code.google.com/p/wkhtmltopdf/</a>.</p>
</body>
</html>
@@ -0,0 +1,11 @@
from openerp.addons.report_webkit.webkit_report import webkit_report_extender
from openerp import SUPERUSER_ID
@webkit_report_extender("report_webkit.webkit_demo_report")
def extend_demo(pool, cr, uid, localcontext, context):
admin = pool.get("res.users").browse(cr, uid, SUPERUSER_ID, context)
localcontext.update({
"admin_name": admin.name,
})
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report string="Report on reports"
id="webkit_demo_report"
model="ir.actions.report.xml"
name="webkit.ir.actions.report.xml"
file="report_webkit/report/webkit_report_demo.mako"
report_type="webkit"/>
</data>
</openerp>
+8
View File
@@ -39,6 +39,7 @@ class WebKitHelper(object):
self.uid = uid
self.pool = pooler.get_pool(self.cursor.dbname)
self.report_id = report_id
self.context = context
def embed_image(self, type, img, width=0, height=0) :
"Transform a DB image into an embedded HTML image"
@@ -79,6 +80,13 @@ class WebKitHelper(object):
"""Return HTML embedded logo by name"""
img, type = self.get_logo_by_name(name)
return self.embed_image(type, img, width, height)
def embed_company_logo(self, width=0, height=0):
cr, uid, context = self.cursor, self.uid, self.context
my_user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
logo = my_user.company_id.logo_web
return self.embed_image("png", logo, width, height)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+97 -41
View File
@@ -38,10 +38,6 @@ import tempfile
import time
import logging
from mako.template import Template
from mako.lookup import TemplateLookup
from mako import exceptions
from openerp import netsvc
from openerp import pooler
from report_helper import WebKitHelper
@@ -50,16 +46,72 @@ from openerp import addons
from openerp import tools
from openerp.tools.translate import _
from openerp.osv.osv import except_osv
from urllib import urlencode, quote as quote
_logger = logging.getLogger(__name__)
try:
# We use a jinja2 sandboxed environment to render mako templates.
# Note that the rendering does not cover all the mako syntax, in particular
# arbitrary Python statements are not accepted, and not all expressions are
# allowed: only "public" attributes (not starting with '_') of objects may
# be accessed.
# This is done on purpose: it prevents incidental or malicious execution of
# Python code that may break the security of the server.
from jinja2.sandbox import SandboxedEnvironment
mako_template_env = SandboxedEnvironment(
block_start_string="<%",
block_end_string="%>",
variable_start_string="${",
variable_end_string="}",
comment_start_string="<%doc>",
comment_end_string="</%doc>",
line_statement_prefix="%",
line_comment_prefix="##",
trim_blocks=True, # do not output newline after blocks
autoescape=True, # XML/HTML automatic escaping
)
mako_template_env.globals.update({
'str': str,
'quote': quote,
'urlencode': urlencode,
})
except ImportError:
_logger.warning("jinja2 not available, templating features will not work!")
def mako_template(text):
"""Build a Mako template.
This template uses UTF-8 encoding
"""
tmp_lookup = TemplateLookup() #we need it in order to allow inclusion and inheritance
return Template(text, input_encoding='utf-8', output_encoding='utf-8', lookup=tmp_lookup)
return mako_template_env.from_string(text)
_extender_functions = {}
def webkit_report_extender(report_name):
"""
A decorator to define functions to extend the context used in a template rendering.
report_name must be the xml id of the desired report (it is mandatory to indicate the
module in that xml id).
The given function will be called at the creation of the report. The following arguments
will be passed to it (in this order):
- pool The model pool.
- cr The cursor.
- uid The user id.
- localcontext The context given to the template engine to render the templates for the
current report. This is the context that should be modified.
- context The OpenERP context.
"""
def fct1(fct):
lst = _extender_functions.get(report_name)
if not lst:
lst = []
_extender_functions[report_name] = lst
lst.append(fct)
return fct
return fct1
class WebKitParser(report_sxw):
"""Custom class that use webkit to render HTML reports
@@ -201,6 +253,17 @@ class WebKitParser(report_sxw):
def create_single_pdf(self, cursor, uid, ids, data, report_xml, context=None):
"""generate the PDF"""
# just try to find an xml id for the report
cr = cursor
import openerp.pooler as pooler
pool = pooler.get_pool(cr.dbname)
found_xml_ids = pool.get("ir.model.data").search(cr, uid, [["model", "=", "ir.actions.report.xml"], \
["res_id", "=", report_xml.id]], context=context)
xml_id = None
if found_xml_ids:
xml_id = pool.get("ir.model.data").read(cr, uid, found_xml_ids[0], ["module", "name"])
xml_id = "%s.%s" % (xml_id["module"], xml_id["name"])
if context is None:
context={}
htmls = []
@@ -242,64 +305,57 @@ class WebKitParser(report_sxw):
if not css :
css = ''
#default_filters=['unicode', 'entity'] can be used to set global filter
body_mako_tpl = mako_template(template)
helper = WebKitHelper(cursor, uid, report_xml.id, context)
self.parser_instance.localcontext['helper'] = helper
self.parser_instance.localcontext['css'] = css
self.parser_instance.localcontext['_'] = self.translate_call
# apply extender functions
additional = {}
if xml_id in _extender_functions:
for fct in _extender_functions[xml_id]:
fct(pool, cr, uid, self.parser_instance.localcontext, context)
if report_xml.precise_mode:
for obj in objs:
self.parser_instance.localcontext['objects'] = [obj]
ctx = dict(self.parser_instance.localcontext)
for obj in self.parser_instance.localcontext['objects']:
ctx['objects'] = [obj]
try :
html = body_mako_tpl.render(helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext)
html = body_mako_tpl.render(dict(ctx))
htmls.append(html)
except Exception:
msg = exceptions.text_error_template().render()
except Exception, e:
msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
else:
try :
html = body_mako_tpl.render(helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext)
html = body_mako_tpl.render(dict(self.parser_instance.localcontext))
htmls.append(html)
except Exception:
msg = exceptions.text_error_template().render()
msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
head_mako_tpl = mako_template(header)
try :
head = head_mako_tpl.render(helper=helper,
css=css,
_=self.translate_call,
_debug=False,
**self.parser_instance.localcontext)
except Exception:
raise except_osv(_('Webkit render!'),
exceptions.text_error_template().render())
head = head_mako_tpl.render(dict(self.parser_instance.localcontext, _debug=False))
except Exception, e:
raise except_osv(_('Webkit render!'), u"%s" % e)
foot = False
if footer :
foot_mako_tpl = mako_template(footer)
try :
foot = foot_mako_tpl.render(helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext)
except:
msg = exceptions.text_error_template().render()
foot = foot_mako_tpl.render(dict({},
**self.parser_instance.localcontext))
except Exception, e:
msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
if report_xml.webkit_debug :
try :
deb = head_mako_tpl.render(helper=helper,
css=css,
_debug=tools.ustr("\n".join(htmls)),
_=self.translate_call,
**self.parser_instance.localcontext)
except Exception:
msg = exceptions.text_error_template().render()
deb = head_mako_tpl.render(dict(self.parser_instance.localcontext, _debug=tools.ustr("\n".join(htmls))))
except Exception, e:
msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
return (deb, 'html')
+16 -9
View File
@@ -538,15 +538,22 @@
<field name="domain">[('invoiced','&lt;&gt;', 1),('state','=','done')]</field>
<field name="filter" eval="True"/>
</record>
<act_window
context="{'search_default_product_id': active_id, 'default_product_id': active_id}"
id="action_order_line_product_tree"
name="Sales Order Lines"
res_model="sale.order.line"
src_model="product.product"
groups="base.group_sale_salesman"/>
<record id="action_order_line_product_tree" model="ir.actions.act_window">
<field name="context">{'search_default_product_id': active_id, 'default_product_id': active_id}</field>
<field name="name">Sales Order Lines</field>
<field name="res_model">sale.order.line</field>
<field name="view_id" ref="view_order_line_tree"/>
</record>
<record model="ir.ui.view" id="product_form_view_sale_order_button">
<field name="name">product.product.sale.order</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Sales" name="%(action_order_line_product_tree)d" type="action" groups="base.group_sale_salesman"/>
</xpath>
</field>
</record>
<menuitem id="base.menu_invoiced" name="Invoicing" parent="base.menu_base_partner" sequence="5"/>
<menuitem id="menu_invoicing_sales_order_lines" parent="base.menu_invoiced" action="action_order_line_tree2" sequence="10" groups="sale.group_invoice_so_lines"/>
@@ -78,7 +78,7 @@ class sale_advance_payment_inv(osv.osv_memory):
result = []
for sale in sale_obj.browse(cr, uid, sale_ids, context=context):
val = inv_line_obj.product_id_change(cr, uid, [], wizard.product_id.id,
uom_id=False, partner_id=sale.partner_id.id, fposition_id=sale.fiscal_position.id)
False, partner_id=sale.partner_id.id, fposition_id=sale.fiscal_position.id)
res = val['value']
# determine and check income account
@@ -86,7 +86,7 @@ class sale_advance_payment_inv(osv.osv_memory):
prop = ir_property_obj.get(cr, uid,
'property_account_income_categ', 'product.category', context=context)
prop_id = prop and prop.id or False
account_id = fiscal_obj.map_account(cr, uid, sale.fiscal_position.id or False, prop_id)
account_id = fiscal_obj.map_account(cr, uid, sale.fiscal_position or False, prop_id)
if not account_id:
raise osv.except_osv(_('Configuration Error!'),
_('There is no income account defined as global property.'))
+2
View File
@@ -235,6 +235,8 @@ class product_product(osv.osv):
else:
location_ids = []
wids = warehouse_obj.search(cr, uid, [], context=context)
if not wids:
return res
for w in warehouse_obj.browse(cr, uid, wids, context=context):
location_ids.append(w.lot_stock_id.id)
+12 -5
View File
@@ -68,6 +68,10 @@
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Inventory" name="%(action_product_location_tree)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_locations"/>
<button string="Moves" name= "%(act_product_stock_move_open)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_stock_user"/>
</xpath>
<group name="procurement_uom" position="before">
<group name="delay" string="Delays">
<label for="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
@@ -88,13 +92,16 @@
<label for="qty_available"/>
<div>
<field name="qty_available" class="oe_inline"/>
<button name="%(action_view_change_product_quantity)d" string="update"
type="action"
class="oe_link"/>
<button name="%(action_view_change_product_quantity)d" string="⇒ Update"
type="action"
class="oe_link"/>
</div>
<label for="incoming_qty"/>
<div>
<field name="incoming_qty" class="oe_inline"/>
<field name="outgoing_qty" class="oe_inline"/>
<field name="virtual_available" class="oe_inline"/>
</div>
<field name="outgoing_qty" class="oe_inline"/>
<field name="virtual_available" class="oe_inline"/>
</group>
<group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
<field name="track_production" groups="stock.group_production_lot"/>
@@ -2,13 +2,6 @@
<openerp>
<data>
<act_window
context="{'product_id': active_id}"
id="act_stock_product_location_open"
name="Stock by Location"
res_model="stock.location"
src_model="product.product"/>
<act_window
domain="[('tracking_id', '=', active_id)]"
id="act_stock_tracking_lot_2_stock_report_tracklots"
+10 -15
View File
@@ -632,6 +632,16 @@
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_product_location_tree">
<field name="context">{'product_id': active_id}</field>
<field name="name">Stock by Location</field>
<field name="res_model">stock.location</field>
</record>
<record id="act_product_stock_move_open" model="ir.actions.act_window">
<field name="context">{'search_default_done': 1,'search_default_product_id': active_id, 'default_product_id': active_id}</field>
<field name="name">Moves</field>
<field name="res_model">stock.move</field>
</record>
<record id="action_location_tree" model="ir.actions.act_window">
<field name="name">Location Structure</field>
<field name="res_model">stock.location</field>
@@ -1562,21 +1572,6 @@
res_model="product.product"
src_model="stock.location"/>
<act_window
context="{'search_default_done': 1,'search_default_product_id': [active_id], 'default_product_id': active_id}"
id="act_product_stock_move_open"
name="Inventory Move"
res_model="stock.move"
src_model="product.product"/>
<act_window
context="{'search_default_future': 1,'search_default_product_id': [active_id], 'default_product_id': active_id}"
domain="[('state','in',('waiting','confirmed','assigned'))]"
id="act_product_stock_move_futur_open"
name="Future Stock Moves"
res_model="stock.move"
src_model="product.product"/>
<record id="ir_act_product_location_open" model="ir.values">
<field name="key2">tree_but_open</field>
<field name="model">stock.location</field>