@@ -7,7 +7,7 @@
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<notebook position="inside">
|
||||
<page string="Accounting" groups="base.group_user">
|
||||
<page string="Accounting" groups="account.group_account_user">
|
||||
<group name="properties">
|
||||
<group>
|
||||
<field name="property_account_income" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}"/>
|
||||
|
||||
@@ -40,6 +40,9 @@ Adds menu to show relevant information to each manager.You can also view the rep
|
||||
'account_analytic_analysis_menu.xml',
|
||||
'account_analytic_analysis_cron.xml',
|
||||
],
|
||||
'css': [
|
||||
'static/src/css/analytic.css'
|
||||
],
|
||||
'demo': [],
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
|
||||
@@ -451,8 +451,8 @@ class account_analytic_account(osv.osv):
|
||||
'real_margin_rate': fields.function(_real_margin_rate_calc, type='float', string='Real Margin Rate (%)',
|
||||
help="Computes using the formula: (Real Margin / Total Costs) * 100.",
|
||||
digits_compute=dp.get_precision('Account')),
|
||||
'fix_price_invoices' : fields.boolean('Fix Price Invoices'),
|
||||
'invoice_on_timesheets' : fields.boolean("Invoice On Timesheets"),
|
||||
'fix_price_invoices' : fields.boolean('Fixed Price'),
|
||||
'invoice_on_timesheets' : fields.boolean("On Timesheets"),
|
||||
'month_ids': fields.function(_analysis_all, multi='analytic_analysis', type='many2many', relation='account_analytic_analysis.summary.month', string='Month'),
|
||||
'user_ids': fields.function(_analysis_all, multi='analytic_analysis', type="many2many", relation='account_analytic_analysis.summary.user', string='User'),
|
||||
'hours_qtt_est': fields.float('Estimation of Hours to Invoice'),
|
||||
|
||||
@@ -22,30 +22,27 @@
|
||||
<xpath expr='//div[@name="duration"]' position="after" version="7.0">
|
||||
<label for="quantity_max"/>
|
||||
<div>
|
||||
<field name="quantity_max" class="oe_inline"/> / Remaining: <field name="remaining_hours" class="oe_inline"/>
|
||||
<field name="quantity_max" class="oe_inline"/>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr='//group[@name="invoice_on_timesheets"]' position="replace">
|
||||
<group name='invoice_on_timesheets' string="Invoice on Timesheets Options" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}" col="4">
|
||||
<field name="pricelist_id" attrs="{'required': [('invoice_on_timesheets', '=', True)]}"/>
|
||||
<field name="to_invoice" widget="selection" attrs="{'required': [('invoice_on_timesheets', '=', True)]}"/>
|
||||
</group>
|
||||
</xpath>
|
||||
<xpath expr='//group[@name="master"]' position='after'>
|
||||
<xpath expr='//separator[@name="description"]' position='before'>
|
||||
<separator name="toinvoice" string="Invoicing"/>
|
||||
<table width="100%%">
|
||||
<table class="oe_form_analytic_account">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th><label string="Est.Tot"/></th>
|
||||
<th><label string="Invoiced"/></th>
|
||||
<th><label string="Remaining"/></th>
|
||||
<th><label string="To Invoice"/></th>
|
||||
<th class="oe_grey" width="160px"></th>
|
||||
<th class="oe_grey" width="25px"></th>
|
||||
<th class="oe_grey" width="100px"><label string="Expected"/></th>
|
||||
<th class="oe_grey" width="100px"><label string="Invoiced"/></th>
|
||||
<th class="oe_grey" width="100px"><label string="Remaining"/></th>
|
||||
<th class="oe_grey" width="100px"><label string="To Invoice"/></th>
|
||||
<th width="30px"></th>
|
||||
<th></th>
|
||||
</tr><tr>
|
||||
<td>
|
||||
<td class="oe_grey">
|
||||
<label for="fix_price_invoices"/>
|
||||
</td><td>
|
||||
</td><td class="oe_grey">
|
||||
<field name="fix_price_invoices" class="oe_inline"/>
|
||||
</td><td>
|
||||
<field class="oe_inline" name="amount_max" attrs="{'invisible': [('fix_price_invoices','=',False)]}"/>
|
||||
@@ -56,13 +53,22 @@
|
||||
</td><td>
|
||||
<field class="oe_inline" name="fix_price_to_invoice" attrs="{'invisible': [('fix_price_invoices','=',False)]}"/>
|
||||
</td><td>
|
||||
<button name="%(action_sales_order)d" string="All Sales" type="action" context="{'default_partner_id': [partner_id], 'search_default_partner_id': [partner_id],'search_default_project_id': [active_id],'default_project_id': [active_id]}" attrs="{'invisible': [('fix_price_invoices','=',False)]}"/>
|
||||
<button name="open_sale_order_lines" string="Lines To Invoice" type="object" context="{'default_partner_id': [partner_id],'default_project_id': active_id,'search_default_uninvoiced': 1,'search_default_project_id': active_id,'search_default_partner_id': [partner_id]}" attrs="{'invisible': [('fix_price_invoices','=',False)]}"/>
|
||||
</td>
|
||||
</tr><tr attrs="{'invisible':[('use_timesheets','=',False)]}">
|
||||
<td>
|
||||
<label for="invoice_on_timesheets"/>
|
||||
<button name="open_sale_order_lines"
|
||||
class="oe_link oe_e"
|
||||
string="/" type="object"
|
||||
context="{'default_partner_id': [partner_id],'default_project_id': active_id,'search_default_uninvoiced': 1,'search_default_project_id': active_id,'search_default_partner_id': [partner_id]}"
|
||||
attrs="{'invisible': [('fix_price_to_invoice','=',0)]}"/>
|
||||
</td><td>
|
||||
<button name="%(action_sales_order)d" string="Sale Orders"
|
||||
type="action"
|
||||
class="oe_link"
|
||||
context="{'default_partner_id': [partner_id], 'search_default_partner_id': [partner_id],'search_default_project_id': [active_id],'default_project_id': [active_id]}"
|
||||
attrs="{'invisible': [('fix_price_invoices','=',False)]}"/>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="oe_grey">
|
||||
<label for="invoice_on_timesheets"/>
|
||||
</td><td class="oe_grey">
|
||||
<field name="invoice_on_timesheets"/>
|
||||
</td><td>
|
||||
<field class="oe_inline" name="hours_qtt_est" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
|
||||
@@ -73,25 +79,44 @@
|
||||
</td><td>
|
||||
<field class="oe_inline" name="ca_to_invoice" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
|
||||
</td><td>
|
||||
<button name="%(hr_timesheet.act_hr_timesheet_line_evry1_all_form)d" string="All Timesheets" type="action" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}" context="{'default_account_id': active_id,'search_default_account_id': active_id}"/>
|
||||
<button name="%(hr_timesheet_invoice.act_acc_analytic_acc_2_report_acc_analytic_line_to_invoice)d" string="Timesheets to Invoice" type="action" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
|
||||
<button name="%(hr_timesheet_invoice.act_acc_analytic_acc_2_report_acc_analytic_line_to_invoice)d"
|
||||
type="action"
|
||||
class="oe_link oe_e"
|
||||
string="/"
|
||||
attrs="{'invisible': [('ca_to_invoice','=',0.0)]}"/>
|
||||
|
||||
</td><td>
|
||||
<button name="%(hr_timesheet.act_hr_timesheet_line_evry1_all_form)d"
|
||||
string="Timesheets" type="action"
|
||||
class="oe_link"
|
||||
attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"
|
||||
context="{'default_account_id': active_id,'search_default_account_id': active_id}"/>
|
||||
</td>
|
||||
</tr><tr name='total'>
|
||||
<th>
|
||||
<th class="oe_grey">
|
||||
<label string="Total"/>
|
||||
</th><td>
|
||||
</td><td>
|
||||
</th><td class="oe_grey">
|
||||
</td><td class="oe_grey">
|
||||
<field name="est_total" class="oe_inline" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}"/>
|
||||
</td><td>
|
||||
</td><td class="oe_grey">
|
||||
<field name="invoiced_total" class="oe_inline"/>
|
||||
</td><td>
|
||||
</td><td class="oe_grey">
|
||||
<field name="remaining_total" class="oe_inline"/>
|
||||
</td><td>
|
||||
</td><td class="oe_grey">
|
||||
<field name="toinvoice_total" class="oe_inline"/>
|
||||
</td><td>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<group name='invoice_on_timesheets' attrs="{'invisible': [('invoice_on_timesheets','=',False)]}">
|
||||
<field name="pricelist_id"
|
||||
class="oe_inline"
|
||||
attrs="{'required': [('invoice_on_timesheets', '=', True)]}"/>
|
||||
<field name="to_invoice"
|
||||
class="oe_inline"
|
||||
widget="selection"
|
||||
attrs="{'required': [('invoice_on_timesheets', '=', True)]}"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
analytic.css: analytic.sass
|
||||
sass -t expanded analytic.sass analytic.css
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
@charset "utf-8";
|
||||
.openerp .oe_form table.oe_form_analytic_account tr {
|
||||
height: 28px;
|
||||
}
|
||||
.openerp .oe_form table.oe_form_analytic_account tr td, .openerp .oe_form table.oe_form_analytic_account tr th {
|
||||
vertical-align: middle;
|
||||
}
|
||||
.openerp .oe_form table.oe_form_analytic_account tr td .oe_form_field_float, .openerp .oe_form table.oe_form_analytic_account tr th .oe_form_field_float {
|
||||
float: right;
|
||||
width: auto !important;
|
||||
}
|
||||
.openerp .oe_form table.oe_form_analytic_account .oe_grey {
|
||||
background-color: #eeeeee;
|
||||
color: #404040;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
@charset "utf-8"
|
||||
|
||||
.openerp .oe_form
|
||||
table.oe_form_analytic_account
|
||||
tr
|
||||
height: 28px
|
||||
td,th
|
||||
vertical-align: middle
|
||||
.oe_form_field_float
|
||||
float: right
|
||||
width: auto !important
|
||||
.oe_grey
|
||||
background-color: #eeeeee
|
||||
color: #404040
|
||||
|
||||
@@ -153,9 +153,9 @@ class account_analytic_account(osv.osv):
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Account Name', size=128, required=True),
|
||||
'name': fields.char('Account/Contract Name', size=128, required=True),
|
||||
'complete_name': fields.function(_complete_name_calc, type='char', string='Full Account Name'),
|
||||
'code': fields.char('Code/Reference', size=24, select=True),
|
||||
'code': fields.char('Reference', size=24, select=True),
|
||||
'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Project')], 'Type of Account', required=True,
|
||||
help="If you select the View Type, it means you won\'t allow to create journal entries using that account.\n"\
|
||||
"The type 'Analytic account' stands for usual accounts that you only want to use in accounting.\n"\
|
||||
@@ -171,7 +171,7 @@ class account_analytic_account(osv.osv):
|
||||
'debit': fields.function(_debit_credit_bal_qtty, type='float', string='Debit', multi='debit_credit_bal_qtty', digits_compute=dp.get_precision('Account')),
|
||||
'credit': fields.function(_debit_credit_bal_qtty, type='float', string='Credit', multi='debit_credit_bal_qtty', digits_compute=dp.get_precision('Account')),
|
||||
'quantity': fields.function(_debit_credit_bal_qtty, type='float', string='Quantity', multi='debit_credit_bal_qtty'),
|
||||
'quantity_max': fields.float('Maximum Time', help='Sets the higher limit of time to work on the contract.'),
|
||||
'quantity_max': fields.float('Prepaid Units', help='Sets the higher limit of time to work on the contract.'),
|
||||
'partner_id': fields.many2one('res.partner', 'Customer'),
|
||||
'user_id': fields.many2one('res.users', 'Project Manager'),
|
||||
'manager_id': fields.many2one('res.users', 'Account Manager'),
|
||||
|
||||
@@ -10,33 +10,35 @@
|
||||
<sheet string="Analytic Account">
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<h1>
|
||||
<field name="name"/>
|
||||
<field name="name" class="oe_inline"/>
|
||||
</h1>
|
||||
<div name="project"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="partner_id" on_change="on_change_partner_id(partner_id, name)" attrs="{'required':[('type','=','contract')]}"/>
|
||||
<field name="parent_id" on_change="on_change_parent(parent_id)" attrs="{'invisible': [('type','in',['contract','template'])]}"/>
|
||||
<field name="type"/>
|
||||
<field name="template_id" on_change="on_change_template(template_id,context)" domain="[('type','=','template')]" attrs="{'invisible': [('type','in',['view', 'normal','template'])]}" context="{'default_type' : 'template'}"/>
|
||||
<field name="manager_id"/>
|
||||
<field name="code"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="code"/>
|
||||
<field name="manager_id"/>
|
||||
<field name="type"/>
|
||||
<field name="parent_id" on_change="on_change_parent(parent_id)" attrs="{'invisible': [('type','in',['contract','template'])]}"/>
|
||||
<field name="template_id" on_change="on_change_template(template_id,context)" domain="[('type','=','template')]" attrs="{'invisible': [('type','in',['view', 'normal','template'])]}" context="{'default_type' : 'template'}"/>
|
||||
<field name="company_id" on_change="on_change_company(company_id)" widget="selection" groups="base.group_multi_company" attrs="{'required': [('type','<>','view')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Contract Information" name="contract_page" attrs="{'invisible':[('type','not in',['contract', 'template'])]}">
|
||||
<group name="master">
|
||||
<group string="Validity" name="contract">
|
||||
<label for="date_start" string="Duration"/>
|
||||
<div name="duration">
|
||||
<field name="date_start" class="oe_inline"/> - <field name="date" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
<group name="project">
|
||||
<separator string="Project Management" name="project_sep" invisible="1"/>
|
||||
</group>
|
||||
<group string="Renewal" name="contract">
|
||||
<p colspan="2" class="oe_grey oe_edit_only">
|
||||
Once the end date of the contract is
|
||||
passed or the maximum number of service
|
||||
units is reached, the account manager
|
||||
is warned by email to renew the contract.
|
||||
</p>
|
||||
<label for="date" string="End Date"/>
|
||||
<div name="duration">
|
||||
<field name="date" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
<separator string="Terms and Conditions" name="description"/>
|
||||
<field name="description"/>
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
<field name="name">account.analytic.account.form.expense.inherit</field>
|
||||
<field name="model">account.analytic.account</field>
|
||||
<field eval="60" name="priority"/>
|
||||
<field name="inherit_id" ref="account_analytic_analysis.account_analytic_account_form_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//tr[@name="total"]' position='before'>
|
||||
<tr>
|
||||
<td>
|
||||
<td class="oe_grey">
|
||||
<label for="charge_expenses"/>
|
||||
</td><td>
|
||||
</td><td class="oe_grey">
|
||||
<field name="charge_expenses"/>
|
||||
</td><td>
|
||||
<field class="oe_form_inline" name="est_expenses" attrs="{'invisible': [('charge_expenses','=',False)]}"/>
|
||||
@@ -21,10 +22,16 @@
|
||||
</td><td>
|
||||
<field class="oe_form_inline" name="expense_to_invoice" attrs="{'invisible': [('charge_expenses','=',False)]}"/>
|
||||
</td><td>
|
||||
<group>
|
||||
<button name="open_hr_expense" string="All Expenses" type="object" attrs="{'invisible': [('charge_expenses','=',False)]}"/>
|
||||
<button name="hr_to_invoice_expense" string="Expenses to Invoice" type="object" attrs="{'invisible': [('charge_expenses','=',False)]}"/>
|
||||
</group>
|
||||
<button
|
||||
name="hr_to_invoice_expense"
|
||||
class="oe_link oe_e"
|
||||
string="/" type="object"
|
||||
attrs="{'invisible': [('expense_to_invoice','=',0)]}"/>
|
||||
</td><td>
|
||||
<button
|
||||
name="open_hr_expense"
|
||||
class="oe_link"
|
||||
string="Expenses" type="object" attrs="{'invisible': [('charge_expenses','=',False)]}"/>
|
||||
</td>
|
||||
</tr>
|
||||
</xpath>
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
<field name="inherit_id" ref="analytic.view_account_analytic_account_form"/>
|
||||
<field name="priority">50</field>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//field[@name="remaining_hours"]' position='after'>
|
||||
<xpath expr='//field[@name="quantity_max"]' position='after'>
|
||||
<field name="company_uom_id" readonly="1" class="oe_inline"/>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
@@ -244,7 +244,7 @@
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_module_vignette">
|
||||
<a type="edit" class="oe_module_icon">
|
||||
<a type="open" class="oe_module_icon">
|
||||
<div class="oe_event_date "><t t-esc="record.date_begin.raw_value.getDate()"/></div>
|
||||
<div class="oe_event_month_year">
|
||||
<t t-esc="record.date_begin.raw_value.toString('MMM')"/>
|
||||
@@ -253,7 +253,7 @@
|
||||
<div class="oe_event_time"><t t-esc="record.date_begin.raw_value.toString('hh:mm tt')"/></div>
|
||||
</a>
|
||||
<div class="oe_module_desc">
|
||||
<h4><a type="edit"><field name="name"/></a></h4>
|
||||
<h4><a type="open"><field name="name"/></a></h4>
|
||||
<p>
|
||||
<t t-if="record.country_id.raw_value">@<field name="country_id"/><br/></t>
|
||||
<t t-if="record.user_id.raw_value">Organized by <field name="user_id"/><br/></t>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<field name="purchase_ok" position="after">
|
||||
<field name="event_ok" on_change="onchange_event_ok(event_ok, context)"/>
|
||||
</field>
|
||||
<field name='supply_method' position='after'>
|
||||
<field name='procure_method' position='before'>
|
||||
<field name="event_type_id" attrs="{'readonly': [('event_ok', '=', False)]}"/>
|
||||
</field>
|
||||
</field>
|
||||
|
||||
@@ -130,11 +130,11 @@
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_employee_vignette">
|
||||
<div class="oe_employee_image">
|
||||
<a type="edit"><img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.value)" class="oe_employee_picture"/></a>
|
||||
<a type="open"><img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.value)" class="oe_employee_picture"/></a>
|
||||
</div>
|
||||
<div class="oe_employee_details">
|
||||
<h4>
|
||||
<a type="edit"><field name="name"/><t t-if="record.login.raw_value"> (<field name="login"/>)</t></a>
|
||||
<a type="open"><field name="name"/><t t-if="record.login.raw_value"> (<field name="login"/>)</t></a>
|
||||
</h4>
|
||||
<ul>
|
||||
<li id="last_login">
|
||||
|
||||
@@ -83,11 +83,9 @@
|
||||
<field name="model">account.analytic.account</field>
|
||||
<field name="inherit_id" ref="analytic.view_account_analytic_account_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//separator[@name="project_sep"]' position='replace'>
|
||||
<separator name="project_sep" string="Project Management" colspan="4"/> <!-- removal of invisible attribute -->
|
||||
</xpath>
|
||||
<xpath expr='//separator[@name="project_sep"]' position='after'>
|
||||
<xpath expr='//div[@name="project"]' position='inside'>
|
||||
<field name="use_timesheets"/>
|
||||
<label for="use_timesheets"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -25,10 +25,10 @@
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="{record.message_is_follower.raw_value} oe_group_vignette">
|
||||
<div class="oe_group_image">
|
||||
<a type="edit"><img t-att-src="kanban_image('mail.group', 'image_medium', record.id.value)" class="oe_group_photo" tooltip="kanban-description"/></a>
|
||||
<a type="open"><img t-att-src="kanban_image('mail.group', 'image_medium', record.id.value)" class="oe_group_photo" tooltip="kanban-description"/></a>
|
||||
</div>
|
||||
<div class="oe_group_details">
|
||||
<h4><a type="edit"><field name="name"/></a></h4>
|
||||
<h4><a type="open"><field name="name"/></a></h4>
|
||||
<ul>
|
||||
<!-- <li><field name="message_follower_count"/> member(s)</li> -->
|
||||
<li>
|
||||
|
||||
+11
-1
@@ -981,11 +981,21 @@
|
||||
</data>
|
||||
</field>
|
||||
</record>
|
||||
<record id="product_normal_form_supply_view" model="ir.ui.view">
|
||||
<field name="name">product.normal.form.mrp.inherit</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='procure_method']" position="after">
|
||||
<field name="supply_method" groups="base.group_user"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_normal_form_view" model="ir.ui.view">
|
||||
<field name="name">product.normal.form.mrp.inherit</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">
|
||||
<page string="Procurement & Locations" position="inside">
|
||||
<separator string="Bill of Materials"/>
|
||||
|
||||
+43
-11
@@ -1,30 +1,62 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from osv import fields, osv
|
||||
import random
|
||||
import re
|
||||
import string
|
||||
import urllib2
|
||||
from tools.translate import _
|
||||
|
||||
class pad_common(osv.osv_memory):
|
||||
_name = 'pad.common'
|
||||
_pad_fields = []
|
||||
|
||||
def pad_generate_url(self, cr, uid, context=None):
|
||||
pad_url_template = self.pool.get('res.users').browse(cr,uid, uid, context).company_id.pad_url_template
|
||||
pad_server = self.pool.get('res.users').browse(cr, uid, uid, context).company_id.pad_server
|
||||
# make sure pad server in the form of http://hostname
|
||||
if not pad_server.startswith('http'):
|
||||
pad_server = 'http://' + pad_server
|
||||
pad_server = pad_server.rstrip('/')
|
||||
# generate a salt
|
||||
s = string.ascii_uppercase + string.digits
|
||||
salt = ''.join([s[random.randint(0, len(s) - 1)] for i in range(8)])
|
||||
template_vars = {
|
||||
'db' : cr.dbname,
|
||||
'model' : self._name,
|
||||
'salt' : salt,
|
||||
}
|
||||
url = pad_url_template % template_vars
|
||||
salt = ''.join([s[random.randint(0, len(s) - 1)] for i in range(10)])
|
||||
# contruct the url
|
||||
url = '%s/p/%s-%s-%s' % (pad_server, cr.dbname, self._name, salt)
|
||||
return url
|
||||
|
||||
def pad_get_content(self, cr, uid, url, context=None):
|
||||
content = ''
|
||||
if url:
|
||||
page = urllib2.urlopen('%s/export/html'%url).read()
|
||||
mo = re.search('<body>(.*)</body>',page)
|
||||
if mo:
|
||||
content = mo.group(1)
|
||||
return content
|
||||
|
||||
# TODO
|
||||
# reverse engineer protocol to be setHtml without using the api key
|
||||
# override read and copy to generate url and store the content if empty
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
data = super(pad_common, self).default_get(cr, uid, fields, context)
|
||||
for k in fields:
|
||||
field = self._all_columns[k].column
|
||||
if hasattr(field,'pad_content_field'):
|
||||
data[k] = self.pad_generate_url(cr, uid, context=context)
|
||||
return data
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
for k,v in vals.items():
|
||||
field = self._all_columns[k].column
|
||||
if hasattr(field,'pad_content_field'):
|
||||
vals[field.pad_content_field] = self.pad_get_content(cr, uid, v, context=context)
|
||||
return super(pad_common, self).write(cr, uid, ids, vals, context=context)
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if not default:
|
||||
default = {}
|
||||
update = [(field,self.pad_generate_url(cr, uid, context)) for field in self._pad_fields]
|
||||
default.update(update)
|
||||
for k,v in self._all_columns:
|
||||
field = v.column
|
||||
if hasattr(field,'pad_content_field'):
|
||||
default[k] = self.pad_generate_url(cr, uid, context)
|
||||
return super(pad_common, self).copy(cr, uid, id, default, context)
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from osv import fields, osv
|
||||
|
||||
DEFAULT_PAD_TEMPLATE = 'http://beta.etherpad.org/p/%(db)s-%(model)s-%(salt)s'
|
||||
|
||||
class company_pad(osv.osv):
|
||||
_inherit = 'res.company'
|
||||
_columns = {
|
||||
'pad_url_template': fields.char('Pad URL Template', size=128, required=True, help="Template used to generate pad URL."),
|
||||
}
|
||||
_defaults = {
|
||||
'pad_url_template': DEFAULT_PAD_TEMPLATE,
|
||||
'pad_server': fields.char('Pad Server', help="Etherpad lite server. Example: beta.primarypad.com"),
|
||||
'pad_key': fields.char('Pad Api Key', help="Etherpad lite api key."),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//group[@name='account_grp']" position="after">
|
||||
<group string="Pads">
|
||||
<field name="pad_url_template" placeholder="e.g. http://beta.etherpad.org/p/%%(db)s-%%(model)s-%%(salt)s"/>
|
||||
<field name="pad_server" placeholder="e.g. beta.primarypad.org"/>
|
||||
<field name="pad_key"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
@@ -1,52 +1,39 @@
|
||||
.oe_etherpad_head{
|
||||
.oe_pad_head {
|
||||
width: 100%;
|
||||
display: block;
|
||||
padding-left:3px;
|
||||
cursor:pointer;
|
||||
padding: 4px;
|
||||
}
|
||||
.oe_etherpad_fullscreen div.oe_etherpad_head .oe_normal {
|
||||
display: none;
|
||||
|
||||
.oe_pad_readonly {
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
}
|
||||
.oe_etherpad_normal div.oe_etherpad_head .oe_fullscreen {
|
||||
display: none;
|
||||
}
|
||||
.oe_etherpad_fullscreen {
|
||||
|
||||
.oe_pad_fullscreen {
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
z-index:10001 !important;
|
||||
}
|
||||
.etherpad_default{
|
||||
width: 100%;
|
||||
height: 450px;
|
||||
}
|
||||
.oe_etherpad_fullscreen .etherpad_default{
|
||||
height: 100%
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.etherpad_body{
|
||||
overflow:hidden;
|
||||
.oe_pad_fullscreen .oe_pad_content {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.etherpad_readonly{
|
||||
width: 100%;
|
||||
height: 450px;
|
||||
overflow:auto;
|
||||
.etherpad_readonly ul, .etherpad_readonly ol {
|
||||
margin-before: 1em;
|
||||
margin-after: 1em;
|
||||
margin-start: 0px;
|
||||
margin-end: 0px;
|
||||
padding-start: 40px !important;
|
||||
}
|
||||
.etherpad_readonly ul,.etherpad_readonly ol{
|
||||
-webkit-margin-before: 1em;
|
||||
-webkit-margin-after: 1em;
|
||||
-webkit-margin-start: 0px;
|
||||
-webkit-margin-end: 0px;
|
||||
-webkit-padding-start: 40px !important;
|
||||
}
|
||||
.etherpad_readonly ul li{
|
||||
.etherpad_readonly ul li{
|
||||
list-style-type: disc;
|
||||
}
|
||||
.etherpad_readonly ol li{
|
||||
.etherpad_readonly ol li{
|
||||
list-style-type: decimal;
|
||||
}
|
||||
.etherpad_readonly .indent li{
|
||||
|
||||
@@ -1,32 +1,41 @@
|
||||
openerp.pad = function(instance) {
|
||||
|
||||
instance.web.form.FieldPad = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
|
||||
instance.web.form.FieldPad = instance.web.form.AbstractField.extend({
|
||||
template: 'FieldPad',
|
||||
initialize_content: function() {
|
||||
start: function() {
|
||||
this._super();
|
||||
var self = this;
|
||||
this.$textarea = undefined;
|
||||
this.$el.find('div.oe_etherpad_head').click(function(ev) {
|
||||
self.$el.toggleClass('oe_etherpad_fullscreen').toggleClass('oe_etherpad_normal');
|
||||
this.$el.find('div.oe_pad_head').click(function(ev) {
|
||||
self.$el.toggleClass('oe_pad_fullscreen');
|
||||
});
|
||||
this.on("change:effective_readonly", this, function() {
|
||||
this.render_value();
|
||||
});
|
||||
},
|
||||
set_value: function(value_) {
|
||||
this._super(value_);
|
||||
this.render_value();
|
||||
set_value: function(val) {
|
||||
var self = this;
|
||||
var _super = self._super;
|
||||
_super.apply(self,[val]);
|
||||
this._dirty_flag = true;
|
||||
self.render_value();
|
||||
},
|
||||
render_value: function() {
|
||||
console.log("display");
|
||||
var self = this;
|
||||
var value = this.get('value');
|
||||
if(value !== false) {
|
||||
var url = value.split('\n')[0];
|
||||
|
||||
if (!_.str.startsWith(value, "http")) {
|
||||
self.$('.oe_pad_content').html(instance.web.qweb.render('FieldPad.unconfigured'));
|
||||
} else {
|
||||
if (!this.get("effective_readonly")) {
|
||||
var pad_username = this.session.username;
|
||||
var code = '<iframe width="100%" height="100%" frameborder="0" src="'+url+'?showChat=false&userName='+pad_username+'"></iframe>';
|
||||
this.$el.find('div.oe_etherpad_default').html(code);
|
||||
var code = '<iframe width="100%" height="100%" frameborder="0" src="'+value+'?showChat=false&userName='+pad_username+'"></iframe>';
|
||||
this.$('.oe_pad_content').html(code);
|
||||
} else {
|
||||
$.get(url+'/export/html').success(function(data) {
|
||||
self.$el.html('<div class="etherpad_readonly">'+data+'</div>');
|
||||
$.get(value+'/export/html').success(function(data) {
|
||||
self.$('.oe_pad_content').html('<div class="oe_pad_readonly">'+data+'</div>');
|
||||
}).error(function() {
|
||||
self.$el.text('Unable to load pad');
|
||||
self.$('.oe_pad_content').text('Unable to load pad');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,17 +2,16 @@
|
||||
<!-- vim:fdl=1:
|
||||
-->
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
<t t-name="FieldPad">
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<div class="oe_form_field_text oe_etherpad_normal">
|
||||
<div class="oe_etherpad_head">
|
||||
<span class="oe_normal">Fullscreen</span>
|
||||
<span class="oe_fullscreen">Return to Record</span>
|
||||
</div>
|
||||
<div class="oe_etherpad_default" ></div>
|
||||
<div class="oe_form_field_text oe_pad">
|
||||
<div class="oe_pad_head">
|
||||
<span class="oe_pad_switch">Fullscreen</span>
|
||||
</div>
|
||||
</t>
|
||||
<div class="oe_pad_content"></div>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="FieldPad.unconfigured">
|
||||
Please configure your etherpad server.<br/>
|
||||
OpenERP Entreprise customers may safely use pad.openerp.com<br/>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -5,10 +5,6 @@ from osv import fields, osv
|
||||
class task(osv.osv):
|
||||
_name = "project.task"
|
||||
_inherit = ["project.task",'pad.common']
|
||||
_pad_fields = ['description_pad']
|
||||
_columns = {
|
||||
'description_pad': fields.char('Description PAD', size=250)
|
||||
}
|
||||
_defaults = {
|
||||
'description_pad': lambda self, cr, uid, context: self.pad_generate_url(cr, uid, context),
|
||||
'description_pad': fields.char('Description PAD', pad_content_field='description')
|
||||
}
|
||||
|
||||
@@ -625,7 +625,7 @@
|
||||
<record id="product_normal_form_view" model="ir.ui.view">
|
||||
<field name="name">product.normal.form.inherit</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">
|
||||
<group name="misc" position="after">
|
||||
<group name="pos" colspan="2" col="2">
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
</div>
|
||||
<div class="oe_employee_details">
|
||||
<h4>
|
||||
<a type="edit"><field name="name"/><t t-if="record.login.raw_value"> (<field name="login"/>)</t></a>
|
||||
<a type="open"><field name="name"/><t t-if="record.login.raw_value"> (<field name="login"/>)</t></a>
|
||||
</h4>
|
||||
<ul>
|
||||
<li t-if="record.job_id.raw_value"><field name="job_id"/></li>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<div class="oe_kanban_card oe_kanban_global_click">
|
||||
<div class="oe_kanban_content">
|
||||
<div>
|
||||
<h1><a type="edit"><field name="name"/></a></h1>
|
||||
<h1><a type="open"><field name="name"/></a></h1>
|
||||
<field name="partner_id"/> <br/>
|
||||
<field name="version_id"/>
|
||||
</div>
|
||||
|
||||
@@ -286,7 +286,7 @@
|
||||
<record id="product_normal_form_view" model="ir.ui.view">
|
||||
<field name="name">product.normal.form.orderpoint.inherit</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">
|
||||
<page string="Procurement & Locations" position="inside">
|
||||
<separator string="Minimum Stock Rules"/>
|
||||
|
||||
@@ -541,7 +541,7 @@ class product_product(osv.osv):
|
||||
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the product without removing it."),
|
||||
'variants': fields.char('Variants', size=64),
|
||||
'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete="cascade"),
|
||||
'ean13': fields.char('EAN13', size=13, help="The numbers encoded in EAN-13 bar codes are product identification numbers."),
|
||||
'ean13': fields.char('EAN13 Barcode', size=13, help="The numbers encoded in EAN-13 bar codes are product identification numbers."),
|
||||
'packaging' : fields.one2many('product.packaging', 'product_id', 'Logistical Units', help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."),
|
||||
'price_extra': fields.float('Variant Price Extra', digits_compute=dp.get_precision('Product Price')),
|
||||
'price_margin': fields.float('Variant Price Margin', digits_compute=dp.get_precision('Product Price')),
|
||||
|
||||
@@ -86,12 +86,11 @@
|
||||
</group>
|
||||
<group string="Procurement">
|
||||
<field name="type"/>
|
||||
<field name="procure_method" groups="base.group_user"/>
|
||||
<field name="supply_method" groups="base.group_user"/>
|
||||
<field name="procure_method" groups="base.group_user" attrs="{'invisible':[('type','=', 'service')]}"/>
|
||||
</group>
|
||||
<group string="Prices">
|
||||
<field name="list_price"/>
|
||||
<field name="cost_method" groups="base.group_user"/>
|
||||
<field name="cost_method" groups="product.group_costing_method"/>
|
||||
<field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
|
||||
<field name="price_margin" groups="product.group_product_variant"/>
|
||||
<field name="price_extra" groups="product.group_product_variant"/>
|
||||
@@ -118,28 +117,6 @@
|
||||
|
||||
</group>
|
||||
</page>
|
||||
<page string="Procurement & Locations" groups="base.group_user">
|
||||
<group>
|
||||
<group name="delay" string="Delays">
|
||||
<field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/>
|
||||
<field name="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
|
||||
<field name="warranty"/>
|
||||
</group>
|
||||
<group name="store" string="Storage Localisation">
|
||||
<field name="loc_rack" attrs="{'readonly':[('type','=','service')]}"/>
|
||||
<field name="loc_row" attrs="{'readonly':[('type','=','service')]}"/>
|
||||
<field name="loc_case" attrs="{'readonly':[('type','=','service')]}"/>
|
||||
</group>
|
||||
<group name="misc" string="Miscellaneous">
|
||||
<field name="active"/>
|
||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
</page>
|
||||
<page string="Suppliers" groups="base.group_user">
|
||||
<field name="seller_ids" context="{'uom_id': uom_id}"/>
|
||||
</page>
|
||||
<page string="Descriptions" groups="base.group_user">
|
||||
<separator string="Description"/>
|
||||
<field name="description"/>
|
||||
|
||||
@@ -23,7 +23,12 @@
|
||||
<field name="name">Purchase Pricelists</field>
|
||||
<field name="category_id" ref="base.module_category_hidden"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="group_costing_method" model="res.groups">
|
||||
<field name="name">Costing Method</field>
|
||||
<field name="category_id" ref="base.module_category_hidden"/>
|
||||
</record>
|
||||
|
||||
<record id="group_uom" model="res.groups">
|
||||
<field name="name">Manage Multiple Units of Measure</field>
|
||||
<field name="category_id" ref="base.module_category_hidden"/>
|
||||
|
||||
@@ -245,8 +245,8 @@
|
||||
<a t-if="record.use_tasks.raw_value" name="%(act_project_project_2_project_task_all)d" type="action"> <field name="task_count"/> Tasks</a>
|
||||
</div>
|
||||
<table>
|
||||
<tr t-if="record.date.raw_value">
|
||||
<th class="oe_kanban_project_fields oe_kanban_project_deadline">Deadline</th>
|
||||
<tr class="oe_kanban_project_fields oe_kanban_project_deadline" t-if="record.date.raw_value">
|
||||
<th>Deadline</th>
|
||||
<td><field name="date"/></td>
|
||||
</tr>
|
||||
<tr class="oe_kanban_project_fields oe_kanban_project_progress">
|
||||
@@ -688,11 +688,9 @@
|
||||
<field name="inherit_id" ref="analytic.view_account_analytic_account_form"/>
|
||||
<field eval="18" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//separator[@name="project_sep"]' position='replace'>
|
||||
<separator colspan="4" string="Project Management" name="project_sep"/> <!-- removal of invisible attribute -->
|
||||
</xpath>
|
||||
<xpath expr='//separator[@name="project_sep"]' position='after'>
|
||||
<xpath expr='//div[@name="project"]' position='inside'>
|
||||
<field name="use_tasks"/>
|
||||
<label for="use_tasks"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -393,11 +393,9 @@
|
||||
<field name="inherit_id" ref="project.analytic_account_inherited_form"/>
|
||||
<field eval="18" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr='//separator[@name="project_sep"]' position='replace'>
|
||||
<separator colspan="4" string="Project Management" name="project_sep"/> <!-- removal of invisible attribute -->
|
||||
</xpath>
|
||||
<xpath expr='//separator[@name="project_sep"]' position='after'>
|
||||
<xpath expr='//div[@name="project"]' position='inside'>
|
||||
<field name="use_issues"/>
|
||||
<label for="use_issues"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<record id="view_product_task_form" model="ir.ui.view">
|
||||
<field name="name">product.form.view.inherit</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">
|
||||
<field name="active" position="after">
|
||||
<field name="project_id" attrs="{'readonly':[('type','!=','service')]}" />
|
||||
|
||||
@@ -17,13 +17,16 @@
|
||||
<a t-if="record.use_timesheets.raw_value"
|
||||
name="open_timesheets" type="object">Timesheets(<field name="timesheet_count"/>)</a>
|
||||
</xpath>
|
||||
<xpath expr="//div[contains(@class, 'oe_kanban_project_deadline')]" position="before">
|
||||
<div class="oe_kanban_project_fields oe_kanban_project_invoice" t-if="record.partner_id.raw_value">
|
||||
<div>Amount to invoice</div>
|
||||
<div><field name="amount_to_invoice"/> <t t-esc="record.currency_id.raw_value[1].split(' ')[1][1]"/></div>
|
||||
<div>Time to Invoice</div>
|
||||
<div><field name="time_to_invoice"/> <field name="company_uom_id"/></div>
|
||||
</div>
|
||||
<xpath expr="//tr[contains(@class, 'oe_kanban_project_deadline')]" position="before">
|
||||
|
||||
<tr class="oe_kanban_project_fields oe_kanban_project_invoice" t-if="record.partner_id.raw_value">
|
||||
<th>Amount to invoice</th>
|
||||
<td><field name="amount_to_invoice"/> <t t-esc="record.currency_id.raw_value[1].split(' ')[1][1]"/></td>
|
||||
</tr>
|
||||
<tr class="oe_kanban_project_fields oe_kanban_project_invoice" t-if="record.partner_id.raw_value">
|
||||
<th>Time to Invoice</th>
|
||||
<td><field name="time_to_invoice"/> <field name="company_uom_id"/></td>
|
||||
</tr>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -554,5 +554,20 @@
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Product Suppliers-->
|
||||
|
||||
<record id="view_product_supplier_inherit" model="ir.ui.view">
|
||||
<field name="name">product.normal.supplier.form.inherit</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[@string='Descriptions']" position="before">
|
||||
<page string="Suppliers" groups="base.group_user">
|
||||
<field name="seller_ids" context="{'uom_id': uom_id}"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -40,6 +40,9 @@ class purchase_config_settings(osv.osv_memory):
|
||||
'group_uom':fields.boolean("manage different units of measure for products",
|
||||
implied_group='product.group_uom',
|
||||
help="""Allows you to select and maintain different units of measure for products."""),
|
||||
'group_costing_method':fields.boolean("compute product cost price based on average cost",
|
||||
implied_group='product.group_costing_method',
|
||||
help="""Allows you to compute product cost price based on average cost."""),
|
||||
'group_purchase_delivery_address': fields.boolean("allow a different address for incoming products and invoicings",
|
||||
implied_group='purchase.group_delivery_invoice_address',
|
||||
help="Allows you to specify different delivery and invoice addresses on a purchase order."),
|
||||
|
||||
@@ -59,6 +59,10 @@
|
||||
<field name="group_purchase_delivery_address" class="oe_inline"/>
|
||||
<label for="group_purchase_delivery_address"/>
|
||||
</div>
|
||||
<div>
|
||||
<field name="group_costing_method" class="oe_inline"/>
|
||||
<label for="group_costing_method"/>
|
||||
</div>
|
||||
<div name="module_purchase_double_validation">
|
||||
<field name="module_purchase_double_validation" class="oe_inline"/>
|
||||
<label for="module_purchase_double_validation"/>
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="supply_method" position="after">
|
||||
<field name="procure_method" position="before">
|
||||
<group colspan="2" col="2" attrs="{'invisible': [('supply_method','<>','buy')]}">
|
||||
<field name="purchase_requisition"/>
|
||||
</group>
|
||||
|
||||
@@ -50,6 +50,40 @@
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_normal_procurement_locations_form" model="ir.ui.view">
|
||||
<field name="name">product.normal.procurement.locations.inherit</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<notebook position="inside">
|
||||
<page string="Procurement & Locations" groups="base.group_user">
|
||||
<group>
|
||||
<group name="delay" string="Delays">
|
||||
<field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/>
|
||||
<field name="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
|
||||
<field name="warranty"/>
|
||||
</group>
|
||||
<group name="store" string="Storage Localisation">
|
||||
<field name="loc_rack" attrs="{'readonly':[('type','=','service')]}"/>
|
||||
<field name="loc_row" attrs="{'readonly':[('type','=','service')]}"/>
|
||||
<field name="loc_case" attrs="{'readonly':[('type','=','service')]}"/>
|
||||
</group>
|
||||
<group name="store" groups="stock.group_locations">
|
||||
<separator string="Counter-Part Locations Properties" colspan="2"/>
|
||||
<field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
|
||||
<field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
|
||||
<field name="property_stock_inventory" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
|
||||
</group>
|
||||
<group name="misc" string="Miscellaneous">
|
||||
<field name="active"/>
|
||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_product_standard_price_form" model="ir.ui.view">
|
||||
<field name="name">product.product.standard.price.form.inherit</field>
|
||||
@@ -178,10 +212,10 @@
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_product_vignette">
|
||||
<div class="oe_product_img">
|
||||
<a type="edit"><img t-att-src="kanban_image('product.product', 'image_medium', record.id.value)" class="oe_product_photo"/></a>
|
||||
<a type="open"><img t-att-src="kanban_image('product.product', 'image_medium', record.id.value)" class="oe_product_photo"/></a>
|
||||
</div>
|
||||
<div class="oe_product_desc">
|
||||
<h4><a type="edit"><field name="name"></field></a></h4>
|
||||
<h4><a type="open"><field name="name"></field></a></h4>
|
||||
<ul>
|
||||
<li t-if="record.code.raw_value">Code: <field name="code"/></li>
|
||||
<li t-if="record.type.raw_value != 'service'">Stock on hand: <field name="qty_available"/> <field name="uom_id"/></li>
|
||||
@@ -210,21 +244,5 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_normal_property_form" model="ir.ui.view">
|
||||
<field name="name">product.normal.stock.property.form.inherit</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<group name="store" position="after">
|
||||
<group name="store" groups="stock.group_locations">
|
||||
<separator string="Counter-Part Locations Properties" colspan="2"/>
|
||||
<field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
|
||||
<field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
|
||||
<field name="property_stock_inventory" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
|
||||
</group>
|
||||
</group>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
Reference in New Issue
Block a user