bzr revid: apa@tinyerp.com-20120830050811-n0pdxdbvg2ezelmc
This commit is contained in:
Amit Patel (OpenERP)
2012-08-30 10:38:11 +05:30
40 changed files with 337 additions and 218 deletions
+1 -1
View File
@@ -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','&lt;&gt;','view'),('type','&lt;&gt;','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
+3 -3
View File
@@ -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'),
+18 -16
View File
@@ -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','&lt;&gt;','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>
+2 -2
View File
@@ -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>
+1 -1
View File
@@ -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>
+2 -2
View File
@@ -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">
+2 -4
View File
@@ -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>
+2 -2
View File
@@ -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
View File
@@ -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 &amp; Locations" position="inside">
<separator string="Bill of Materials"/>
+43 -11
View File
@@ -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:
+2 -6
View File
@@ -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."),
}
+2 -1
View File
@@ -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>
+19 -32
View File
@@ -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{
+24 -15
View File
@@ -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');
});
}
}
+9 -10
View File
@@ -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>
+1 -5
View File
@@ -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')
}
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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 &amp; Locations" position="inside">
<separator string="Minimum Stock Rules"/>
+1 -1
View File
@@ -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')),
+2 -25
View File
@@ -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 &amp; 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"/>
+6 -1
View File
@@ -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"/>
+4 -6
View File
@@ -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>
+2 -4
View File
@@ -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>
+1 -1
View File
@@ -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>
+15
View File
@@ -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>
+3
View File
@@ -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."),
+4
View File
@@ -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','&lt;&gt;','buy')]}">
<field name="purchase_requisition"/>
</group>
+36 -18
View File
@@ -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 &amp; 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>