Date: Thu, 18 Oct 2012 16:33:32 +0200
Subject: [PATCH 107/150] [FIX] account: print overdue report
bzr revid: qdp-launchpad@openerp.com-20121018143332-rwbydw558m1jgp13
---
addons/account/report/account_print_overdue.rml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/account/report/account_print_overdue.rml b/addons/account/report/account_print_overdue.rml
index 1755f0a334d..3e8b9b04b62 100644
--- a/addons/account/report/account_print_overdue.rml
+++ b/addons/account/report/account_print_overdue.rml
@@ -129,7 +129,7 @@
[[ o.title.name or '' ]] [[ o.name ]]
- [[ display_address(o.id) ]]
+ [[ display_address(o) ]]
From 536cb8775c7f5511f7e70595c19a0260dfbc1937 Mon Sep 17 00:00:00 2001
From: "Quentin (OpenERP)"
Date: Thu, 18 Oct 2012 20:43:23 +0200
Subject: [PATCH 108/150] [TEST] removing values at record creation in yaml
bzr revid: qdp-launchpad@openerp.com-20121018184323-5kq9fb54slij3ioo
---
openerp/tools/yaml_import.py | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py
index 7e1c7152b0f..1a81db949ee 100644
--- a/openerp/tools/yaml_import.py
+++ b/openerp/tools/yaml_import.py
@@ -425,7 +425,19 @@ class YamlInterpreter(object):
continue
field_value = self._eval_field(model, field_name, expression, default=False)
record_dict[field_name] = field_value
-
+ if 'line_cr_ids' in record_dict and record_dict['line_cr_ids']:
+ for item in record_dict['line_cr_ids']:
+ if item[2] and 'date_original' in item[2]:
+ del(item[2]['date_original'])
+ if item[2] and 'date_original' in item[2]:
+ del(item[2]['date_due'])
+ if 'line_dr_ids' in record_dict and record_dict['line_dr_ids']:
+ for item in record_dict['line_dr_ids']:
+ if item[2] and 'date_original' in item[2]:
+ del(item[2]['date_original'])
+ if item[2] and 'date_original' in item[2]:
+ del(item[2]['date_due'])
+ print "ICICICICICICI", record_dict
return record_dict
def process_ref(self, node, column=None):
From 96254074d75c2420eebc43bba5ca4f24ee536eb7 Mon Sep 17 00:00:00 2001
From: "RGA(OpenERP)" <>
Date: Fri, 19 Oct 2012 16:23:04 +0530
Subject: [PATCH 109/150] [FIX] reconcile view: use backbone event
architecture, remove .add
bzr revid: rgaopenerp-20121019105304-9ddz8q763prmxdg0
---
.../static/src/js/account_move_reconciliation.js | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/addons/account/static/src/js/account_move_reconciliation.js b/addons/account/static/src/js/account_move_reconciliation.js
index e8bf24fb27f..100ac3b66b9 100644
--- a/addons/account/static/src/js/account_move_reconciliation.js
+++ b/addons/account/static/src/js/account_move_reconciliation.js
@@ -11,15 +11,15 @@ openerp.account = function (instance) {
this._super.apply(this, arguments);
var self = this;
this.current_partner = null;
- this.do_select.add(function() {
- if (self.get_selected_ids().length === 0) {
+ this.on('record_selected', this, function(ids, records) {
+ if (ids.length === 0) {
self.$(".oe_account_recon_reconcile").attr("disabled", "");
} else {
self.$(".oe_account_recon_reconcile").removeAttr("disabled");
}
});
},
- on_loaded: function() {
+ load_list: function() {
var self = this;
var tmp = this._super.apply(this, arguments);
if (this.partners) {
@@ -121,6 +121,10 @@ openerp.account = function (instance) {
self.do_search(self.last_domain, self.last_context, self.last_group_by);
});
},
+ do_select: function (ids, records) {
+ this.trigger('record_selected', ids, records)
+ this._super.apply(this, arguments);
+ },
});
};
From 820c2551bba2332677e64899950c53ed9f0e4b1d Mon Sep 17 00:00:00 2001
From: "Quentin (OpenERP)"
Date: Fri, 19 Oct 2012 13:06:04 +0200
Subject: [PATCH 110/150] [IMP] tools, yaml_import: the values given to the
creation should only include the fields that aren't readonly in the view.
Because that's what clients do
bzr revid: qdp-launchpad@openerp.com-20121019110604-1gvfcgqvwd1izh71
---
openerp/tools/yaml_import.py | 56 +++++++++++++++++++++++-------------
1 file changed, 36 insertions(+), 20 deletions(-)
diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py
index 1a81db949ee..501ab30d879 100644
--- a/openerp/tools/yaml_import.py
+++ b/openerp/tools/yaml_import.py
@@ -330,7 +330,7 @@ class YamlInterpreter(object):
def _create_record(self, model, fields, view_info=False, parent={}, default=True):
"""This function processes the !record tag in yalm files. It simulates the record creation through an xml
view (either specified on the !record tag or the default one for this object), including the calls to
- on_change() functions.
+ on_change() functions, and sending only values for fields that aren't set as readonly.
:param model: model instance
:param fields: dictonary mapping the field names and their values
:param view_info: result of fields_view_get() called on the object
@@ -339,6 +339,13 @@ class YamlInterpreter(object):
:return: dictionary mapping the field names and their values, ready to use when calling the create() function
:rtype: dict
"""
+ def _get_right_one2many_view(fg, field_name, view_type):
+ one2many_view = fg[field_name]['views'].get(view_type)
+ # if the view is not defined inline, we call fields_view_get()
+ if not one2many_view:
+ one2many_view = self.pool.get(fg[field_name]['relation']).fields_view_get(self.cr, SUPERUSER_ID, False, view_type, self.context)
+ return one2many_view
+
def process_val(key, val):
if fg[key]['type']=='many2one':
if type(val) in (tuple,list):
@@ -347,7 +354,28 @@ class YamlInterpreter(object):
if val is False:
val = []
if len(val) and type(val[0]) == dict:
+ #we want to return only the fields that aren't readonly
+ #For that, we need to first get the right tree view to consider for the field `key´
+ one2many_tree_view = _get_right_one2many_view(fg, key, 'tree')
+ for rec in val:
+ #make a copy for the iteration, as we will alterate the size of `rec´ dictionary
+ rec_copy = rec.copy()
+ for field_key in rec_copy:
+ #seek in the view for the field `field_key´ and removing it from `key´ values, as this column is readonly in the tree view
+ subfield_obj = etree.fromstring(one2many_tree_view['arch'].encode('utf-8')).xpath("//field[@name='%s']"%(field_key))
+ if subfield_obj and (subfield_obj[0].get('modifiers', '{}').find('"readonly": true') >= 0):
+ #TODO: currently we only support if readonly is True in the modifiers. Some improvement may be done in
+ #order to support also modifiers that look like {"readonly": [["state", "not in", ["draft", "confirm"]]]}
+ del(rec[field_key])
+
+ #now that unwanted values have been removed from val, we can encapsulate it in a tuple as returned value
val = map(lambda x: (0,0,x), val)
+
+ #we want to return only the fields that aren't readonly
+ if el.get('modifiers', '{}').find('"readonly": true') >= 0:
+ #TODO: currently we only support if readonly is True in the modifiers. Some improvement may be done in
+ #order to support also modifiers that look like {"readonly": [["state", "not in", ["draft", "confirm"]]]}
+ return False
return val
view = view_info and etree.fromstring(view_info['arch'].encode('utf-8')) or False
@@ -373,13 +401,14 @@ class YamlInterpreter(object):
one2many_form_view = None
if (view is not False) and (fg[field_name]['type']=='one2many'):
# for one2many fields, we want to eval them using the inline form view defined on the parent
- one2many_form_view = view_info['fields'][field_name]['views'].get('form')
- # if the form view is not defined inline, we call fields_view_get()
- if not one2many_form_view:
- one2many_form_view = self.pool.get(fg[field_name]['relation']).fields_view_get(self.cr, SUPERUSER_ID, False, 'form', self.context)
+ one2many_form_view = _get_right_one2many_view(fg, field_name, 'form')
field_value = self._eval_field(model, field_name, fields[field_name], one2many_form_view or view_info, parent=record_dict, default=default)
- record_dict[field_name] = field_value
+
+ #call process_val to not update record_dict if values were given for readonly fields
+ val = process_val(field_name, field_value)
+ if val:
+ record_dict[field_name] = val
#if (field_name in defaults) and defaults[field_name] == field_value:
# print '*** You can remove these lines:', field_name, field_value
@@ -405,7 +434,7 @@ class YamlInterpreter(object):
ctx['parent'] = parent2(parent)
for a in fg:
if a not in ctx:
- ctx[a]=process_val(a, defaults.get(a, False))
+ ctx[a] = process_val(a, defaults.get(a, False))
# Evaluation args
args = map(lambda x: eval(x, ctx), match.group(2).split(','))
@@ -425,19 +454,6 @@ class YamlInterpreter(object):
continue
field_value = self._eval_field(model, field_name, expression, default=False)
record_dict[field_name] = field_value
- if 'line_cr_ids' in record_dict and record_dict['line_cr_ids']:
- for item in record_dict['line_cr_ids']:
- if item[2] and 'date_original' in item[2]:
- del(item[2]['date_original'])
- if item[2] and 'date_original' in item[2]:
- del(item[2]['date_due'])
- if 'line_dr_ids' in record_dict and record_dict['line_dr_ids']:
- for item in record_dict['line_dr_ids']:
- if item[2] and 'date_original' in item[2]:
- del(item[2]['date_original'])
- if item[2] and 'date_original' in item[2]:
- del(item[2]['date_due'])
- print "ICICICICICICI", record_dict
return record_dict
def process_ref(self, node, column=None):
From 8ca8f50656740a3204e85358683f6c93671182a8 Mon Sep 17 00:00:00 2001
From: "Quentin (OpenERP)"
Date: Fri, 19 Oct 2012 13:07:20 +0200
Subject: [PATCH 111/150] [FIX] account_voucher: fixed yaml test in order to
reflect what the client are really sending as information
bzr revid: qdp-launchpad@openerp.com-20121019110720-xhkhzd04caczsz41
---
addons/account_voucher/account_voucher.py | 2 +-
addons/account_voucher/test/account_voucher.yml | 1 -
addons/account_voucher/test/sales_payment.yml | 5 ++++-
addons/account_voucher/test/sales_receipt.yml | 1 -
4 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index 648576443a0..3ae421308b5 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -1422,7 +1422,7 @@ class account_voucher_line(osv.osv):
}
def onchange_reconcile(self, cr, uid, ids, reconcile, amount, amount_unreconciled, context=None):
- vals = { 'amount': 0.0}
+ vals = {'amount': 0.0}
if reconcile:
vals = { 'amount': amount_unreconciled}
return {'value': vals}
diff --git a/addons/account_voucher/test/account_voucher.yml b/addons/account_voucher/test/account_voucher.yml
index f8e20f496e5..c9270dc695c 100644
--- a/addons/account_voucher/test/account_voucher.yml
+++ b/addons/account_voucher/test/account_voucher.yml
@@ -53,7 +53,6 @@
account_id: account.cash
amount: 1000.0
company_id: base.main_company
- currency_id: base.EUR
journal_id: account.bank_journal
name: Voucher Axelor
narration: PC Assemble SC234
diff --git a/addons/account_voucher/test/sales_payment.yml b/addons/account_voucher/test/sales_payment.yml
index 88f10e55918..b71e42add0b 100644
--- a/addons/account_voucher/test/sales_payment.yml
+++ b/addons/account_voucher/test/sales_payment.yml
@@ -45,7 +45,6 @@
'account_id': ref('account.cash'),
'amount': 450.0,
'company_id': ref('base.main_company'),
- 'currency_id': ref('base.EUR'),
'journal_id': ref('account.bank_journal'),
'partner_id': ref('base.res_partner_19'),
'period_id': ref('account.period_8'),
@@ -53,6 +52,10 @@
}
if not res['value']['line_cr_ids']:
res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
+ #clients aren't sending value of readonly fields in the view, and there is a good reason for that, so here the
+ #create should only use values of fields that are not readonly. That's why i'm removing some of these values
+ del(res['value']['line_cr_ids'][0]['date_original'])
+ del(res['value']['line_cr_ids'][0]['date_due'])
res['value']['line_cr_ids'][0]['amount'] = 450.0
vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
id = self.create(cr, uid, vals)
diff --git a/addons/account_voucher/test/sales_receipt.yml b/addons/account_voucher/test/sales_receipt.yml
index 7cd82eecaff..cf4bc5c46d3 100644
--- a/addons/account_voucher/test/sales_receipt.yml
+++ b/addons/account_voucher/test/sales_receipt.yml
@@ -53,7 +53,6 @@
'account_id': ref('account.cash'),
'amount': 30000.0,
'company_id': ref('base.main_company'),
- 'currency_id': ref('base.EUR'),
'journal_id': ref('account.bank_journal'),
'partner_id': ref('base.res_partner_19'),
'period_id': ref('account.period_8'),
From b5f8932458fb35c51e26c090df0fad6f50f2acd5 Mon Sep 17 00:00:00 2001
From: "Quentin (OpenERP)"
Date: Fri, 19 Oct 2012 13:54:25 +0200
Subject: [PATCH 112/150] [FIX] hr_timesheet: fixed yaml test that as giving a
value for a related readonly field
bzr revid: qdp-launchpad@openerp.com-20121019115425-97fxn854e3icp3dm
---
addons/hr_timesheet/test/test_hr_timesheet.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/hr_timesheet/test/test_hr_timesheet.yml b/addons/hr_timesheet/test/test_hr_timesheet.yml
index cc04bed734d..59d688f183b 100644
--- a/addons/hr_timesheet/test/test_hr_timesheet.yml
+++ b/addons/hr_timesheet/test/test_hr_timesheet.yml
@@ -23,7 +23,7 @@
import time
uid = ref('base.user_demo')
new_id = self.create(cr, uid, {'emp_id': ref('hr.employee_qdp'), 'name': 'Quentin Paolino',
- 'server_date': time.strftime('%Y-%m-%d %H:%M:%S'), 'state': 'present'})
+ 'server_date': time.strftime('%Y-%m-%d %H:%M:%S')})
self.sign_in_result(cr, uid, [new_id], context)
-
I change my project "Thymbra" and I click on the "Change Work" button of this wizard
From 5b4fde2485f7c4f1b93dc1634c7929404fdcdaeb Mon Sep 17 00:00:00 2001
From: "Quentin (OpenERP)"
Date: Fri, 19 Oct 2012 15:30:50 +0200
Subject: [PATCH 113/150] [FIX] account: the readonly fields aren't send to the
server at the record creation
bzr revid: qdp-launchpad@openerp.com-20121019133050-7h8gx3beir992xlw
---
addons/account/account.py | 3 +++
addons/account/account_move_line.py | 9 ++++++---
addons/account/test/account_validate_account_move.yml | 7 ++-----
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/addons/account/account.py b/addons/account/account.py
index fa2b10a7478..3e07f151de3 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -1431,6 +1431,9 @@ class account_move(osv.osv):
if 'line_id' in vals:
c = context.copy()
c['novalidate'] = True
+ c['period_id'] = vals['period_id']
+ c['journal_id'] = vals['journal_id']
+ c['date'] = vals['date']
result = super(account_move, self).create(cr, uid, vals, c)
self.validate(cr, uid, [result], context)
else:
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index f9388706e97..67a55d8f451 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -1234,16 +1234,16 @@ class account_move_line(osv.osv):
vals['company_id'] = company_id[0]
if ('account_id' in vals) and not account_obj.read(cr, uid, vals['account_id'], ['active'])['active']:
raise osv.except_osv(_('Bad Account!'), _('You cannot use an inactive account.'))
- if 'journal_id' in vals:
+ if 'journal_id' in vals and vals['journal_id']:
context['journal_id'] = vals['journal_id']
- if 'period_id' in vals:
+ if 'period_id' in vals and vals['period_id']:
context['period_id'] = vals['period_id']
if ('journal_id' not in context) and ('move_id' in vals) and vals['move_id']:
m = move_obj.browse(cr, uid, vals['move_id'])
context['journal_id'] = m.journal_id.id
context['period_id'] = m.period_id.id
#we need to treat the case where a value is given in the context for period_id as a string
- if 'period_id' not in context or not isinstance(context.get('period_id', ''), (int, long)):
+ if 'period_id' in context and not isinstance(context.get('period_id', ''), (int, long)):
period_candidate_ids = self.pool.get('account.period').name_search(cr, uid, name=context.get('period_id',''))
if len(period_candidate_ids) != 1:
raise osv.except_osv(_('Error!'), _('No period found or more than one period found for the given date.'))
@@ -1253,6 +1253,9 @@ class account_move_line(osv.osv):
self._update_journal_check(cr, uid, context['journal_id'], context['period_id'], context)
move_id = vals.get('move_id', False)
journal = journal_obj.browse(cr, uid, context['journal_id'], context=context)
+ vals['journal_id'] = vals.get('journal_id') or context.get('journal_id')
+ vals['period_id'] = vals.get('period_id') or context.get('period_id')
+ vals['date'] = vals.get('date') or context.get('date')
if not move_id:
if journal.centralisation:
#Check for centralisation
diff --git a/addons/account/test/account_validate_account_move.yml b/addons/account/test/account_validate_account_move.yml
index 65ae2877125..df58da6dfea 100644
--- a/addons/account/test/account_validate_account_move.yml
+++ b/addons/account/test/account_validate_account_move.yml
@@ -11,21 +11,18 @@
-
!record {model: account.move, id: account_move_0}:
date: !eval time.strftime('%Y-%m-%d')
+ period_id: account.period_6
journal_id: account.bank_journal
line_id:
- account_id: account.cash
amount_currency: 0.0
credit: 2000.0
- date: !eval time.strftime('%Y-%m-%d')
debit: 0.0
- journal_id: account.bank_journal
name: Basic Computer
partner_id: base.res_partner_12
- period_id: account.period_6
ref: '2011010'
tax_amount: 0.0
name: /
- period_id: account.period_6
ref: '2011010'
state: draft
-
@@ -110,4 +107,4 @@
partial_reconcile = self.trans_rec_reconcile_partial_reconcile(cr, uid, [ref('account_move_line_reconcile0')], {'lang': u'en_US',
'active_model': 'account.move.line', 'active_ids': ids, 'tz': False, 'active_id': ids[0]})
move_line = move_line_obj.browse(cr, uid, ids)
- assert move_line[0].reconcile_partial_id, "Partial reconcilation is not done"
\ No newline at end of file
+ assert move_line[0].reconcile_partial_id, "Partial reconcilation is not done"
From 1fbee6cb3cc28996729a9259d283906b23848ac0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Fri, 19 Oct 2012 16:04:39 +0200
Subject: [PATCH 114/150] [WIP] mail: tests: WIP about comments and tests about
message_read. Will be continued later.
bzr revid: tde@openerp.com-20121019140439-u64d06em0z7eax0m
---
addons/mail/mail_message.py | 43 ++++++++++++++++++++--------------
addons/mail/tests/test_mail.py | 19 +++++++++++++--
2 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 8719d59bf04..52878a34e10 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -240,7 +240,7 @@ class mail_message(osv.Model):
'to_read': message['to_read'],
}
- def _message_read_expandable(self, cr, uid, message_list, read_messages,
+ def _message_read_add_expandables(self, cr, uid, message_list, read_messages,
message_loaded_ids=[], domain=[], context=None, parent_id=False, limit=None):
""" Create the expandable message for all parent message read
this function is used by message_read
@@ -331,23 +331,30 @@ class mail_message(osv.Model):
except (orm.except_orm, osv.except_osv):
return False
- def message_read(self, cr, uid, ids=False, domain=[], message_loaded_ids=[], context=None, parent_id=False, limit=None):
- """ Read messages from mail.message, and get back a structured tree
- of messages to be displayed as discussion threads. If IDs is set,
+ def message_read(self, cr, uid, ids=False, domain=[], message_unload_ids=[], context=None, parent_id=False, limit=None):
+ """ Read messages from mail.message, and get back a list of structured
+ messages to be displayed as discussion threads. If IDs is set,
fetch these records. Otherwise use the domain to fetch messages.
- After having fetch messages, their parents & child will be added to obtain
- well formed threads.
+ After having fetch messages, their ancestors will be added to obtain
+ well formed threads, if uid has access to them.
- TDE note: update this comment after final method implementation
+ After reading the messages, expandables messages are added in the
+ message list (see ``_message_read_add_expandables``). It consists
+ in messages holding the 'read more' data: number of messages to
+ read, domain to apply.
- :param domain: optional domain for searching ids
- :param limit: number of messages to fetch
- :param parent_id: if parent_id reached, stop searching for
- further parents
- :return list: list of trees of messages
+ :param list ids: optional IDs to fetch
+ :param list domain: optional domain for searching ids if ids not set
+ :param list message_unload_ids: optional ids we do not want to fetch,
+ because i.e. they are already displayed somewhere
+ :param int parent_id: if parent_id reached when adding ancestors,
+ stop going further in the ancestor search
+ :param int limit: number of messages to fetch, before adding the
+ ancestors and expandables
+ :return list: list of message structure for the Chatter widget
"""
- if message_loaded_ids:
- domain += [('id', 'not in', message_loaded_ids)]
+ if message_unload_ids:
+ domain += [('id', 'not in', message_unload_ids)]
limit = limit or self._message_read_limit
read_messages = {}
message_list = []
@@ -364,22 +371,22 @@ class mail_message(osv.Model):
ids = self.search(cr, uid, domain, context=context, limit=limit)
for message in self.read(cr, uid, ids, self._message_read_fields, context=context):
# if not in tree and not in message_loded list
- if not read_messages.get(message.get('id')) and message.get('id') not in message_loaded_ids:
+ if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
read_messages[message.get('id')] = message
message_list.append(self._message_get_dict(cr, uid, message, context=context))
# get all parented message if the user have the access
parent = self._get_parent(cr, uid, message, context=context)
while parent and parent.get('id') != parent_id:
- if not read_messages.get(parent.get('id')) and parent.get('id') not in message_loaded_ids:
+ if not read_messages.get(parent.get('id')) and parent.get('id') not in message_unload_ids:
read_messages[parent.get('id')] = parent
message_list.append(self._message_get_dict(cr, uid, parent, context=context))
parent = self._get_parent(cr, uid, parent, context=context)
# get the child expandable messages for the tree
message_list = sorted(message_list, key=lambda k: k['id'])
- message_list = self._message_read_expandable(cr, uid, message_list, read_messages,
- message_loaded_ids=message_loaded_ids, domain=domain, context=context, parent_id=parent_id, limit=limit)
+ message_list = self._message_read_add_expandables(cr, uid, message_list, read_messages,
+ message_loaded_ids=message_unload_ids, domain=domain, context=context, parent_id=parent_id, limit=limit)
# message_list = sorted(message_list, key=lambda k: k['id'])
return message_list
diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py
index 2eff59fe0ed..016a392f9dc 100644
--- a/addons/mail/tests/test_mail.py
+++ b/addons/mail/tests/test_mail.py
@@ -522,7 +522,22 @@ class test_mail(TestMailMockups):
def test_30_message_read(self):
""" Tests for message_read and expandables. """
- self.assertTrue(1 == 1, 'Test not implemented, do not replace by return True')
+ cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
+
+ # Data: create a discussion in Pigs
+ msg_ids = []
+ for dummy in range(5):
+ msg_ids.append(self.group_pigs.message_post(body='My Body', subtype='mt_comment'))
+
+ # Test: read some specific ids
+ read_msg_list = self.mail_message.message_read(cr, uid, ids=msg_ids[1:3], domain=[('body', 'like', 'dummy')])
+ read_msg_ids = [msg.get('id') for msg in read_msg_list]
+ self.assertEqual(msg_ids[1:3], read_msg_ids, 'message_read with direct ids should read only the requested ids')
+
+ # Test: read messages of Pigs through a domain
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], limit=200)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list]
+ self.assertEqual(msg_ids, read_msg_ids, 'message_read with domain on Pigs should equal all messages of Pigs')
def test_40_needaction(self):
""" Tests for mail.message needaction. """
@@ -584,7 +599,7 @@ class test_mail(TestMailMockups):
# TDE note: temp various asserts because of the random bug about msg1.child_ids
msg_ids = self.mail_message.search(cr, uid, [('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], limit=1)
new_msg = self.mail_message.browse(cr, uid, msg_ids[0])
- self.assertEqual(new_msg.parent_id, msg1, 'Newly processed mail_message (%d) should have msg1 as parent' % (new_msg.id))
+ self.assertEqual(new_msg.parent_id, msg1, 'Newly processed mail_message (%d) should have msg1 as parent (msg2 is %d)' % (new_msg.id, msg2.id))
# 2. References header
reply_msg2 = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', subject='Re: Re: 1',
From b8ba7b389c1e477e9b2970099390e42428a82a42 Mon Sep 17 00:00:00 2001
From: Fabien Meghazi
Date: Mon, 22 Oct 2012 10:35:38 +0200
Subject: [PATCH 116/150] [IMP] Improved state in diagram
bzr revid: fme@openerp.com-20121022083538-ua6fq20x5qkdwcwy
---
addons/web_diagram/static/src/js/diagram.js | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js
index 9617bdbafb3..2e0e5881378 100644
--- a/addons/web_diagram/static/src/js/diagram.js
+++ b/addons/web_diagram/static/src/js/diagram.js
@@ -113,20 +113,24 @@ instance.web.DiagramView = instance.web.View.extend({
on_diagram_loaded: function(record) {
var id_record = record['id'];
- if(id_record) {
+ if (id_record) {
this.id = id_record;
this.get_diagram_info();
- this.do_push_state({id:record.id});
+ this.do_push_state({id: id_record});
+ } else {
+ this.do_push_state({});
}
},
do_load_state: function(state, warm) {
- if (state && !this.dataset.get_id_index(state.id)) {
- this.dataset.ids.push(state.id);
- }
- this.dataset.select_id(state.id);
- if (warm) {
- this.do_show();
+ if (state && state.id) {
+ if (!this.dataset.get_id_index(state.id)) {
+ this.dataset.ids.push(state.id);
+ }
+ this.dataset.select_id(state.id);
+ if (warm) {
+ this.do_show();
+ }
}
},
From d6f262da378803224902ab852364c69bb6c49529 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Mon, 22 Oct 2012 12:08:00 +0200
Subject: [PATCH 117/150] [FIX] methods renamed in web client but not fixed in
addons
bzr revid: xmo@openerp.com-20121022100800-yft9a5itqgb2ohhy
---
addons/base_import/static/src/js/import.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js
index 043630afc48..407d38dacd7 100644
--- a/addons/base_import/static/src/js/import.js
+++ b/addons/base_import/static/src/js/import.js
@@ -38,7 +38,7 @@ openerp.base_import = function (instance) {
// if true, the 'Import', 'Export', etc... buttons will be shown
instance.web.ListView.prototype.defaults.import_enabled = true;
instance.web.ListView.include({
- on_loaded: function () {
+ load_list: function () {
var self = this;
var add_button = false;
if (!this.$buttons) {
From 8a3a92bbfc9a432311b0d2399fa043daab1adcf9 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Mon, 22 Oct 2012 12:39:35 +0200
Subject: [PATCH 118/150] [IMP] readonly sortable o2m
The making of the column invisible would happen after the header was
rendered (?), and the header would not be re-rendered afterwards. So
there would be a missing chunk of table. Make the cells invisible
instead. It's all going to be changed looks-wise anyway so meh.
bzr revid: xmo@openerp.com-20121022103935-78bm40gfotpt1ds6
---
addons/web/static/src/js/view_form.js | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index bc171ef1d6e..c2514e4a195 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3351,23 +3351,13 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
controller.on('edit:before', self, function (e) {
e.cancel = true;
});
- var has_handle = _(controller.columns).find(function (column) {
+ _(controller.columns).find(function (column) {
if (!column instanceof instance.web.list.Handle) {
return false;
}
- column.modifiers.tree_invisible = true;
- column.invisible = '1';
- // remove from visibles
- controller.visible_columns.splice(
- controller.visible_columns.indexOf(column),
- 1);
+ column.modifiers.invisible = true;
return true;
});
- if (has_handle) {
- // recompute aggregates
- controller.aggregate_columns =
- _(controller.visible_columns).invoke('to_aggregate');
- }
}
} else if (view_type === "form") {
if (self.get("effective_readonly")) {
From 0244001069c4ed96a93c3820440b61c1e0188460 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 22 Oct 2012 12:41:44 +0200
Subject: [PATCH 119/150] [FIX] fixed another bug in reconciliation javascript
part
bzr revid: nicolas.vanhoren@openerp.com-20121022104144-6xsiekhp2mflkgs5
---
addons/account/static/src/js/account_move_reconciliation.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/account/static/src/js/account_move_reconciliation.js b/addons/account/static/src/js/account_move_reconciliation.js
index bc758179636..8e72e24eb22 100644
--- a/addons/account/static/src/js/account_move_reconciliation.js
+++ b/addons/account/static/src/js/account_move_reconciliation.js
@@ -102,7 +102,6 @@ openerp.account = function (instance) {
action_id: result[1],
context: additional_context
}).then(function (result) {
- result = result.result;
result.context = _.extend(result.context || {}, additional_context);
result.flags = result.flags || {};
result.flags.new_window = true;
From 50e0b17662f2da7dd23bed9b482849d9d52a0002 Mon Sep 17 00:00:00 2001
From: Antony Lesuisse
Date: Mon, 22 Oct 2012 12:45:29 +0200
Subject: [PATCH 120/150] [FIX] pos closing
bzr revid: al@openerp.com-20121022104529-9wq22t76fj6zqxu6
---
addons/point_of_sale/static/src/js/widgets.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js
index 47a527a010d..3f0e439cfba 100644
--- a/addons/point_of_sale/static/src/js/widgets.js
+++ b/addons/point_of_sale/static/src/js/widgets.js
@@ -1055,8 +1055,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.pos.barcode_reader.disconnect();
return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_client_pos_menu']], ['res_id']).pipe(
_.bind(function(res) {
- return this.rpc('/web/action/load', {'action_id': res[0]['res_id']}).pipe(_.bind(function(result) {
- var action = result.result;
+ return this.rpc('/web/action/load', {'action_id': res[0]['res_id']}).pipe(_.bind(function(action) {
action.context = _.extend(action.context || {}, {'cancel_action': {type: 'ir.actions.client', tag: 'reload'}});
//self.destroy();
this.do_action(action);
From ebd9ceba11b32f3bfd6ad7a3b9f4dcd2f306c692 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Mon, 22 Oct 2012 13:36:51 +0200
Subject: [PATCH 121/150] [FIX] mail_message: fixed default args for
message_read, using list assignation in args could lead to weird default
parameter args because of the method re-using the same list.
bzr revid: tde@openerp.com-20121022113651-u0yn40e8zltwbf4f
---
addons/mail/mail_message.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 52878a34e10..37a62505c48 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -263,6 +263,7 @@ class mail_message(osv.Model):
('parent_id', '=', message['id']),
('id', 'not in', message_loaded_ids),
], context=context, limit=self._message_read_more_limit)
+ # TDE note: avoid using dummy None values, maybe id_min 0, id_max max(list)
# group childs not read
id_min = None
id_max = None
@@ -331,7 +332,7 @@ class mail_message(osv.Model):
except (orm.except_orm, osv.except_osv):
return False
- def message_read(self, cr, uid, ids=False, domain=[], message_unload_ids=[], context=None, parent_id=False, limit=None):
+ def message_read(self, cr, uid, ids=False, domain=None, message_unload_ids=None, context=None, parent_id=False, limit=None):
""" Read messages from mail.message, and get back a list of structured
messages to be displayed as discussion threads. If IDs is set,
fetch these records. Otherwise use the domain to fetch messages.
@@ -353,6 +354,8 @@ class mail_message(osv.Model):
ancestors and expandables
:return list: list of message structure for the Chatter widget
"""
+ domain = domain if domain is not None else []
+ message_unload_ids = message_unload_ids if message_unload_ids is not None else []
if message_unload_ids:
domain += [('id', 'not in', message_unload_ids)]
limit = limit or self._message_read_limit
From 815100e53593652ae1be68439b08f6db207266e9 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Mon, 22 Oct 2012 13:37:00 +0200
Subject: [PATCH 122/150] [IMP] res.partner ir.rule: made the rule similar to
the one for res.partner.
bzr revid: vmt@openerp.com-20121022113700-hn65uabpd0ttuxyt
---
openerp/addons/base/security/base_security.xml | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/openerp/addons/base/security/base_security.xml b/openerp/addons/base/security/base_security.xml
index b7d4fb0e9ee..02323a635df 100644
--- a/openerp/addons/base/security/base_security.xml
+++ b/openerp/addons/base/security/base_security.xml
@@ -87,7 +87,10 @@
Partner bank company rule
- ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+ ['|','|',('company_id.child_ids','child_of',[user.company_id.id]),('company_id','child_of',[user.company_id.id]),('company_id','=',False)]
From c186168b71c7e1fedd9cf34becde10ae7143026b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Mon, 22 Oct 2012 13:45:02 +0200
Subject: [PATCH 123/150] [REM] mail_message: removed max_limit arg of
expandables.
bzr revid: tde@openerp.com-20121022114502-dgod5p1u4ixmdcla
---
addons/mail/mail_message.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 37a62505c48..19178a5eab7 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -312,7 +312,6 @@ class mail_message(osv.Model):
'type': 'expandable',
'parent_id': parent_id,
'id': -1,
- 'max_limit': True,
})
return message_list
From e6e4e8d4c102f477c95415154a1411be54126f2a Mon Sep 17 00:00:00 2001
From: "Quentin (OpenERP)"
Date: Mon, 22 Oct 2012 14:31:00 +0200
Subject: [PATCH 124/150] [REV] osv/orm: revert of a previous patch that was
unifying the behavior for fields.related and fields.function at creation time
because it's a bit dangereous to treat it right now, and may need the add of
a new field attribute. "I'll be back", said the patch
bzr revid: qdp-launchpad@openerp.com-20121022123100-wwr7lnmpqebddxon
---
openerp/osv/orm.py | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index 1db2feeca88..4c3330c97b7 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -4359,10 +4359,20 @@ class BaseModel(object):
upd2.append(self._columns[field]._symbol_set[1](vals[field]))
#for the function fields that receive a value, we set them directly in the database
#(they may be required), but we also need to trigger the _fct_inv()
- if (hasattr(self._columns[field], '_fnct_inv')):
+ if (hasattr(self._columns[field], '_fnct_inv')) and not isinstance(self._columns[field], fields.related):
+ #TODO: this way to special case the related fields is really creepy but it shouldn't be changed at
+ #one week of the release candidate. It seems the only good way to handle correctly this is to add an
+ #attribute to make a field `really readonly´ and thus totally ignored by the create()... otherwise
+ #if, for example, the related has a default value (for usability) then the fct_inv is called and it
+ #may raise some access rights error. Changing this is a too big change for now, and is thus postponed
+ #after the release but, definitively, the behavior shouldn't be different for related and function
+ #fields.
upd_todo.append(field)
else:
- upd_todo.append(field)
+ #TODO: this `if´ statement should be removed because there is no good reason to special case the fields
+ #related. See the above TODO comment for further explanations.
+ if not isinstance(self._columns[field], fields.related):
+ upd_todo.append(field)
if field in self._columns \
and hasattr(self._columns[field], 'selection') \
and vals[field]:
From b631b13742aa68465f6090368ad9fd4e7f4bfad3 Mon Sep 17 00:00:00 2001
From: Fabien Meghazi
Date: Mon, 22 Oct 2012 14:41:35 +0200
Subject: [PATCH 125/150] [FIX] Forgot two occurencies during do_action()
refactoring
refactoring was done in Revision: 3261 revid:fme@openerp.com-20121017145548-oc9s6oadhwzbr78m
bzr revid: fme@openerp.com-20121022124135-ifaj0mm1vd2zjxyo
---
addons/web/static/src/js/views.js | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index d4b676f2c7a..2a5e1c4587e 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -1068,9 +1068,11 @@ instance.web.Sidebar = instance.web.Widget.extend({
additional_context);
result.flags = result.flags || {};
result.flags.new_window = true;
- self.do_action(result, function () {
- // reload view
- self.getParent().reload();
+ self.do_action(result, {
+ on_close: function() {
+ // reload view
+ self.getParent().reload();
+ },
});
});
});
@@ -1216,7 +1218,9 @@ instance.web.View = instance.web.Widget.extend({
/* niv: previously we were overriding once more with action_data.context,
* I assumed this was not a correct behavior and removed it
*/
- return self.do_action(action, result_handler);
+ return self.do_action(action, {
+ on_close: result_handler,
+ });
}, null);
} else {
return result_handler();
From c6eaa8beb8518abef184d84d074cec882980b8ca Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 22 Oct 2012 14:49:35 +0200
Subject: [PATCH 126/150] [FIX] problem in read_group, caused an exception
"cannot read 'lang' in undefined" in a lot of views
bzr revid: nicolas.vanhoren@openerp.com-20121022124935-mxfzx2wg431bqhm9
---
addons/web/static/src/js/data.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index 0bc2848fe0b..e279ade6fb3 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -135,6 +135,8 @@ instance.web.Query = instance.web.Class.extend({
}).pipe(function (results) {
return _(results).map(function (result) {
// FIX: querygroup initialization
+ result.__context = result.__context || {};
+ result.__context.group_by = result.__context.group_by || [];
_.defaults(result.__context, ctx);
return new instance.web.QueryGroup(
self._model.name, grouping[0], result);
From 955ebc8c6715d756d9873715be6ddb59406553c6 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Mon, 22 Oct 2012 15:16:24 +0200
Subject: [PATCH 127/150] [FIX] reorderable listview clone/placeholder
positioning
In some cases (tables?) jquery-ui sortable apparently breaks down if
any parent of the element being positioned (and the generated helper
element) is in position: relative.
Remove all of the position:relative in the way, they seem to not be
used anymore (including the one in jquery-ui, testing in IE9 doesn't
seem to expose any bug and jquery-ui references one, might have been
an issue in IE<=8 which was fixed since).
Maybe an assertion should be added to the code, which would call
#getComputedStyle() on all the #parents() of the element being made
sortable and error out if one of them has
#getPropertyValue('position') == 'relative'?
bzr revid: xmo@openerp.com-20121022131624-n8a43vgl8k4gsqk9
---
addons/web/static/src/css/base.css | 7 +++----
addons/web/static/src/css/base.sass | 6 ++++--
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index e4b8885b1a1..eba41b23776 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -27,7 +27,6 @@
}
.openerp.openerp_webclient_container {
height: 100%;
- position: relative;
}
.text-tag .text-button {
@@ -198,6 +197,9 @@
.openerp .oe_bounce_container {
display: inline-block;
}
+.openerp .ui-tabs {
+ position: static;
+}
.openerp.ui-dialog {
display: none;
padding: 6px;
@@ -2621,9 +2623,6 @@
.openerp .oe_list_buttons.oe_editing .oe_alternative {
visibility: visible;
}
-.openerp .oe_list {
- position: relative;
-}
.openerp .oe_list .oe_form .oe_form_nosheet {
margin: 0;
padding: 0;
diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass
index a128fcec24b..5140f3ceb3e 100644
--- a/addons/web/static/src/css/base.sass
+++ b/addons/web/static/src/css/base.sass
@@ -144,7 +144,6 @@ $sheet-max-width: 860px
.openerp.openerp_webclient_container
height: 100%
- position: relative
// jQueryUI css bug fixing
.text-tag .text-button
@@ -253,6 +252,10 @@ $sheet-max-width: 860px
.oe_bounce_container
display: inline-block
+ // bug noted in jquery ui CSS doesn't seem to occur in IE9,
+ // so remove position:relative
+ .ui-tabs
+ position: static
// Modal box
&.ui-dialog
display: none
@@ -2078,7 +2081,6 @@ $sheet-max-width: 860px
visibility: visible
.oe_list
- position: relative
.oe_form
.oe_form_nosheet
margin: 0 // FIXME: either class or border should not be by default
From a1364bde2098b94ace57d640aff1421eddd8ca65 Mon Sep 17 00:00:00 2001
From: Fabien Meghazi
Date: Mon, 22 Oct 2012 16:24:59 +0200
Subject: [PATCH 128/150] [FIX] m2m kanban use it's own value as is in order to
fill dataset.ids
bzr revid: fme@openerp.com-20121022142459-9so19ypfwhxwhuc3
---
addons/web/static/src/js/view_form.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index c2514e4a195..87673865ee8 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -4187,7 +4187,6 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
},
render_value: function() {
var self = this;
- this.dataset.set_ids(this.get("value"));
this.is_loaded = this.is_loaded.pipe(function() {
return self.kanban_view.do_search(self.build_domain(), self.dataset.get_context(), []);
});
From d38b276168c2d0597ce87e6756c846a47bd9f3fb Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Mon, 22 Oct 2012 16:35:22 +0200
Subject: [PATCH 129/150] [FIX] mail: use the right web.base.url
bzr revid: stw@openerp.com-20121022143522-sv07qt5txqjwim6a
---
addons/mail/update.py | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/addons/mail/update.py b/addons/mail/update.py
index 9e35391bf52..f571a59440d 100644
--- a/addons/mail/update.py
+++ b/addons/mail/update.py
@@ -22,7 +22,7 @@ check the logs to see if a message we just received was already logged.
"""
_PREVIOUS_LOG_CHECK = datetime.timedelta(days=365)
-def get_sys_logs(cr, uid):
+def get_sys_logs(self, cr, uid):
"""
Utility method to send a publisher warranty get logs messages.
"""
@@ -42,7 +42,7 @@ def get_sys_logs(cr, uid):
nbr_active_share_users = pool.get("res.users").search(cr, uid, [("share", "=", True), ("date", ">=", limit_date_str)], count=True)
user = pool.get("res.users").browse(cr, uid, uid)
- web_base_url = safe_eval(self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', 'False'))
+ web_base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', 'False')
msg = {
"dbuuid": dbuuid,
"nbr_users": nbr_users,
@@ -62,6 +62,7 @@ def get_sys_logs(cr, uid):
arguments_raw = urllib.urlencode(arguments)
url = config.get("publisher_warranty_url")
+
uo = urllib2.urlopen(url, arguments_raw, **add_arg)
result = {}
try:
@@ -84,8 +85,8 @@ class publisher_warranty_contract(osv.osv):
"""
try:
try:
- result = get_sys_logs(cr, uid)
- except Exception:
+ result = get_sys_logs(self, cr, uid)
+ except Exception, ex:
if cron_mode: # we don't want to see any stack trace in cron
return False
_logger.debug("Exception while sending a get logs messages", exc_info=1)
From 1da06f3bfe14be5bece5116bdd88b7077cf01604 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 22 Oct 2012 16:40:21 +0200
Subject: [PATCH 130/150] [FIX] better fix for previous m2m kanban problem
bzr revid: nicolas.vanhoren@openerp.com-20121022144021-h1oqgb0d0h6aepfl
---
addons/web/static/src/js/view_form.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 87673865ee8..dc6c4d0f0b3 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -4160,6 +4160,9 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
}
this._super(value_);
},
+ get_value: function() {
+ return [commands.replace_with(this.get('value'))];
+ },
load_view: function() {
var self = this;
this.kanban_view = new instance.web.form.Many2ManyKanbanView(this, this.dataset, false, {
@@ -4187,12 +4190,13 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
},
render_value: function() {
var self = this;
+ this.dataset.set_ids(this.get("value"));
this.is_loaded = this.is_loaded.pipe(function() {
return self.kanban_view.do_search(self.build_domain(), self.dataset.get_context(), []);
});
},
dataset_changed: function() {
- this.set({'value': [commands.replace_with(this.dataset.ids)]});
+ this.set({'value': this.dataset.ids});
},
open_popup: function(type, unused) {
if (type !== "form")
From db54c70650f0cedc703bb48cde521baa0da303c8 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 22 Oct 2012 17:22:57 +0200
Subject: [PATCH 131/150] [FIX] resolved problem with buttons in views, also
removed default Close button in wizards
bzr revid: nicolas.vanhoren@openerp.com-20121022152257-yxcz0j73b4azeqr1
---
addons/web/static/src/js/view_form.js | 1 -
addons/web/static/src/js/views.js | 1 -
2 files changed, 2 deletions(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index dc6c4d0f0b3..506e0f199fe 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -168,7 +168,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
this.$buttons = $(QWeb.render("FormView.buttons", {'widget':self}));
if (this.options.$buttons) {
- this.options.$buttons.children().remove();
this.$buttons.appendTo(this.options.$buttons);
} else {
this.$el.find('.oe_form_buttons').replaceWith(this.$buttons);
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 2a5e1c4587e..103ad7a2661 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -300,7 +300,6 @@ instance.web.ActionManager = instance.web.Widget.extend({
this.dialog_widget.destroy();
if (this.dialog === null || this.dialog.isDestroyed()) {
this.dialog = new instance.web.Dialog(this, {
- buttons: {"Close": function() {$(this).dialog("close")}},
dialogClass: executor.klass,
});
this.dialog.on("closing", null, options.on_close);
From 6972b3402946b5641a073a1405995ac7c76a9199 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Mon, 22 Oct 2012 18:01:34 +0200
Subject: [PATCH 132/150] [REM] stuff in list view, may or may not still work.
It's all fme's fault anyway
FME MA TUER
bzr revid: xmo@openerp.com-20121022160134-yaze6n43h98c193t
---
addons/web/static/src/js/view_list.js | 41 ++++++---------------------
addons/web/static/src/js/views.js | 4 +--
2 files changed, 11 insertions(+), 34 deletions(-)
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index 29bc81ea9ec..fe577c91840 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -145,7 +145,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
*/
start: function() {
this.$el.addClass('oe_list');
- return this.reload_view(null, null, true);
+ return this.start();
},
/**
* Returns the style for the provided record in the current view (from the
@@ -219,7 +219,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
* @param {Object} data.fields_view.arch current list view descriptor
* @param {Boolean} grouped Is the list view grouped
*/
- load_list: function(data, grouped) {
+ load_list: function(data) {
var self = this;
this.fields_view = data;
this.name = "" + this.fields_view.arch.attrs.string;
@@ -245,7 +245,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}).value();
}
- this.setup_columns(this.fields_view.fields, grouped);
+ this.setup_columns(this.fields_view.fields, this.grouped);
this.$el.html(QWeb.render(this._template, this));
this.$el.addClass(this.fields_view.arch.attrs['class']);
@@ -282,7 +282,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
// Add button
if (!this.$buttons) {
- this.$buttons = $(QWeb.render("ListView.buttons", {'widget':self}));
+ this.$buttons = $(QWeb.render("ListView.buttons", {'widget':this}));
if (this.options.$buttons) {
this.$buttons.appendTo(this.options.$buttons);
} else {
@@ -290,12 +290,12 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}
this.$buttons.find('.oe_list_add')
.click(this.proxy('do_add_record'))
- .prop('disabled', grouped);
+ .prop('disabled', this.grouped);
}
// Pager
if (!this.$pager) {
- this.$pager = $(QWeb.render("ListView.pager", {'widget':self}));
+ this.$pager = $(QWeb.render("ListView.pager", {'widget':this}));
if (this.options.$buttons) {
this.$pager.appendTo(this.options.$pager);
} else {
@@ -359,7 +359,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
this.sidebar.add_toolbar(this.fields_view.toolbar);
this.sidebar.$el.hide();
}
- this.trigger('list_view_loaded', data, grouped);
+ this.trigger('list_view_loaded', data, this.grouped);
},
/**
* Configures the ListView pager based on the provided dataset's information
@@ -461,29 +461,6 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}
this._super();
},
- /**
- * Reloads the list view based on the current settings (dataset & al)
- *
- * @param {Boolean} [grouped] Should the list be displayed grouped
- * @param {Object} [context] context to send the server while loading the view
- */
- reload_view: function (grouped, context, initial) {
- var self = this;
- var callback = function (field_view_get) {
- self.load_list(field_view_get, grouped);
- };
- if (this.embedded_view) {
- return $.Deferred().then(callback).resolve(this.embedded_view);
- } else {
- return this.rpc('/web/view/load', {
- model: this.model,
- view_id: this.view_id,
- view_type: "tree",
- context: this.dataset.get_context(context),
- toolbar: !!this.options.$sidebar
- }).then(callback);
- }
- },
/**
* re-renders the content of the list view
*
@@ -564,9 +541,9 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
group_by = null;
}
this.no_leaf = !!context['group_by_no_leaf'];
+ this.grouped = !!group_by;
- this.reload_view(!!group_by, context).then(
- this.proxy('reload_content'));
+ this.load_view(context).then(this.proxy('reload_content'));
},
/**
* Handles the signal to delete lines from the records list
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 103ad7a2661..f110b368196 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -1142,7 +1142,7 @@ instance.web.View = instance.web.Widget.extend({
start: function () {
return this.load_view();
},
- load_view: function() {
+ load_view: function(context) {
var self = this;
if (this.embedded_view) {
var def = $.Deferred();
@@ -1151,7 +1151,7 @@ instance.web.View = instance.web.Widget.extend({
self.trigger('view_loaded', r);
});
} else {
- var context = new instance.web.CompoundContext(this.dataset.get_context());
+ var context = this.dataset.get_context(context || {});
if (! this.view_type)
console.warn("view_type is not defined", this);
return this.rpc("/web/view/load", {
From 3b5b24b72e7a695898ef51f431c741a4e104e96c Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 22 Oct 2012 18:14:26 +0200
Subject: [PATCH 133/150] [FIX] m2o switches correctly its button
bzr revid: nicolas.vanhoren@openerp.com-20121022161426-1oqwa8e3n6kh7pba
---
addons/web/static/src/js/view_form.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 506e0f199fe..850a334c40b 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3119,8 +3119,10 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
if (!this.get("effective_readonly")) {
this.$input.val(str.split("\n")[0]);
this.current_display = this.$input.val();
- if(this.is_false()){
+ if (this.is_false()) {
this.$('.oe_m2o_cm_button').css({'display':'none'});
+ } else {
+ this.$('.oe_m2o_cm_button').css({'display':'inline'});
}
} else {
var lines = _.escape(str).split("\n");
From 6280e223be743674b85cb1bc8c1e4dbdcf1a7e75 Mon Sep 17 00:00:00 2001
From: Fabien Meghazi
Date: Mon, 22 Oct 2012 18:16:11 +0200
Subject: [PATCH 134/150] [REV] Not my fault afterall.
bzr revid: fme@openerp.com-20121022161611-d4gik77mk1fvtojb
---
addons/web/static/src/js/view_list.js | 41 +++++++++++++++++++++------
addons/web/static/src/js/views.js | 4 +--
2 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index fe577c91840..29bc81ea9ec 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -145,7 +145,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
*/
start: function() {
this.$el.addClass('oe_list');
- return this.start();
+ return this.reload_view(null, null, true);
},
/**
* Returns the style for the provided record in the current view (from the
@@ -219,7 +219,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
* @param {Object} data.fields_view.arch current list view descriptor
* @param {Boolean} grouped Is the list view grouped
*/
- load_list: function(data) {
+ load_list: function(data, grouped) {
var self = this;
this.fields_view = data;
this.name = "" + this.fields_view.arch.attrs.string;
@@ -245,7 +245,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}).value();
}
- this.setup_columns(this.fields_view.fields, this.grouped);
+ this.setup_columns(this.fields_view.fields, grouped);
this.$el.html(QWeb.render(this._template, this));
this.$el.addClass(this.fields_view.arch.attrs['class']);
@@ -282,7 +282,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
// Add button
if (!this.$buttons) {
- this.$buttons = $(QWeb.render("ListView.buttons", {'widget':this}));
+ this.$buttons = $(QWeb.render("ListView.buttons", {'widget':self}));
if (this.options.$buttons) {
this.$buttons.appendTo(this.options.$buttons);
} else {
@@ -290,12 +290,12 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}
this.$buttons.find('.oe_list_add')
.click(this.proxy('do_add_record'))
- .prop('disabled', this.grouped);
+ .prop('disabled', grouped);
}
// Pager
if (!this.$pager) {
- this.$pager = $(QWeb.render("ListView.pager", {'widget':this}));
+ this.$pager = $(QWeb.render("ListView.pager", {'widget':self}));
if (this.options.$buttons) {
this.$pager.appendTo(this.options.$pager);
} else {
@@ -359,7 +359,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
this.sidebar.add_toolbar(this.fields_view.toolbar);
this.sidebar.$el.hide();
}
- this.trigger('list_view_loaded', data, this.grouped);
+ this.trigger('list_view_loaded', data, grouped);
},
/**
* Configures the ListView pager based on the provided dataset's information
@@ -461,6 +461,29 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}
this._super();
},
+ /**
+ * Reloads the list view based on the current settings (dataset & al)
+ *
+ * @param {Boolean} [grouped] Should the list be displayed grouped
+ * @param {Object} [context] context to send the server while loading the view
+ */
+ reload_view: function (grouped, context, initial) {
+ var self = this;
+ var callback = function (field_view_get) {
+ self.load_list(field_view_get, grouped);
+ };
+ if (this.embedded_view) {
+ return $.Deferred().then(callback).resolve(this.embedded_view);
+ } else {
+ return this.rpc('/web/view/load', {
+ model: this.model,
+ view_id: this.view_id,
+ view_type: "tree",
+ context: this.dataset.get_context(context),
+ toolbar: !!this.options.$sidebar
+ }).then(callback);
+ }
+ },
/**
* re-renders the content of the list view
*
@@ -541,9 +564,9 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
group_by = null;
}
this.no_leaf = !!context['group_by_no_leaf'];
- this.grouped = !!group_by;
- this.load_view(context).then(this.proxy('reload_content'));
+ this.reload_view(!!group_by, context).then(
+ this.proxy('reload_content'));
},
/**
* Handles the signal to delete lines from the records list
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index f110b368196..103ad7a2661 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -1142,7 +1142,7 @@ instance.web.View = instance.web.Widget.extend({
start: function () {
return this.load_view();
},
- load_view: function(context) {
+ load_view: function() {
var self = this;
if (this.embedded_view) {
var def = $.Deferred();
@@ -1151,7 +1151,7 @@ instance.web.View = instance.web.Widget.extend({
self.trigger('view_loaded', r);
});
} else {
- var context = this.dataset.get_context(context || {});
+ var context = new instance.web.CompoundContext(this.dataset.get_context());
if (! this.view_type)
console.warn("view_type is not defined", this);
return this.rpc("/web/view/load", {
From b5b19a7a01402b9e344ffd6cee023231ce2f14fd Mon Sep 17 00:00:00 2001
From: Olivier Dony
Date: Mon, 22 Oct 2012 18:24:21 +0200
Subject: [PATCH 135/150] [FIX] generate_tracking_message_id: use more
randomness to avoid duplicates
When several message IDs had to be generated for the same
record at the same time, there was a high chance to
get non-unique results. This possibly lead to data loss because
some mail implementations might ignore multiple mails with the
same ID (including OpenERP itself). On most operating systems
the available time resolution precision is better than what
we used (due to the float rounding of `%s`).
Adding a bit of randomness doesn't hurt, as OpenERP will
be used in increasingly distributed environments, so
we now add an extra random part as well.
bzr revid: odo@openerp.com-20121022162421-qr7nq8idihp5781u
---
openerp/tools/misc.py | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py
index c9283a839d4..ba6ea1137d1 100644
--- a/openerp/tools/misc.py
+++ b/openerp/tools/misc.py
@@ -27,12 +27,11 @@ Miscellaneous tools used by OpenERP.
"""
from functools import wraps
-import inspect
import subprocess
import logging
import os
+import random
import re
-import smtplib
import socket
import sys
import threading
@@ -40,13 +39,6 @@ import time
import zipfile
from collections import defaultdict
from datetime import datetime
-from email.MIMEText import MIMEText
-from email.MIMEBase import MIMEBase
-from email.MIMEMultipart import MIMEMultipart
-from email.Header import Header
-from email.Utils import formatdate, COMMASPACE
-from email import Utils
-from email import Encoders
from itertools import islice, izip
from lxml import etree
from which import which
@@ -363,7 +355,12 @@ def generate_tracking_message_id(res_id):
Used to track the replies related to a given object thanks to the "In-Reply-To"
or "References" fields that Mail User Agents will set.
"""
- return "<%s-openerp-%s@%s>" % (time.time(), res_id, socket.gethostname())
+ try:
+ rnd = random.SystemRandom().random()
+ except NotImplementedError:
+ rnd = random.random()
+ rndstr = ("%.15f" % rnd)[2:]
+ return "<%.15f.%s-openerp-%s@%s>" % (time.time(), rndstr, res_id, socket.gethostname())
def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, reply_to=False,
attachments=None, message_id=None, references=None, openobject_id=False, debug=False, subtype='plain', headers=None,
From c88b77a7c84be7a72913409bb1ee9ee6eb9a898e Mon Sep 17 00:00:00 2001
From: Antonin Bourguignon
Date: Mon, 22 Oct 2012 18:27:08 +0200
Subject: [PATCH 136/150] [IMP] remove whitespaces
bzr revid: abo@openerp.com-20121022162708-a3q25ul0rnbtfnqv
---
addons/web/static/src/css/base.sass | 41 +++++++++++++----------------
1 file changed, 19 insertions(+), 22 deletions(-)
diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass
index 5140f3ceb3e..37830a8b109 100644
--- a/addons/web/static/src/css/base.sass
+++ b/addons/web/static/src/css/base.sass
@@ -120,7 +120,7 @@ $sheet-max-width: 860px
font-size: 1px
letter-spacing: -1px
color: transparent
- font-weight: normal
+ font-weight: normal
&:before
font: 21px "mnmliconsRegular"
content: $icon-name
@@ -130,7 +130,7 @@ $sheet-max-width: 860px
font-size: 1px
letter-spacing: -1px
color: transparent
- font-weight: normal
+ font-weight: normal
&:before
font: $size "entypoRegular"
content: $icon-name
@@ -611,7 +611,7 @@ $sheet-max-width: 860px
vertical-align: top
margin-top: 8px
//margin-left set at 3px to avoid a strange overflow
- margin-left: 3px
+ margin-left: 3px
border-left: 4px solid transparent
border-right: 4px solid transparent
border-top: 4px solid#404040
@@ -804,7 +804,7 @@ $sheet-max-width: 860px
display: none
// }}}
// Top Menu {{{
-
+
.oe_topbar
width: 100%
height: 32px
@@ -977,7 +977,7 @@ $sheet-max-width: 860px
.oe_menu_counter
float: right
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
- margin: 1px
+ margin: 1px
padding: 1px 4px
border: none
&:hover
@@ -1069,7 +1069,7 @@ $sheet-max-width: 860px
// ViewManager common {{{
.oe_view_manager
.oe_view_manager_body
- height: inherit
+ height: inherit
.oe_view_manager_view_kanban
height: inherit
@@ -1579,7 +1579,7 @@ $sheet-max-width: 860px
display: none !important
.oe_form .oe_form_field_date
width: auto
- // Sheet and padding
+ // Sheet and padding
.oe_form_nosheet
margin: 16px
> header
@@ -1625,7 +1625,7 @@ $sheet-max-width: 860px
margin-left: 6px
// }}}
// FormView.custom tags and classes {{{
- .oe_form
+ .oe_form
header
.oe_tags
margin: 5px 0 0 5px
@@ -1788,7 +1788,7 @@ $sheet-max-width: 860px
display: none
.oe_datepicker_root
display: inline-block
- .oe_form_required
+ .oe_form_required
input:not([disabled]):not([readonly]), select:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly])
background-color: #D2D2FF !important
.oe_form_invalid
@@ -1824,10 +1824,10 @@ $sheet-max-width: 860px
position: relative
width: 600px
margin-left: 130px
- margin-top: 32px
+ margin-top: 32px
margin-bottom: 32px
text-align: justify
-
+
.oe_form_editable
.oe_form
.oe_form_field_integer input
@@ -1905,7 +1905,7 @@ $sheet-max-width: 860px
display: inline-block
margin: 0
padding: 0 18px 0 0
- li
+ li
display: inline-block
list-style-type: none
// It is probably a bad idea to modify this margin
@@ -1935,7 +1935,7 @@ $sheet-max-width: 860px
vertical-align: top
overflow: hidden
margin-left: -5px
- span
+ span
position: relative
width: 24px
height: 24px
@@ -1948,7 +1948,7 @@ $sheet-max-width: 860px
@include transform(rotate(45deg))
li.oe_active
@include vertical-gradient(#729fcf, #3465a4)
- .arrow span
+ .arrow span
@include skew-gradient(#729fcf, #3465a4)
.label
color: white
@@ -1956,20 +1956,20 @@ $sheet-max-width: 860px
ul.oe_form_status_clickable
li
cursor: pointer
- &:hover
+ &:hover
@include vertical-gradient(darken(#fcfcfc, 8%), darken(#dedede, 8%))
.label
text-shadow: 0 -1px 1px #fcfcfc, 0 1px 1px #dedede
- .arrow span
+ .arrow span
@include vertical-gradient(darken(#fcfcfc, 8%), darken(#dedede, 8%))
.label
color: $link-color
li.oe_active
- &:hover
+ &:hover
@include vertical-gradient(darken(#729fcf, 10%), darken(#3465a4, 10%))
.label
text-shadow: 0 -1px 1px #729fcf, 0 1px 1px #3465a4
- .arrow span
+ .arrow span
@include skew-gradient(darken(#729fcf, 10%), darken(#3465a4, 10%))
// }}}
// FormView.one2many {{{
@@ -2186,7 +2186,6 @@ $sheet-max-width: 860px
.oe_list_cannot_delete
.oe_list_record_delete
display: none !important
-
// }}}
// Tree view {{{
.tree_header
@@ -2237,7 +2236,6 @@ $sheet-max-width: 860px
background-image: url(/web/static/src/img/collapse.gif)
.treeview-tr.oe-treeview-first span, .treeview-td.oe-treeview-first span
margin-left: 16px
-
// }}}
// Debugging stuff {{{
.oe_layout_debugging
@@ -2280,7 +2278,6 @@ $sheet-max-width: 860px
background-attachment: fixed
>*
opacity: 0.70
-
// }}}
// The jQuery-ui overlay and Autocomplete are outside the .openerp div, please don't add indentation !!!
@@ -2302,7 +2299,7 @@ div.ui-widget-overlay
width: 100%
padding: 0
a
- padding: 1px 16px
+ padding: 1px 16px
a.ui-corner-all
@include radius(0)
a.ui-state-active
From a013e6e62f09aeb4927315ca576fe0a48490f886 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Mon, 22 Oct 2012 18:46:38 +0200
Subject: [PATCH 137/150] [IMP] [WIP] mail: expandables now limited to one
level (using a child_of based domain); simplified code. message_read updated
to fetch the oldest possible ancestor, not all direct parents. Updated some
tests. Still WIP, will be continued tomorrow.
bzr revid: tde@openerp.com-20121022164638-gqe5af1uxvl5h043
---
addons/mail/mail_followers.py | 1 +
addons/mail/mail_message.py | 111 +++++++++++++++++----------------
addons/mail/tests/test_mail.py | 79 +++++++++++++++++------
3 files changed, 118 insertions(+), 73 deletions(-)
diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py
index 35603d2d720..52d26ebb51b 100644
--- a/addons/mail/mail_followers.py
+++ b/addons/mail/mail_followers.py
@@ -85,6 +85,7 @@ class mail_notification(osv.Model):
def set_message_read(self, cr, uid, msg_ids, read=None, context=None):
""" TDE note: add a comment, verify method calls, because js seems obfuscated. """
+ # TDE note: child_of to set unread ?
user_pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
notif_ids = self.search(cr, uid, [('partner_id', '=', user_pid), ('message_id', 'in', msg_ids)], context=context)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 19178a5eab7..1a650e8f67d 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -198,19 +198,29 @@ class mail_message(osv.Model):
:param dict message: read result of a mail.message
"""
+ is_author = False
+ if message['author_id']:
+ is_author = message['author_id'][0] == self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=None)['partner_id'][0]
+
has_voted = False
- if uid in message['vote_user_ids']:
+ if uid in message.get('vote_user_ids'):
has_voted = True
is_favorite = False
- if uid in message['favorite_user_ids']:
+ if uid in message.get('favorite_user_ids'):
is_favorite = True
+ is_private = False
+ if message.get('model') and message.get('res_id'):
+ is_private = True
+
try:
attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, message['attachment_ids'], context=context)]
except (orm.except_orm, osv.except_osv):
attachment_ids = []
+ # TDE note: should we send partner_ids ?
+ # TDE note: shouldn't we separated followers and other partners ? costly to compute maybe ,
try:
partner_ids = self.pool.get('res.partner').name_get(cr, uid, message['partner_ids'], context=context)
except (orm.except_orm, osv.except_osv):
@@ -227,15 +237,13 @@ class mail_message(osv.Model):
'subject': message['subject'],
'date': message['date'],
'author_id': message['author_id'],
- 'is_author': message['author_id'] and message['author_id'][0] == uid,
+ 'is_author': is_author,
# TDE note: is this useful ? to check
'partner_ids': partner_ids,
'parent_id': message['parent_id'] and message['parent_id'][0] or False,
- # TDE note: see with CHM about votes, how they are displayed (only number, or name_get ?)
- # vote: should only use number of votes
'vote_nb': len(message['vote_user_ids']),
'has_voted': has_voted,
- 'is_private': message['model'] and message['res_id'],
+ 'is_private': is_private,
'is_favorite': is_favorite,
'to_read': message['to_read'],
}
@@ -250,69 +258,63 @@ class mail_message(osv.Model):
:param dict read_messages: dict [id]: read result of the messages to
easily have access to their values, given their ID
"""
- # sort for group items / TDE: move to message_read
- # result = sorted(result, key=lambda k: k['id'])
- tree_not = []
+ def _get_expandable(domain, message_nb, parent_id, id, model):
+ return {
+ 'domain': domain,
+ 'nb_messages': message_nb,
+ 'type': 'expandable',
+ 'parent_id': parent_id,
+ 'id': id,
+ # TDE note: why do we need model sometimes, and sometimes not ???
+ 'model': model,
+ }
+ all_not_loaded_ids = []
# expandable for not show message
id_list = sorted(read_messages.keys())
+ # print 'id_list', id_list
for message_id in id_list:
message = read_messages[message_id]
+ # message is not a thread header (has a parent_id)
+ # TDE note: parent_id is false is there is a parent we can not see -> ok
+ if message.get('parent_id'):
+ continue
+
# TDE note: check search is correctly implemented in mail.message
not_loaded_ids = self.search(cr, uid, [
- ('parent_id', '=', message['id']),
+ ('id', 'child_of', message['id']),
('id', 'not in', message_loaded_ids),
], context=context, limit=self._message_read_more_limit)
- # TDE note: avoid using dummy None values, maybe id_min 0, id_max max(list)
- # group childs not read
- id_min = None
- id_max = None
- nb = 0
+ if not not_loaded_ids:
+ continue
+ # print 'not_loaded_ids', not_loaded_ids
+ all_not_loaded_ids += not_loaded_ids
+ # group childs not read
+ id_min, id_max, nb = max(not_loaded_ids), 0, 0
for not_loaded_id in not_loaded_ids:
if not read_messages.get(not_loaded_id):
nb += 1
- if id_min == None or id_min > not_loaded_id:
+ if id_min > not_loaded_id:
id_min = not_loaded_id
- if id_max == None or id_max < not_loaded_id:
+ if id_max < not_loaded_id:
id_max = not_loaded_id
- tree_not.append(not_loaded_id)
+ elif nb > 0:
+ exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
+ message_list.append(_get_expandable(exp_domain, nb, message_id, id_min, message.get('model')))
+ id_min, id_max, nb = max(not_loaded_ids), 0, 0
else:
- if nb > 0:
- message_list.append({
- 'domain': [('id', '>=', id_min), ('id', '<=', id_max), ('parent_id', '=', message_id)],
- 'nb_messages': nb,
- 'type': 'expandable',
- 'parent_id': message_id,
- 'id': id_min,
- 'model': message['model']
- })
- id_min = None
- id_max = None
- nb = 0
+ id_min, id_max, nb = max(not_loaded_ids), 0, 0
if nb > 0:
- message_list.append({
- 'domain': [('id', '>=', id_min), ('id', '<=', id_max), ('parent_id', '=', message_id)],
- 'nb_messages': nb,
- 'type': 'expandable',
- 'parent_id': message_id,
- 'id': id_min,
- 'model': message['model'],
- })
+ exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
+ message_list.append(_get_expandable(exp_domain, nb, message_id, id_min, message.get('model')))
- for msg_id in read_messages.keys() + tree_not:
- message_loaded_ids.append(msg_id)
+ message_loaded_ids = list(set(message_loaded_ids + read_messages.keys() + all_not_loaded_ids))
# expandable for limit max
ids = self.search(cr, uid, domain + [('id', 'not in', message_loaded_ids)], context=context, limit=1)
- if len(ids) > 0:
- message_list.append({
- 'domain': domain,
- 'nb_messages': 0,
- 'type': 'expandable',
- 'parent_id': parent_id,
- 'id': -1,
- })
+ if ids:
+ message_list.append(_get_expandable(domain, -1, parent_id, -1, None))
return message_list
@@ -371,22 +373,25 @@ class mail_message(osv.Model):
# TDE FIXME: check access rights on search are implemented for mail.message
# fetch messages according to the domain, add their parents if uid has access to
ids = self.search(cr, uid, domain, context=context, limit=limit)
+ # print 'message_read ids', ids
for message in self.read(cr, uid, ids, self._message_read_fields, context=context):
# if not in tree and not in message_loded list
if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
read_messages[message.get('id')] = message
message_list.append(self._message_get_dict(cr, uid, message, context=context))
- # get all parented message if the user have the access
+ # get the older ancestor the user can read
parent = self._get_parent(cr, uid, message, context=context)
while parent and parent.get('id') != parent_id:
- if not read_messages.get(parent.get('id')) and parent.get('id') not in message_unload_ids:
- read_messages[parent.get('id')] = parent
- message_list.append(self._message_get_dict(cr, uid, parent, context=context))
- parent = self._get_parent(cr, uid, parent, context=context)
+ message = parent
+ parent = self._get_parent(cr, uid, message, context=context)
+ if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
+ read_messages[message.get('id')] = message
+ message_list.append(self._message_get_dict(cr, uid, message, context=context))
# get the child expandable messages for the tree
message_list = sorted(message_list, key=lambda k: k['id'])
+ # print 'message_read message_list', message_list
message_list = self._message_read_add_expandables(cr, uid, message_list, read_messages,
message_loaded_ids=message_unload_ids, domain=domain, context=context, parent_id=parent_id, limit=limit)
diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py
index 016a392f9dc..55f50fd720c 100644
--- a/addons/mail/tests/test_mail.py
+++ b/addons/mail/tests/test_mail.py
@@ -123,6 +123,7 @@ class test_mail(TestMailMockups):
def setUp(self):
super(test_mail, self).setUp()
+ cr, uid = self.cr, self.uid
self.ir_model = self.registry('ir.model')
self.mail_alias = self.registry('mail.alias')
self.mail_thread = self.registry('mail.thread')
@@ -135,22 +136,25 @@ class test_mail(TestMailMockups):
self.res_users = self.registry('res.users')
self.res_partner = self.registry('res.partner')
+ # Find Employee group
+ group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user')
+ group_employee_id = group_employee_ref and group_employee_ref[1] or False
# Test users
- self.user_demo_id = self.registry('ir.model.data').get_object_reference(self.cr, self.uid, 'base', 'user_demo')[1]
- self.user_admin = self.res_users.browse(self.cr, self.uid, self.uid)
+ self.user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [group_employee_id])]})
+ self.user_admin = self.res_users.browse(cr, uid, uid)
# Mock send_get_mail_body to test its functionality without other addons override
self._send_get_mail_body = self.registry('mail.mail').send_get_mail_body
self.registry('mail.mail').send_get_mail_body = self._mock_send_get_mail_body
# groups@.. will cause the creation of new mail groups
- self.mail_group_model_id = self.ir_model.search(self.cr, self.uid, [('model', '=', 'mail.group')])[0]
- self.mail_alias.create(self.cr, self.uid, {'alias_name': 'groups',
+ self.mail_group_model_id = self.ir_model.search(cr, uid, [('model', '=', 'mail.group')])[0]
+ self.mail_alias.create(cr, uid, {'alias_name': 'groups',
'alias_model_id': self.mail_group_model_id})
# create a 'pigs' group that will be used through the various tests
- self.group_pigs_id = self.mail_group.create(self.cr, self.uid,
+ self.group_pigs_id = self.mail_group.create(cr, uid,
{'name': 'Pigs', 'description': 'Fans of Pigs, unite !'})
- self.group_pigs = self.mail_group.browse(self.cr, self.uid, self.group_pigs_id)
+ self.group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
def tearDown(self):
# Remove mocks
@@ -260,7 +264,7 @@ class test_mail(TestMailMockups):
""" Tests designed for the subscriber API as well as message subtypes """
cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
# Data: user Raoul
- user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul'})
+ user_raoul_id = self.user_raoul_id
user_raoul = self.res_users.browse(cr, uid, user_raoul_id)
# Data: message subtypes
self.mail_message_subtype.create(cr, uid, {'name': 'mt_mg_def', 'default': True, 'res_model': 'mail.group'})
@@ -523,29 +527,61 @@ class test_mail(TestMailMockups):
def test_30_message_read(self):
""" Tests for message_read and expandables. """
cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
+ pigs_domain = [('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)]
- # Data: create a discussion in Pigs
- msg_ids = []
- for dummy in range(5):
- msg_ids.append(self.group_pigs.message_post(body='My Body', subtype='mt_comment'))
+ # Data: create a discussion in Pigs (2 messages, one with 2 and one with 3 answers)
+ msg_id1 = self.group_pigs.message_post(body='1', subtype='mt_comment')
+ msg_id2 = self.group_pigs.message_post(body='2', subtype='mt_comment')
+ msg_id3 = self.group_pigs.message_post(body='1-1', subtype='mt_comment', parent_id=msg_id1)
+ msg_id4 = self.group_pigs.message_post(body='2-1', subtype='mt_comment', parent_id=msg_id2)
+ msg_id5 = self.group_pigs.message_post(body='1-2', subtype='mt_comment', parent_id=msg_id1)
+ msg_id6 = self.group_pigs.message_post(body='2-2', subtype='mt_comment', parent_id=msg_id2)
+ msg_id7 = self.group_pigs.message_post(body='1-1-1', subtype='mt_comment', parent_id=msg_id3)
+ msg_id8 = self.group_pigs.message_post(body='2-1-1', subtype='mt_comment', parent_id=msg_id4)
+ msg_id9 = self.group_pigs.message_post(body='1-1-1', subtype='mt_comment', parent_id=msg_id3)
+ msg_id10 = self.group_pigs.message_post(body='2-1-1', subtype='mt_comment', parent_id=msg_id4)
+ msg_ids = [msg_id1, msg_id2, msg_id3, msg_id4, msg_id5, msg_id6, msg_id7, msg_id8, msg_id9, msg_id10]
# Test: read some specific ids
- read_msg_list = self.mail_message.message_read(cr, uid, ids=msg_ids[1:3], domain=[('body', 'like', 'dummy')])
+ read_msg_list = self.mail_message.message_read(cr, uid, ids=msg_ids[2:4], domain=[('body', 'like', 'dummy')])
read_msg_ids = [msg.get('id') for msg in read_msg_list]
- self.assertEqual(msg_ids[1:3], read_msg_ids, 'message_read with direct ids should read only the requested ids')
+ self.assertEqual(msg_ids[2:4], read_msg_ids, 'message_read with direct ids should read only the requested ids')
# Test: read messages of Pigs through a domain
- read_msg_list = self.mail_message.message_read(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], limit=200)
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=200)
read_msg_ids = [msg.get('id') for msg in read_msg_list]
self.assertEqual(msg_ids, read_msg_ids, 'message_read with domain on Pigs should equal all messages of Pigs')
+ # Test: read last message, check expandables
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=1)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: parent is added to the read messages
+ self.assertEqual(set([msg_id2, msg_id10]), set(read_msg_ids), 'message_read on the last Pigs message should also get its parent')
+ print read_msg_ids
+ # Test: expandables
+ # 1. expandable for childs of Body2 before the last reply
+ # 2. expandable for messages before Body2
+ for msg in read_msg_list:
+ if msg.get('type') == 'expandable':
+ print msg
+ # 'read more threads' expandable
+ if msg.get('type') == 'expandable' and msg.get('nb_messages') == -1 and msg.get('id') == -1:
+ domain = msg.get('domain', [])
+ self.assertEqual(set(domain), set(pigs_domain), 'general expandable domain should equal the message_read domain parameter')
+ # 'read more messages' expandables
+ elif msg.get('type') == 'expandable':
+ domain = msg.get('domain', [])
+ self.assertIn(('id', 'child_of', msg_id2), domain, 'thread expandable domain should contain a child_of condition')
+ self.assertIn(('id', '>=', msg_id4), domain, 'thread expandable domain should contain a child_of condition')
+ self.assertIn(('id', '<=', msg_id8), domain, 'thread expandable domain should contain a child_of condition')
+
def test_40_needaction(self):
""" Tests for mail.message needaction. """
cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
- user_demo = self.res_users.browse(cr, uid, self.user_demo_id)
- group_pigs_demo = self.mail_group.browse(cr, self.user_demo_id, self.group_pigs_id)
+ user_raoul = self.res_users.browse(cr, uid, self.user_raoul_id)
+ group_pigs_demo = self.mail_group.browse(cr, self.user_raoul_id, self.group_pigs_id)
na_admin_base = self.mail_message._needaction_count(cr, uid, domain=[])
- na_demo_base = self.mail_message._needaction_count(cr, user_demo.id, domain=[])
+ na_demo_base = self.mail_message._needaction_count(cr, user_raoul.id, domain=[])
# Test: number of unread notification = needaction on mail.message
notif_ids = self.mail_notification.search(cr, uid, [
@@ -573,12 +609,12 @@ class test_mail(TestMailMockups):
self.assertEqual(na_admin_group, 3, 'Admin should have 3 needaction related to Pigs')
# Test: demo has 0 new notifications (not a follower, not receiving its own messages), and 0 new needaction
notif_ids = self.mail_notification.search(cr, uid, [
- ('partner_id', '=', user_demo.partner_id.id),
+ ('partner_id', '=', user_raoul.partner_id.id),
('read', '=', False)
])
self.assertEqual(len(notif_ids), na_demo_base + 0, 'Demo should have 0 new unread notifications')
- na_demo = self.mail_message._needaction_count(cr, user_demo.id, domain=[])
- na_demo_group = self.mail_message._needaction_count(cr, user_demo.id, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)])
+ na_demo = self.mail_message._needaction_count(cr, user_raoul.id, domain=[])
+ na_demo_group = self.mail_message._needaction_count(cr, user_raoul.id, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)])
self.assertEqual(na_demo, na_demo_base + 0, 'Demo should have 0 new needaction')
self.assertEqual(na_demo_group, 0, 'Demo should have 0 needaction related to Pigs')
@@ -599,6 +635,9 @@ class test_mail(TestMailMockups):
# TDE note: temp various asserts because of the random bug about msg1.child_ids
msg_ids = self.mail_message.search(cr, uid, [('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], limit=1)
new_msg = self.mail_message.browse(cr, uid, msg_ids[0])
+ if new_msg.parent_id.id != msg1.id:
+ import pdb
+ pdb.set_trace()
self.assertEqual(new_msg.parent_id, msg1, 'Newly processed mail_message (%d) should have msg1 as parent (msg2 is %d)' % (new_msg.id, msg2.id))
# 2. References header
From 9ed87abad0c2272d04a57f0aa52e3e7980c7981c Mon Sep 17 00:00:00 2001
From: Antonin Bourguignon
Date: Mon, 22 Oct 2012 18:46:42 +0200
Subject: [PATCH 138/150] [IMP] add a rule to hide the create incentive in list
view this patch would deserve to be extented to the kanban view
bzr revid: abo@openerp.com-20121022164642-csadhjemb8zyzag6
---
addons/web/static/src/css/base.sass | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass
index 37830a8b109..568db634815 100644
--- a/addons/web/static/src/css/base.sass
+++ b/addons/web/static/src/css/base.sass
@@ -2178,7 +2178,9 @@ $sheet-max-width: 860px
.oe_list_handle
@include text-to-entypo-icon("}",#E0E0E0,18px)
margin-right: 7px
-
+ .oe_list_cannot_create
+ .oe_view_nocontent_create
+ display: none
.oe_list_cannot_edit
.oe_list_header_handle, .oe_list_field_handle
display: none !important
From 2f4bf4641e35d4dff70c6af5e490b60030624afb Mon Sep 17 00:00:00 2001
From: Antonin Bourguignon
Date: Mon, 22 Oct 2012 18:49:14 +0200
Subject: [PATCH 139/150] [IMP] parse SASS and update CSS
bzr revid: abo@openerp.com-20121022164914-vqaivy1eyplo13e8
---
addons/web/static/src/css/base.css | 5204 +++++++++++++---------------
1 file changed, 2335 insertions(+), 2869 deletions(-)
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index eba41b23776..565bf9c12f5 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -1,4 +1,4 @@
-@charset "utf-8";
+@charset "UTF-8";
@font-face {
font-family: "mnmliconsRegular";
src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
@@ -6,8 +6,7 @@
src: url("/web/static/src/font/mnmliconsv21-webfont.ttf") format("truetype");
src: url("/web/static/src/font/mnmliconsv21-webfont.svg") format("svg") active;
font-weight: normal;
- font-style: normal;
-}
+ font-style: normal; }
@font-face {
font-family: "EntypoRegular";
@@ -17,22 +16,17 @@
src: url("/web/static/src/font/entypo-webfont.ttf") format("truetype");
src: url("/web/static/src/font/entypo-webfont.svg") format("svg") active;
font-weight: normal;
- font-style: normal;
-}
+ font-style: normal; }
@media print {
.oe_topbar, .oe_leftbar, .oe_loading {
- display: none !important;
- }
-}
+ display: none !important; } }
.openerp.openerp_webclient_container {
- height: 100%;
-}
+ height: 100%; }
.text-tag .text-button {
height: auto !important;
- min-height: 16px;
-}
+ min-height: 16px; }
.openerp {
padding: 0;
@@ -44,2853 +38,2332 @@
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
/* http://www.quirksmode.org/dom/inputfile.html
* http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image
- */
-}
-.openerp :-moz-placeholder {
- color: #afafb6 !important;
- font-style: italic !important;
-}
-.openerp ::-webkit-input-placeholder {
- color: #afafb6 !important;
- font-style: italic !important;
-}
-.openerp a {
- text-decoration: none;
- cursor: pointer !important;
-}
-.openerp table {
- padding: 0;
- border-collapse: collapse;
-}
-.openerp thead {
- font-weight: bold;
- background-color: #f0f0f0;
-}
-.openerp thead th {
- border-left: 1px solid #dfdfdf;
-}
-.openerp thead th:first-child {
- border-left: none;
-}
-.openerp thead th.null {
- border-left: none;
-}
-.openerp th, .openerp td {
- padding: 0;
- text-align: left;
-}
-.openerp th {
- font-weight: bold;
- vertical-align: middle;
-}
-.openerp td {
- vertical-align: top;
-}
-.openerp .zebra tbody tr:nth-child(odd) td {
- background-color: #f0f0fa;
- background-color: #f0f0fa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
- background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
-}
-.openerp .zebra tbody tr:hover td {
- background-color: #eeeeee;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#dedede));
- background-image: -webkit-linear-gradient(top, #eeeeee, #dedede);
- background-image: -moz-linear-gradient(top, #eeeeee, #dedede);
- background-image: -ms-linear-gradient(top, #eeeeee, #dedede);
- background-image: -o-linear-gradient(top, #eeeeee, #dedede);
- background-image: linear-gradient(to bottom, #eeeeee, #dedede);
-}
-.openerp input, .openerp textarea, .openerp select {
- padding: 2px 4px;
- border: 1px solid #cccccc;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- background: white;
-}
-.openerp img {
- vertical-align: middle;
-}
-.openerp h4 {
- margin: 4px 0;
-}
-.openerp a.button:link, .openerp a.button:visited, .openerp button, .openerp input[type='submit'], .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
- display: inline-block;
- border: 1px solid rgba(0, 0, 0, 0.4);
- color: #4c4c4c;
- margin: 0;
- padding: 3px 12px;
- font-size: 13px;
- text-align: center;
- background-color: #efefef;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
- background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
- background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
- background-image: -ms-linear-gradient(top, #efefef, #d8d8d8);
- background-image: -o-linear-gradient(top, #efefef, #d8d8d8);
- background-image: linear-gradient(to bottom, #efefef, #d8d8d8);
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
- -webkit-font-smoothing: antialiased;
- outline: none;
-}
-.openerp a.button:hover, .openerp button:hover, .openerp input[type='submit']:hover, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-hover {
- background-color: #f6f6f6;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
- background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
- cursor: pointer;
- background-position: 0;
-}
-.openerp a.button:focus, .openerp button:focus, .openerp input[type='submit']:focus, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-focus {
- border: 1px solid #80bfff;
- background-position: 0;
- background-color: #f6f6f6;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
- background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
- -moz-box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- -webkit-box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
-}
-.openerp a.button:active, .openerp a.button.active, .openerp button:active, .openerp button.active, .openerp input[type='submit']:active, .openerp input[type='submit'].active, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-active {
- background-color: #e3e3e3;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
- background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: -ms-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: -o-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: linear-gradient(to bottom, #e3e3e3, #f6f6f6);
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp a.button.disabled, .openerp button:disabled, .openerp input[type='submit']:disabled {
- background: #efefef !important;
- border: 1px solid #d1d1d1 !important;
- -moz-box-shadow: none !important;
- -webkit-box-shadow: none !important;
- box-shadow: none !important;
- color: #aaaaaa !important;
- cursor: default;
- text-shadow: 0 1px 1px white !important;
-}
-.openerp .ui-widget-content a {
- color: #7c7bad;
-}
-.openerp .oe_bounce_container {
- display: inline-block;
-}
-.openerp .ui-tabs {
- position: static;
-}
-.openerp.ui-dialog {
- display: none;
- padding: 6px;
- background-color: rgba(60, 60, 60, 0.7);
- border: 1px solid;
- border-color: #888888 #555555 #444444;
- -moz-border-radius: 8px;
- -webkit-border-radius: 8px;
- border-radius: 8px;
- -moz-box-shadow: 0 1px 12px rgba(0, 0, 0, 0.6);
- -webkit-box-shadow: 0 1px 12px rgba(0, 0, 0, 0.6);
- box-shadow: 0 1px 12px rgba(0, 0, 0, 0.6);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.openerp.ui-dialog .ui-dialog-content {
- padding: 0px;
-}
-.openerp.ui-dialog .ui-dialog-titlebar, .openerp.ui-dialog .ui-dialog-content, .openerp.ui-dialog .ui-dialog-buttonpane {
- padding: 16px;
-}
-.openerp.ui-dialog .ui-dialog-titlebar {
- border-bottom: 1px solid #cacaca;
- -moz-border-radius: 2px 2px 0 0;
- -webkit-border-radius: 2px 2px 0 0;
- border-radius: 2px 2px 0 0;
- background-color: #fcfcfc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
- background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
- background-image: linear-gradient(to bottom, #fcfcfc, #dedede);
-}
-.openerp.ui-dialog .ui-dialog-titlebar .ui-dialog-title {
- margin: 0;
- padding: 0;
-}
-.openerp.ui-dialog .ui-widget-header {
- border: none;
-}
-.openerp.ui-dialog .ui-dialog-content {
- background: white;
-}
-.openerp.ui-dialog .ui-dialog-buttonpane {
- border-top: 1px solid #e0e0e0;
- background: #f5f7f9;
- margin: 0;
- -moz-border-radius: 0 0 2px 2px;
- -webkit-border-radius: 0 0 2px 2px;
- border-radius: 0 0 2px 2px;
-}
-.openerp.ui-dialog .ui-dialog-buttonpane button {
- margin: 0 4px 0 0;
-}
-.openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: left;
-}
-.openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
- margin-right: 4px;
-}
-.openerp.ui-dialog .ui-dialog-titlebar-close {
- padding: 0;
-}
-.openerp.ui-dialog .ui-dialog-titlebar-close .ui-icon-closethick {
- display: none;
-}
-.openerp.ui-dialog .ui-dialog-titlebar-close:before {
- content: "×";
- font-size: 18px;
- font-weight: bold;
- line-height: 16px;
- color: black;
- text-shadow: 0 1px 0 white;
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
-}
-.openerp.ui-dialog .ui-dialog-titlebar-close:before:hover {
- color: black;
- text-decoration: none;
-}
-.openerp.ui-dialog .oe_about {
- background-color: white;
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
- -moz-border-radius: 0 0 2px 2px;
- -webkit-border-radius: 0 0 2px 2px;
- border-radius: 0 0 2px 2px;
-}
-.openerp.ui-dialog .oe_about a {
- color: #7c7bad;
-}
-.openerp.ui-dialog .oe_about a:hover {
- text-decoration: underline;
-}
-.openerp.ui-dialog .oe_about a:focus {
- outline: none;
-}
-.openerp.ui-dialog .oe_about .oe_logo {
- margin-left: -6px;
-}
-.openerp.ui-dialog .oe_about .oe_bottom {
- position: absolute;
- top: 50%;
- left: 0;
- right: 0;
- bottom: 0;
- text-shadow: 0 1px 1px #999999;
- background-color: #b41616;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
- background-image: -webkit-linear-gradient(top, #b41616, #600606);
- background-image: -moz-linear-gradient(top, #b41616, #600606);
- background-image: -ms-linear-gradient(top, #b41616, #600606);
- background-image: -o-linear-gradient(top, #b41616, #600606);
- background-image: linear-gradient(to bottom, #b41616, #600606);
- color: #eeeeee;
- padding: 0 16px;
- -moz-border-radius: 0 0 2px 2px;
- -webkit-border-radius: 0 0 2px 2px;
- border-radius: 0 0 2px 2px;
-}
-.openerp.ui-dialog .oe_about .oe_bottom a {
- color: #eeeeee;
-}
-.openerp.ui-dialog.oe_act_window .ui-dialog-content {
- padding: 0px;
-}
-.openerp .modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: black;
- filter: alpha(opacity=30);
- opacity: 0.3;
-}
-.openerp .oe_i {
- font-family: "mnmliconsRegular" !important;
- font-size: 21px;
- font-weight: 300 !important;
-}
-.openerp .oe_e {
- font-family: "entypoRegular" !important;
- font-size: 34px;
- font-weight: 300 !important;
-}
-.openerp .oe_left {
- float: left;
- margin-right: 8px;
-}
-.openerp .oe_right {
- float: right;
- margin-left: 8px;
-}
-.openerp .oe_text_right {
- text-align: right;
-}
-.openerp .oe_clear {
- clear: both;
-}
-.openerp .oe_wait {
- cursor: wait;
-}
-.openerp .oe_fade {
- color: #888888;
- font-weight: normal;
-}
-.openerp .oe_bold {
- font-weight: bold;
-}
-.openerp .oe_inline {
- width: auto !important;
-}
-.openerp .oe_highlight {
- color: white;
- background: #dc5f59;
-}
-.openerp button.oe_highlight {
- background-color: #df3f3f;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));
- background-image: -webkit-linear-gradient(top, #df3f3f, #a21a1a);
- background-image: -moz-linear-gradient(top, #df3f3f, #a21a1a);
- background-image: -ms-linear-gradient(top, #df3f3f, #a21a1a);
- background-image: -o-linear-gradient(top, #df3f3f, #a21a1a);
- background-image: linear-gradient(to bottom, #df3f3f, #a21a1a);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
-}
-.openerp button.oe_highlight:hover {
- background-color: #e25858;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e25858), to(#ab1b1b));
- background-image: -webkit-linear-gradient(top, #e25858, #ab1b1b);
- background-image: -moz-linear-gradient(top, #e25858, #ab1b1b);
- background-image: -ms-linear-gradient(top, #e25858, #ab1b1b);
- background-image: -o-linear-gradient(top, #e25858, #ab1b1b);
- background-image: linear-gradient(to bottom, #e25858, #ab1b1b);
-}
-.openerp button.oe_highlight:active {
- background-color: #c52020;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#c52020), to(#d22323));
- background-image: -webkit-linear-gradient(top, #c52020, #d22323);
- background-image: -moz-linear-gradient(top, #c52020, #d22323);
- background-image: -ms-linear-gradient(top, #c52020, #d22323);
- background-image: -o-linear-gradient(top, #c52020, #d22323);
- background-image: linear-gradient(to bottom, #c52020, #d22323);
-}
-.openerp .oe_background_grey {
- background: #eeeeee !important;
-}
-.openerp .oe_form_dirty .oe_highlight_on_dirty {
- color: white;
- background: #dc5f59;
- font-weight: bold;
-}
-.openerp .oe_form_dirty button.oe_highlight_on_dirty {
- background-color: #dc5f59;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dc5f59), to(#b33630));
- background-image: -webkit-linear-gradient(top, #dc5f59, #b33630);
- background-image: -moz-linear-gradient(top, #dc5f59, #b33630);
- background-image: -ms-linear-gradient(top, #dc5f59, #b33630);
- background-image: -o-linear-gradient(top, #dc5f59, #b33630);
- background-image: linear-gradient(to bottom, #dc5f59, #b33630);
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_form_dirty button.oe_highlight_on_dirty:hover {
- background: #ed6f6a;
-}
-.openerp .oe_title {
- width: 50%;
- float: left;
-}
-.openerp .oe_title:after {
- content: ".";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
-}
-.openerp .oe_button_box {
- width: 270px;
- text-align: right;
-}
-.openerp .oe_button_box button {
- margin: 4px;
-}
-.openerp .oe_avatar > img {
- max-height: 90px;
- max-width: 90px;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
- border: none;
- margin-bottom: 10px;
-}
-.openerp .oe_avatar + div {
- margin-left: 5px;
-}
-.openerp .oe_image_small > img {
- max-width: 50px;
- max-height: 50px;
-}
-.openerp .oe_image_medium > img {
- max-width: 180px;
- max-height: 180px;
-}
-.openerp .oe_button.oe_link {
- border: none;
- padding: 0;
- margin: 0;
- background: none;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_button.oe_link img {
- display: none;
-}
-.openerp .oe_button.oe_link span {
- border: none;
- padding: 0;
- margin: 0;
- background: none;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
- color: #7c7bad;
- font-weight: bold;
-}
-.openerp .oe_button.oe_link span:hover {
- text-decoration: underline;
-}
-.openerp .oe_webclient .oe_star_on, .openerp .oe_webclient .oe_star_off {
- color: #cccccc;
- text-shadow: 0 0 2px black;
- vertical-align: top;
- position: relative;
- top: -5px;
-}
-.openerp .oe_webclient .oe_star_on:hover, .openerp .oe_webclient .oe_star_off:hover {
- text-decoration: none;
-}
-.openerp .oe_webclient .oe_star_on {
- color: gold;
-}
-.openerp p.oe_grey {
- max-width: 650px;
-}
-.openerp .oe_grey {
- color: #aaaaaa;
-}
-.openerp .oe_tag {
- border: 1px solid #afafb6;
- font-size: 11px;
- padding: 2px 4px;
- margin: 0 2px 2px 0;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- background: #f0f0fa;
- color: #4c4c4c;
-}
-.openerp .oe_tag_dark {
- background: #7c7bad;
- color: #eeeeee;
-}
-.openerp .oe_tags {
- margin-bottom: 1px;
-}
-.openerp .oe_tags.oe_inline {
- min-width: 250px;
-}
-.openerp .oe_tags .text-wrap {
- width: 100% !important;
-}
-.openerp .oe_tags .text-wrap textarea {
- width: 100% !important;
-}
-.openerp .oe_tags .text-core .text-wrap .text-dropdown .text-list .text-suggestion em {
- font-style: italic;
- text-decoration: none;
-}
-.openerp.oe_tooltip {
- font-size: 12px;
-}
-.openerp.oe_tooltip .oe_tooltip_string {
- color: #ffdd55;
- font-weight: bold;
- font-size: 13px;
-}
-.openerp.oe_tooltip .oe_tooltip_help {
- white-space: pre-wrap;
-}
-.openerp.oe_tooltip .oe_tooltip_technical {
- padding: 0 0 4px 0;
- margin: 5px 0 0 15px;
-}
-.openerp.oe_tooltip .oe_tooltip_technical li {
- list-style: circle;
-}
-.openerp.oe_tooltip .oe_tooltip_technical_title {
- font-weight: bold;
-}
-.openerp.oe_tooltip .oe_tooltip_close {
- margin: -5px 0 0 2px;
- cursor: default;
- float: right;
- color: white;
-}
-.openerp.oe_tooltip .oe_tooltip_close:hover {
- color: #999999;
- cursor: pointer;
-}
-.openerp.oe_tooltip .oe_tooltip_message {
- max-width: 310px;
-}
-.openerp .oe_notebook {
- margin: 8px 0;
- padding: 0 16px;
- list-style: none;
- zoom: 1;
-}
-.openerp .oe_notebook.ui-corner-all {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
-}
-.openerp .oe_notebook:before, .openerp .oe_notebook:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.openerp .oe_notebook:after {
- clear: both;
-}
-.openerp .oe_notebook > li {
- float: left;
-}
-.openerp .oe_notebook > li > a {
- display: block;
- color: #4c4c4c;
-}
-.openerp .oe_notebook {
- border-color: #dddddd;
- border-style: solid;
- border-width: 0 0 1px;
-}
-.openerp .oe_notebook > li {
- position: relative;
-}
-.openerp .oe_notebook > li > a {
- padding: 0 12px;
- margin-right: 2px;
- line-height: 30px;
- border: 1px solid transparent;
- -moz-border-radius: 4px 4px 0 0;
- -webkit-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-.openerp .oe_notebook > li > a:hover {
- text-decoration: none;
- background-color: #eeeeee;
- border-color: #eeeeee #eeeeee #dddddd;
-}
-.openerp .oe_notebook > li.ui-state-active > a, .openerp .oe_notebook > li.ui-state-active > a:hover {
- background-color: white;
- border: 1px solid #dddddd;
- border-bottom-color: transparent;
- cursor: default;
-}
-.openerp .oe_notebook_page {
- padding: 0;
-}
-.openerp div.ui-tabs {
- padding: 3px 0px 3px 0px;
-}
-.openerp .ui-tabs-hide {
- display: none;
-}
-.openerp .oe_dropdown, .openerp .oe_dropdown_hover, .openerp .oe_dropdown_toggle {
- position: relative;
- cursor: pointer;
-}
-.openerp .oe_dropdown_toggle {
- color: rgba(0, 0, 0, 0.5);
- font-weight: normal;
-}
-.openerp .oe_dropdown_hover:hover .oe_dropdown_menu, .openerp .oe_dropdown_menu.oe_opened {
- display: block;
-}
-.openerp .oe_dropdown_menu {
- display: none;
- position: absolute;
- top: 26px;
- left: 0;
- z-index: 3;
- margin: 0;
- padding: 0;
- border: 1px solid #afafb6;
- background: white;
- padding: 4px 0;
- min-width: 140px;
- text-align: left;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
-}
-.openerp .oe_dropdown_menu > li {
- list-style-type: none;
- float: none;
- display: block;
- position: relative;
- margin: 0;
- padding: 2px 8px;
-}
-.openerp .oe_dropdown_menu > li:hover {
- background-color: #f0f0fa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
- background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_dropdown_menu > li > a {
- white-space: nowrap;
- display: block;
- color: #4c4c4c;
- text-decoration: none;
-}
-.openerp .oe_dropdown_menu > li > a:hover {
- text-decoration: none;
-}
-.openerp .oe_dropdown_arrow:after {
- width: 0;
- height: 0;
- display: inline-block;
- content: "&darr";
- text-indent: -99999px;
- vertical-align: top;
- margin-top: 8px;
- margin-left: 3px;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- border-top: 4px solid #404040;
- filter: alpha(opacity=50);
- opacity: 0.5;
-}
-.openerp .oe_sidebar {
- white-space: nowrap;
-}
-.openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment {
- height: 20px;
- cursor: pointer;
- padding-left: 6px;
- margin-top: 6px;
-}
-.openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment span {
- font-weight: bold;
-}
-.openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment .oe_hidden_input_file {
- width: 200px;
-}
-.openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment:hover {
- background-color: #f0f0fa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
- background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_sidebar .oe_dropdown_menu li .oe_sidebar_delete_item {
- position: absolute;
- top: 4px;
- right: 4px;
- display: none;
- width: 12px;
- height: 12px;
- padding: 1px;
- color: #8786b7;
- line-height: 8px;
- text-align: center;
- font-weight: bold;
- text-shadow: 0 1px 1px white;
-}
-.openerp .oe_sidebar .oe_dropdown_menu li .oe_sidebar_delete_item:hover {
- text-decoration: none;
- color: white;
- background: #8786b7;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-.openerp .oe_sidebar .oe_dropdown_menu li:hover .oe_sidebar_delete_item {
- display: inline-block;
-}
-.openerp .oe_loading {
- display: none;
- z-index: 100;
- position: fixed;
- top: 0;
- right: 50%;
- padding: 4px 12px;
- background: #a61300;
- color: white;
- text-align: center;
- border: 1px solid #990000;
- border-top: none;
- -moz-border-radius-bottomright: 8px;
- -moz-border-radius-bottomleft: 8px;
- border-bottom-right-radius: 8px;
- border-bottom-left-radius: 8px;
-}
-.openerp .oe_notification {
- z-index: 1050;
-}
-.openerp .oe_login {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
- text-align: center;
- font-size: 14px;
- height: 100%;
-}
-.openerp .oe_login ul, .openerp .oe_login li {
- margin: 0;
- list-style-type: none;
- padding: 0 0 4px 0;
-}
-.openerp .oe_login button {
- float: right;
- display: inline-block;
- cursor: pointer;
- padding: 6px 16px;
- border: 1px solid #222222;
- color: white;
- margin: 0;
- background-color: #b92020;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#b92020), to(#600606));
- background-image: -webkit-linear-gradient(top, #b92020, #600606);
- background-image: -moz-linear-gradient(top, #b92020, #600606);
- background-image: -ms-linear-gradient(top, #b92020, #600606);
- background-image: -o-linear-gradient(top, #b92020, #600606);
- background-image: linear-gradient(to bottom, #b92020, #600606);
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
-}
-.openerp .oe_login input, .openerp .oe_login select {
- width: 252px;
- font-family: "Lucida Grande", Helvetica, Verdana, Arial;
- border: 1px solid #999999;
- background: whitesmoke;
- -moz-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4);
- -webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4);
- box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4);
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
-}
-.openerp .oe_login input {
- margin-bottom: 9px;
- padding: 5px 6px;
-}
-.openerp .oe_login select {
- padding: 1px;
-}
-.openerp .oe_login .oe_login_dbpane {
- position: fixed;
- top: 0;
- right: 8px;
- padding: 5px 10px;
- color: #eeeeee;
- border: solid 1px #333333;
- background: #1e1e1e;
- background: rgba(30, 30, 30, 0.94);
- -moz-border-radius: 0 0 8px 8px;
- -webkit-border-radius: 0 0 8px 8px;
- border-radius: 0 0 8px 8px;
-}
-.openerp .oe_login .oe_login_dbpane input {
- padding: 2px 4px;
- margin: 4px 0;
-}
-.openerp .oe_login .oe_login_bottom {
- position: absolute;
- top: 50%;
- left: 0;
- right: 0;
- bottom: 0;
- text-shadow: 0 1px 1px #999999;
- background-color: #b41616;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
- background-image: -webkit-linear-gradient(top, #b41616, #600606);
- background-image: -moz-linear-gradient(top, #b41616, #600606);
- background-image: -ms-linear-gradient(top, #b41616, #600606);
- background-image: -o-linear-gradient(top, #b41616, #600606);
- background-image: linear-gradient(to bottom, #b41616, #600606);
-}
-.openerp .oe_login .oe_login_pane {
- position: absolute;
- top: 50%;
- left: 50%;
- margin: -160px -166px;
- border: solid 1px #333333;
- background: #1e1e1e;
- background: rgba(30, 30, 30, 0.94);
- padding: 22px 32px;
- color: #eeeeee;
- text-align: left;
- -moz-border-radius: 8px;
- -webkit-border-radius: 8px;
- border-radius: 8px;
- -moz-box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
- -webkit-box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
- box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
-}
-.openerp .oe_login .oe_login_pane h2 {
- margin-top: 0;
- font-size: 18px;
-}
-.openerp .oe_login .oe_login_logo {
- position: absolute;
- top: -70px;
- left: 0;
- width: 100%;
- margin: 0 auto;
- text-align: center;
-}
-.openerp .oe_login .oe_login_footer {
- position: absolute;
- bottom: -40px;
- left: 0;
- width: 100%;
- text-align: center;
-}
-.openerp .oe_login .oe_login_footer a {
- color: #eeeeee;
- margin: 0 8px;
-}
-.openerp .oe_login .oe_login_footer a:hover {
- text-decoration: underline;
-}
-.openerp .oe_login .oe_login_footer span {
- font-weight: bold;
- font-size: 16px;
-}
-.openerp .oe_login .oe_login_error_message {
- display: none;
- background-color: #b41616;
- color: #eeeeee;
- padding: 14px 18px;
- margin-top: 15px;
- text-align: center;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
-}
-.openerp .oe_login_invalid .oe_login_error_message {
- display: inline-block;
-}
-.openerp .oe_database_manager {
- background: white;
- color: black;
- text-align: left;
-}
-.openerp .oe_database_manager .oe_database_manager_menu {
- color: black;
-}
-.openerp .oe_webclient {
- width: 100%;
- height: 100%;
- border-spacing: 0px;
-}
-.openerp .oe_content_full_screen .oe_application {
- top: 0;
- left: 0;
-}
-.openerp .oe_content_full_screen .oe_topbar, .openerp .oe_content_full_screen .oe_leftbar {
- display: none;
-}
-.openerp .oe_topbar {
- width: 100%;
- height: 32px;
- background-color: #414141;
- background-color: #646060;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626));
- background-image: -webkit-linear-gradient(top, #646060, #262626);
- background-image: -moz-linear-gradient(top, #646060, #262626);
- background-image: -ms-linear-gradient(top, #646060, #262626);
- background-image: -o-linear-gradient(top, #646060, #262626);
- background-image: linear-gradient(to bottom, #646060, #262626);
-}
-.openerp .oe_topbar .oe_topbar_item {
- display: block;
- padding: 5px 10px 7px;
- line-height: 20px;
- height: 20px;
- text-decoration: none;
- color: #eeeeee;
- vertical-align: top;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- -webkit-transition: all 0.2s ease-out;
- -moz-transition: all 0.2s ease-out;
- -ms-transition: all 0.2s ease-out;
- -o-transition: all 0.2s ease-out;
- transition: all 0.2s ease-out;
-}
-.openerp .oe_topbar .oe_topbar_item:hover {
- background: rgba(0, 0, 0, 0.2);
- text-shadow: black 0px 0px 3px;
- color: white;
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
-}
-.openerp .oe_topbar .oe_topbar_avatar {
- width: 24px;
- height: 24px;
- margin: -2px 2px 0 0;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
-}
-.openerp .oe_topbar .oe_topbar_avatar {
- vertical-align: top;
-}
-.openerp .oe_topbar .oe_dropdown_arrow:after {
- border-top: 4px solid white;
-}
-.openerp .oe_topbar .oe_dropdown_menu {
- top: 32px;
- background: #333333;
- background: rgba(37, 37, 37, 0.9);
- border-color: #999999;
- border-color: rgba(0, 0, 0, 0.2);
- border-style: solid;
- border-width: 0 1px 1px;
- -moz-border-radius: 0 0 6px 6px;
- -webkit-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.openerp .oe_topbar .oe_dropdown_menu li {
- float: none;
- padding: 3px 12px;
-}
-.openerp .oe_topbar .oe_dropdown_menu li a {
- color: #eeeeee;
-}
-.openerp .oe_topbar .oe_dropdown_menu li:hover {
- background-color: #292929;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919));
- background-image: -webkit-linear-gradient(top, #292929, #191919);
- background-image: -moz-linear-gradient(top, #292929, #191919);
- background-image: -ms-linear-gradient(top, #292929, #191919);
- background-image: -o-linear-gradient(top, #292929, #191919);
- background-image: linear-gradient(to bottom, #292929, #191919);
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_menu {
- float: left;
- padding: 0;
- margin: 0;
- font-size: 13px;
-}
-.openerp .oe_menu > li {
- list-style-type: none;
- padding: 0;
- margin: 0;
- float: left;
- display: block;
- color: #eeeeee;
-}
-.openerp .oe_menu > li > a {
- display: block;
- padding: 5px 10px 7px;
- line-height: 20px;
- height: 20px;
- text-decoration: none;
- color: #eeeeee;
- vertical-align: top;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- -webkit-transition: all 0.2s ease-out;
- -moz-transition: all 0.2s ease-out;
- -ms-transition: all 0.2s ease-out;
- -o-transition: all 0.2s ease-out;
- transition: all 0.2s ease-out;
-}
-.openerp .oe_menu > li > a:hover {
- background: rgba(0, 0, 0, 0.2);
- text-shadow: black 0px 0px 3px;
- color: white;
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
-}
-.openerp .oe_menu > li > .oe_active {
- background: rgba(0, 0, 0, 0.3);
- text-shadow: black 0px 0px 3px;
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
-}
-.openerp .oe_user_menu {
- float: right;
- padding: 0;
- margin: 0;
-}
-.openerp .oe_user_menu li {
- list-style-type: none;
- float: left;
-}
-.openerp .oe_user_menu .oe_dropdown_menu {
- right: -1px;
-}
-.openerp .oe_systray > div {
- float: left;
- padding: 0 4px 0 4px;
-}
-.openerp .oe_systray {
- float: right;
-}
-.openerp .oe_leftbar {
- display: none;
- width: 220px;
- background: #f0eeee;
- border-right: 1px solid #afafb6;
- text-shadow: 0 1px 1px white;
- padding-bottom: 16px;
-}
-.openerp a.oe_logo {
- width: 220px;
- display: block;
- text-align: center;
- height: 70px;
- line-height: 70px;
-}
-.openerp a.oe_logo img {
- height: 40px;
- width: 157px;
- margin: 14px 0;
-}
-.openerp .oe_footer {
- position: fixed;
- bottom: 0;
- padding: 4px 0;
- background: #f0eeee;
- width: 220px;
- text-align: center;
-}
-.openerp .oe_footer a {
- font-weight: 800;
- font-family: serif;
- font-size: 16px;
- color: black;
-}
-.openerp .oe_footer a span {
- color: #c81010;
- font-style: italic;
-}
-.openerp .oe_secondary_menu_section {
- font-weight: bold;
- margin-left: 8px;
- color: #7c7bad;
-}
-.openerp .oe_secondary_submenu {
- padding: 2px 0 8px 0;
- margin: 0;
- width: 100%;
- display: inline-block;
-}
-.openerp .oe_secondary_submenu li {
- position: relative;
- margin: 0;
- padding: 1px 0 1px 20px !important;
- list-style-type: none;
-}
-.openerp .oe_secondary_submenu li a {
- display: block;
- color: #4c4c4c;
- padding: 2px 4px 2px 0;
-}
-.openerp .oe_secondary_submenu li .oe_menu_label {
- position: absolute;
- top: 1px;
- right: 1px;
- font-size: 10px;
- background: #7c7bad;
- color: white;
- padding: 2px 4px;
- margin: 1px 6px 0 0;
- border: 1px solid lightGray;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
-}
-.openerp .oe_secondary_submenu .oe_menu_counter {
- float: right;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- margin: 1px;
- padding: 1px 4px;
- border: none;
-}
-.openerp .oe_secondary_submenu .oe_menu_counter:hover {
- cursor: pointer;
- -webkit-transform: scale(1.1);
- -moz-transform: scale(1.1);
- -ms-transform: scale(1.1);
- -o-transform: scale(1.1);
- transform: scale(1.1);
-}
-.openerp .oe_secondary_submenu .oe_active {
- border-top: 1px solid lightGray;
- border-bottom: 1px solid #dedede;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
- background: #7c7bad;
-}
-.openerp .oe_secondary_submenu .oe_active a {
- color: white;
-}
-.openerp .oe_secondary_submenu .oe_active .oe_menu_label {
- background: #eeeeee;
- color: #7c7bad;
- text-shadow: 0 1px 1px white;
- -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-}
-.openerp .oe_secondary_submenu .oe_active .oe_menu_counter {
- background: #eeeeee;
- color: #7c7bad;
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
-}
-.openerp .oe_secondary_submenu .oe_menu_toggler:before {
- width: 0;
- height: 0;
- display: inline-block;
- content: "&darr";
- text-indent: -99999px;
- vertical-align: top;
- margin-left: -12px;
- margin-top: 4px;
- margin-right: 4px;
- border-top: 4px solid transparent;
- border-bottom: 4px solid transparent;
- border-left: 4px solid #4c4c4c;
- filter: alpha(opacity=50);
- opacity: 0.5;
-}
-.openerp .oe_secondary_submenu .oe_menu_opened:before {
- margin-top: 6px;
- margin-left: -16px;
- margin-right: 4px;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- border-top: 4px solid #4c4c4c;
-}
-.openerp .oe_about {
- background-color: white;
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
- -moz-border-radius: 0 0 2px 2px;
- -webkit-border-radius: 0 0 2px 2px;
- border-radius: 0 0 2px 2px;
-}
-.openerp .oe_about a {
- color: #7c7bad;
-}
-.openerp .oe_about a:hover {
- text-decoration: underline;
-}
-.openerp .oe_about a:focus {
- outline: none;
-}
-.openerp .oe_about .oe_logo {
- margin-left: -6px;
-}
-.openerp .oe_about .oe_bottom {
- position: absolute;
- top: 50%;
- left: 0;
- right: 0;
- bottom: 0;
- text-shadow: 0 1px 1px #999999;
- background-color: #b41616;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
- background-image: -webkit-linear-gradient(top, #b41616, #600606);
- background-image: -moz-linear-gradient(top, #b41616, #600606);
- background-image: -ms-linear-gradient(top, #b41616, #600606);
- background-image: -o-linear-gradient(top, #b41616, #600606);
- background-image: linear-gradient(to bottom, #b41616, #600606);
- color: #eeeeee;
- padding: 0 16px;
- -moz-border-radius: 0 0 2px 2px;
- -webkit-border-radius: 0 0 2px 2px;
- border-radius: 0 0 2px 2px;
-}
-.openerp .oe_about .oe_bottom a {
- color: #eeeeee;
-}
-.openerp .oe_application {
- width: 100%;
-}
-.openerp .oe_application a {
- color: #7c7bad;
-}
-.openerp .oe_application a:hover {
- text-decoration: underline;
-}
-.openerp .oe_application > div {
- height: 100%;
-}
-.openerp .oe_application .oe_breadcrumb_item:not(:last-child) {
- display: inline-block;
- max-width: 7em;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.openerp .oe_view_manager .oe_view_manager_body {
- height: inherit;
-}
-.openerp .oe_view_manager .oe_view_manager_view_kanban {
- height: inherit;
-}
-.openerp .oe_view_manager table.oe_view_manager_header {
- width: 100%;
- table-layout: fixed;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_header_row {
- clear: both;
- text-shadow: 0 1px 1px white;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_header_row:last-child td {
- padding-top: 0;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_header_row:first-child td {
- padding-top: 8px;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_view_manager_sidebar {
- margin: 0px auto;
- text-align: center;
-}
-.openerp .oe_view_manager table.oe_view_manager_header td {
- line-height: 26px;
-}
-.openerp .oe_view_manager table.oe_view_manager_header h2 {
- font-size: 18px;
- margin: 0;
- float: left;
-}
-.openerp .oe_view_manager table.oe_view_manager_header h2 a {
- color: #7c7bad;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_dropdown_menu {
- line-height: normal;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group {
- display: inline-block;
- border: 1px solid #ababab;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius: 5px;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group li {
- float: left;
- border-right: 1px solid #ababab;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group li:last-child {
- border: none;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group a {
- color: #4c4c4c;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group a:hover {
- text-decoration: none;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group .active {
- background: #999999;
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_button_group .active a {
- color: white;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
-}
-.openerp .oe_view_manager table.oe_view_manager_header .oe_view_manager_buttons {
- white-space: nowrap;
-}
-.openerp .oe_view_manager .oe_view_manager_pager {
- line-height: 26px;
-}
-.openerp .oe_view_manager .oe_view_manager_pager .oe_list_pager_single_page .oe_pager_group {
- display: none;
-}
-.openerp .oe_view_manager .oe_pager_value {
- float: left;
- margin-right: 8px;
-}
-.openerp .oe_view_manager ul.oe_pager_group {
- padding: 0;
- margin: 0;
-}
-.openerp .oe_view_manager .oe_pager_group {
- float: left;
- height: 24px;
- line-height: 24px;
- display: inline-block;
- border: 1px solid #ababab;
- cursor: pointer;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius: 5px;
-}
-.openerp .oe_view_manager .oe_pager_group li {
- height: 24px;
- line-height: 24px;
- padding: 0;
- margin: 0;
- list-style-type: none;
- float: left;
- border-right: 1px solid #ababab;
-}
-.openerp .oe_view_manager .oe_pager_group li:last-child {
- border: none;
-}
-.openerp .oe_view_manager .oe_pager_group a {
- color: #4c4c4c;
- padding: 0 8px;
-}
-.openerp .oe_view_manager .oe_pager_group a:hover {
- text-decoration: none;
-}
-.openerp .oe_view_manager .oe_pager_group .active {
- background: #999999;
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
-}
-.openerp .oe_view_manager .oe_pager_group .active a {
- color: white;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
-}
-.openerp .oe_view_manager .oe_view_manager_switch {
- padding: 0;
- margin: 0 0 0 8px;
-}
-.openerp .oe_view_manager .oe_view_manager_switch li {
- margin: 0;
- width: 24px;
- height: 24px;
- line-height: 16px;
- padding: 0;
- text-align: center;
- list-style-type: none;
-}
-.openerp .oe_view_manager .oe_view_manager_switch li a {
- position: relative;
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_list:after, .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_tree:after {
- padding: 2px;
- content: "i";
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_form:after {
- content: "m";
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_graph:after {
- font-family: "mnmliconsRegular" !important;
- font-size: 21px;
- font-weight: 300 !important;
- content: "}";
- top: -2px;
- position: relative;
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_gantt:after {
- font-family: "mnmliconsRegular" !important;
- font-size: 21px;
- font-weight: 300 !important;
- content: "y";
- top: -2px;
- position: relative;
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_calendar:after {
- content: "P";
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_kanban:after {
- content: "k";
-}
-.openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_diagram:after {
- content: "f";
-}
-.openerp .oe_view_manager_current {
- height: 100%;
-}
-.openerp .oe_view_manager_current > .oe_view_manager_header {
- border-bottom: 1px solid #cacaca;
- background-color: #fcfcfc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
- background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
- background-image: linear-gradient(to bottom, #fcfcfc, #dedede);
- -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 9px rgba(0, 0, 0, 0.1);
- -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 9px rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 9px rgba(0, 0, 0, 0.1);
-}
-.openerp .oe_view_manager_current > .oe_view_manager_header .oe_header_row td {
- padding: 8px;
-}
-.openerp .oe_view_manager_current > .oe_view_manager_header .oe_header_row:first-child td {
- padding-top: 8px;
-}
-.openerp .oe_view_manager_inline, .openerp .oe_view_manager_inlineview {
- height: 100%;
-}
-.openerp .oe_view_manager_inline > .oe_view_manager_header, .openerp .oe_view_manager_inlineview > .oe_view_manager_header {
- display: none;
-}
-.openerp .oe_popup_form > .oe_formview > .oe_form_pager {
- display: none !important;
-}
-.openerp .oe_searchview {
- cursor: text;
- position: relative;
- float: right;
- padding: 1px 0;
- line-height: 18px;
- width: 400px;
- border: 1px solid #ababab;
- background: white;
- -moz-border-radius: 13px;
- -webkit-border-radius: 13px;
- border-radius: 13px;
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
-}
-.openerp .oe_searchview input, .openerp .oe_searchview textarea {
- padding: 3px;
- height: 14px;
- font-size: 12px;
- line-height: 18px;
-}
-.openerp .oe_searchview.oe_focused {
- border-color: #a6a6fe;
- -moz-box-shadow: 0 1px 2px #a6a6fe inset;
- -webkit-box-shadow: 0 1px 2px #a6a6fe inset;
- box-shadow: 0 1px 2px #a6a6fe inset;
-}
-.openerp .oe_searchview .oe_searchview_clear {
- cursor: pointer;
- position: absolute;
- top: 0;
- right: 18px;
- width: 15px;
- height: 100%;
- background: url(../img/search_reset.gif) center center no-repeat;
-}
-.openerp .oe_searchview .oe_searchview_unfold_drawer {
- position: absolute;
- top: 0;
- right: 0;
- height: 100%;
- padding: 0 7px 0 4px;
- color: #cccccc;
- cursor: pointer;
-}
-.openerp .oe_searchview .oe_searchview_unfold_drawer:hover {
- color: #999999;
-}
-.openerp .oe_searchview .oe_searchview_unfold_drawer:before {
- position: absolute;
- top: 10px;
- right: 7px;
- width: 0;
- height: 0;
- display: inline-block;
- content: "";
- vertical-align: top;
- border-top: 5px solid #4c4c4c;
- border-left: 5px solid transparent;
- border-right: 5px solid transparent;
- filter: alpha(opacity=50);
- opacity: 0.5;
-}
-.openerp .oe_searchview .oe_searchview_search {
- font-size: 1px;
- letter-spacing: -1px;
- color: transparent;
- font-weight: normal;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
- position: absolute;
- left: 3px;
- top: 1px;
- padding: 0;
- border: none;
- background: transparent;
-}
-.openerp .oe_searchview .oe_searchview_search:before {
- font: 21px "mnmliconsRegular";
- content: "r";
- color: #a3a3a3;
-}
-.openerp .oe_searchview .oe_searchview_facets {
- min-height: 22px;
- margin-left: 15px;
-}
-.openerp .oe_searchview .oe_searchview_facets * {
- vertical-align: top;
- display: inline-block;
- line-height: 17px;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
- height: 18px;
- margin: 1px 0;
- font-size: 11px;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
- outline: none;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_input {
- padding: 0 0 0 6px;
- font-size: 12px;
- height: 16px;
- margin-top: 3px;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_input:focus {
- outline: none;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
- position: relative;
- cursor: pointer;
- padding: 0;
- -webkit-font-smoothing: auto;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
- border-color: #a6a6fe;
- -moz-box-shadow: 0 0 3px 1px #a6a6fe;
- -webkit-box-shadow: 0 0 3px 1px #a6a6fe;
- box-shadow: 0 0 3px 1px #a6a6fe;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_values {
- background: #f0f0fa;
- -moz-border-radius: 0 3px 3px 0;
- -webkit-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_category, .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value {
- height: 18px;
- padding: 0 4px;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_category {
- color: white;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_category.oe_i {
- font-size: 16px;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value {
- border-left: 1px solid #afafb6;
- text-shadow: 0 1px 1px white;
- color: #4c4c4c;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value:last-child {
- padding-right: 16px;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_remove {
- position: absolute;
- top: 3px;
- right: 3px;
- color: #8786b7;
- line-height: 8px;
- width: 12px;
- height: 12px;
- padding-top: 1px;
- text-align: center;
- font-weight: bold;
- cursor: pointer;
- text-shadow: 0 1px 1px white;
-}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_remove:hover {
- color: white;
- background: #8786b7;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-.openerp .oe_searchview.oe_searchview_open_drawer .oe_searchview_drawer {
- display: block;
-}
-.openerp .oe_searchview .oe_searchview_drawer {
- position: absolute;
- z-index: 100;
- margin-top: 4px;
- top: 100%;
- right: -1px;
- background-color: white;
- min-width: 100%;
- display: none;
- border: 1px solid #afafb6;
- text-align: left;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
-}
-.openerp .oe_searchview .oe_searchview_drawer > div {
- border-top: 1px solid #cccccc;
- margin: 0;
- padding: 8px;
-}
-.openerp .oe_searchview .oe_searchview_drawer > div:first-child {
- border-top: none;
- margin: 0;
-}
-.openerp .oe_searchview .oe_searchview_drawer h3 {
- margin: 8px 4px 4px 12px;
- color: #7c7bad;
- font-size: 13px;
-}
-.openerp .oe_searchview .oe_searchview_drawer h4, .openerp .oe_searchview .oe_searchview_drawer h4 * {
- margin: 0;
- cursor: pointer;
- font-weight: normal;
- display: inline-block;
-}
-.openerp .oe_searchview .oe_searchview_drawer h4:hover, .openerp .oe_searchview .oe_searchview_drawer h4 *:hover {
- background-color: #f0f0fa;
-}
-.openerp .oe_searchview .oe_searchview_drawer h4:before {
- content: "▸ ";
- color: #a3a3a3;
-}
-.openerp .oe_searchview .oe_searchview_drawer button {
- margin: 4px 0;
-}
-.openerp .oe_searchview .oe_searchview_drawer .button {
- border: none;
- background: transparent;
- padding: 0 2px;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section {
- display: table;
- width: 100%;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section > div {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- box-sizing: border-box;
- display: table-cell;
- width: 50%;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section ul {
- margin: 0 8px 8px;
- padding: 0;
- list-style: none;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li {
- list-style: none;
- padding: 2px 4px 2px 20px;
- line-height: 14px;
- color: inherit;
- cursor: pointer;
- position: relative;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li.oe_selected:before {
- content: "W";
- font-family: "entypoRegular" !important;
- font-size: 24px;
- font-weight: 300 !important;
- color: #a3a3a3;
- position: absolute;
- left: 4px;
- top: -2px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li:hover {
- background-color: #f0f0fa;
-}
-.openerp .oe_searchview .oe_searchview_drawer form {
- margin-left: 12px;
-}
-.openerp .oe_searchview .oe_searchview_drawer form p {
- margin: 4px 0;
- line-height: 18px;
-}
-.openerp .oe_searchview .oe_searchview_drawer form button {
- margin: 0 0 8px 0;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom {
- padding: 0 8px 8px 8px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom form {
- display: none;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li {
- cursor: pointer;
- position: relative;
- line-height: 14px;
- padding: 2px 4px 2px 20px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li:hover {
- background-color: #f0f0fa;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li button {
- position: absolute;
- top: 0;
- right: 5px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_dashboard form {
- display: none;
- margin-top: 2px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced form {
- display: none;
- margin-top: 8px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced button.oe_add_condition:before {
- content: "Z";
- font-family: "entypoRegular" !important;
- font-size: 24px;
- font-weight: 300 !important;
- margin-right: 4px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced ul {
- list-style: none;
- padding: 0;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li {
- position: relative;
- list-style: none;
- margin: 0;
- white-space: nowrap;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or {
- visibility: hidden;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or {
- opacity: 0.5;
- margin-left: -14px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_opened h4:before {
- content: "▾ ";
- position: relative;
- top: -1px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_opened form {
- display: block;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete, .openerp .oe_searchview .oe_searchview_drawer .searchview_extended_delete_prop {
- display: inline-block;
- width: 12px;
- height: 12px;
- line-height: 12px;
- padding: 1px;
- color: #8786b7;
- line-height: 8px;
- text-align: center;
- font-weight: bold;
- text-shadow: 0 1px 1px white;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete:hover, .openerp .oe_searchview .oe_searchview_drawer .searchview_extended_delete_prop:hover {
- text-decoration: none;
- color: white;
- background: #8786b7;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete {
- display: none;
- position: absolute;
- bottom: 1px;
- right: 4px;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_private:hover .oe_searchview_custom_delete, .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_public:hover .oe_searchview_custom_delete {
- display: inline-block;
-}
-.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_public:after {
- content: ",";
- font-family: "entypoRegular" !important;
- font-size: 22px;
- font-weight: 300 !important;
- margin: 0 0 0 4px;
- padding: 0;
-}
-.openerp .oe_view_nocontent {
- padding: 15px;
- margin-top: 0;
- color: #777777;
- font-size: 125%;
- max-width: 700px;
-}
-.openerp .oe_view_nocontent .oe_view_nocontent_create {
- background: transparent url(/web/static/src/img/view_empty_arrow.png) no-repeat 7px 0;
- margin-top: 0;
- padding-top: 35px;
- min-height: 28px;
- color: #4c4c4c;
-}
-.openerp .oe_view_nocontent > p {
- padding-left: 95px;
-}
-.openerp .oe_view_nocontent .oe_empty_custom_dashboard {
- background: transparent url(/web/static/src/img/graph_background.png) no-repeat 0 0;
- margin-top: -15px;
- padding: 100px 0 0 137px;
- min-height: 327px;
- margin-left: -15px;
-}
-.openerp .oe_formview {
- background: white;
-}
-.openerp .oe_form_dropdown_section {
- position: relative;
- display: inline-block;
-}
-.openerp .oe_form_invalid input, .openerp .oe_form_invalid select, .openerp .oe_form_invalid textarea {
- background-color: #ff6666 !important;
- border: 1px solid #dd0000 !important;
-}
-.openerp .oe_view_manager_current .oe_form_editable .oe_highlight {
- color: #404040;
- background: none;
-}
-.openerp .oe_view_manager_current .oe_form_editable button.oe_highlight {
- background-color: #efefef;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
- background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
- background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
- background-image: -ms-linear-gradient(top, #efefef, #d8d8d8);
- background-image: -o-linear-gradient(top, #efefef, #d8d8d8);
- background-image: linear-gradient(to bottom, #efefef, #d8d8d8);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
-}
-.openerp .oe_view_manager_current .oe_form_editable button.oe_highlight:active {
- background-color: #e3e3e3;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
- background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: -ms-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: -o-linear-gradient(top, #e3e3e3, #f6f6f6);
- background-image: linear-gradient(to bottom, #e3e3e3, #f6f6f6);
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_view_manager_current .oe_form_editable button.oe_highlight:hover {
- background-color: #f6f6f6;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
- background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
- background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
-}
-.openerp .oe_form_invisible {
- display: none !important;
-}
-.openerp .oe_form_readonly .oe_edit_only, .openerp .oe_form_readonly .oe_form_field:empty {
- display: none !important;
-}
-.openerp .oe_form_readonly .oe_form .oe_form_field_date {
- width: auto;
-}
-.openerp .oe_form_nosheet {
- margin: 16px;
-}
-.openerp .oe_form_nosheet > header {
- margin: -16px -16px 0 -16px;
- padding: 0;
-}
-.openerp .oe_form_sheetbg {
- padding: 16px 0;
-}
-.openerp .oe_form_sheet_width {
- min-width: 650px;
- max-width: 860px;
- margin: 0 auto;
-}
-.openerp .oe_form_sheet {
- background: white;
- min-height: 330px;
- padding: 16px;
-}
-.openerp .oe_application .oe_form_sheetbg {
- background: url(/web/static/src/img/form_sheetbg.png);
- border-bottom: 1px solid #dddddd;
-}
-.openerp .oe_application .oe_form_sheet {
- border: 1px solid #c8c8d3;
- -moz-box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
- -webkit-box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
-}
-.openerp .oe_application .oe_form_sheet .ui-tabs {
- margin: 0 -16px;
-}
-.openerp .oe_application .oe_form_sheet .oe_notebook_page {
- padding: 0 16px;
-}
-.openerp .oe_form header {
- position: relative;
- border-bottom: 1px solid #cacaca;
- padding-left: 2px;
- background-color: #fcfcfc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
- background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
- background-image: linear-gradient(to bottom, #fcfcfc, #dedede);
-}
-.openerp .oe_form header > span {
- margin-left: 4px;
-}
-.openerp .oe_form header ul {
- display: inline-block;
- float: right;
-}
-.openerp .oe_form header .oe_button {
- margin: 3px 2px 1px;
-}
-.openerp .oe_form header .oe_button:first-child {
- margin-left: 6px;
-}
-.openerp .oe_form header .oe_tags {
- margin: 5px 0 0 5px;
- width: 400px;
- padding-bottom: 0;
-}
-.openerp .oe_form div.oe_chatter {
- min-width: 650px;
- max-width: 860px;
- margin: 0 auto;
- padding: 16px 0 48px;
-}
-.openerp .oe_form div.oe_form_configuration p, .openerp .oe_form div.oe_form_configuration ul, .openerp .oe_form div.oe_form_configuration ol {
- color: #aaaaaa;
- max-width: 650px;
-}
-.openerp .oe_form div.oe_form_configuration label {
- min-width: 150px;
-}
-.openerp .oe_form div.oe_form_configuration .oe_form_group_cell_label {
- padding: 1px 0;
-}
-.openerp .oe_form div.oe_form_configuration .oe_form_group_cell div div {
- padding: 1px 0;
-}
-.openerp .oe_form .oe_subtotal_footer {
- width: 1% !important;
-}
-.openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell {
- text-align: right;
- padding: 0 !important;
-}
-.openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell_label {
- border-right: none;
-}
-.openerp .oe_form .oe_subtotal_footer .oe_subtotal_footer_separator {
- width: 108px;
- border-top: 1px solid #cacaca;
- margin-top: 4px;
- padding-top: 4px;
- font-weight: bold;
- font-size: 18px;
-}
-.openerp .oe_form .oe_subtotal_footer label:after {
- content: ":";
-}
-.openerp .oe_form .oe_subtotal_footer label.oe_subtotal_footer_separator {
- font-weight: bold !important;
- padding: 2px 11px 2px 0px !important;
-}
-.openerp .oe_form .oe_subtotal_footer label.oe_form_label_help {
- font-weight: normal;
-}
-.openerp .oe_form .oe_form_button {
- margin: 2px;
-}
-.openerp .oe_form td.oe_form_group_cell_label {
- border-right: 1px solid #dddddd;
- padding: 2px 0px;
-}
-.openerp .oe_form td.oe_form_group_cell_label label {
- line-height: 18px;
- display: block;
- min-width: 140px;
-}
-.openerp .oe_form td.oe_form_group_cell + .oe_form_group_cell {
- padding: 2px 0 2px 8px;
-}
-.openerp .oe_form .oe_form_group {
- width: 100%;
- margin: 9px 0 9px 0;
-}
-.openerp .oe_form .oe_form_group .oe_form_group_cell.oe_group_right {
- padding-left: 20px;
-}
-.openerp .oe_form .oe_form_label_help[for], .openerp .oe_form .oe_form_label[for] {
- font-weight: bold;
- white-space: nowrap;
- padding-right: 8px;
-}
-.openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
- font-size: 80%;
- color: darkGreen;
- vertical-align: top;
- position: relative;
- top: -4px;
- padding: 0 2px;
-}
-.openerp .oe_horizontal_border {
- border-bottom: 1px solid black;
-}
-.openerp .oe_horizontal_separator {
- font-weight: bold;
- font-size: 20px;
- margin: 15px 0px 10px 0px;
- color: #7c7bad;
-}
-.openerp .oe_horizontal_separator:empty {
- height: 5px;
-}
-.openerp .oe_vertical_separator {
- border-left: 1px solid #666666;
- padding: 0 4px 0 4px;
-}
-.openerp .oe_form_field_progressbar {
- display: inline-block;
- min-width: 70px;
-}
-.openerp .oe_form_field_progressbar.ui-progressbar {
- height: 22px;
- font-size: 10px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- box-sizing: border-box;
- border: 1px solid #999999;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- background: white;
- min-width: 50px;
-}
-.openerp .oe_form_field_progressbar.ui-progressbar span {
- position: absolute;
- margin-left: 10px;
- font-weight: bold;
-}
-.openerp .oe_form_field_progressbar.ui-progressbar .ui-widget-header {
- background: #cccccc url(/web/static/lib/jquery.ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
-}
-.openerp .oe_form .oe_form_field_text {
- width: 100%;
-}
-.openerp .oe_form .oe_form_field_char input,
-.openerp .oe_form .oe_form_field_url input,
-.openerp .oe_form .oe_form_field_email input,
-.openerp .oe_form .oe_form_field_text textarea,
-.openerp .oe_form .oe_form_field_selection select {
- width: 100%;
-}
-.openerp .oe_form .oe_form_field_text.oe_inline, .openerp .oe_form .oe_form_field_text.oe_inline > textarea {
- width: 500px;
-}
-.openerp .oe_form h1, .openerp .oe_form h2, .openerp .oe_form h3, .openerp .oe_form h4, .openerp .oe_form h5, .openerp .oe_form h6 {
- margin: 0 0 4px 0;
-}
-.openerp .oe_form h1 input, .openerp .oe_form h2 input, .openerp .oe_form h3 input, .openerp .oe_form h4 input, .openerp .oe_form h5 input, .openerp .oe_form h6 input {
- height: inherit !important;
- font-size: inherit;
-}
-.openerp .oe_form .oe_form_field {
- width: 100%;
- display: inline-block;
- padding: 2px 2px 2px 0px;
-}
-.openerp .oe_form .oe_form_field input {
- margin: 0px;
-}
-.openerp .oe_form input[type="text"], .openerp .oe_form input[type="password"], .openerp .oe_form input[type="file"], .openerp .oe_form select {
- height: 22px;
- padding-top: 2px;
-}
-.openerp .oe_form input[type="text"], .openerp .oe_form input[type="password"], .openerp .oe_form input[type="file"], .openerp .oe_form select, .openerp .oe_form textarea {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- box-sizing: border-box;
- background: white;
- min-width: 60px;
- color: #1f1f1f;
-}
-.openerp .oe_form input[readonly], .openerp .oe_form select[readonly], .openerp .oe_form textarea[readonly], .openerp .oe_form input[disabled], .openerp .oe_form select[disabled] {
- background: #e5e5e5 !important;
- color: #666666;
-}
-.openerp .oe_form textarea[disabled] {
- border: none;
- padding-left: 8px;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-radius: 0px;
-}
-.openerp .oe_form textarea.oe_inline[disabled] {
- border-left: 8px solid #eeeeee;
-}
-.openerp .oe_form .oe_form_field_url button img {
- vertical-align: top;
-}
-.openerp .oe_form .oe_form_field_date,
-.openerp .oe_form .oe_form_field_datetime {
- white-space: nowrap;
-}
-.openerp .oe_form .oe_form_field_boolean {
- padding-top: 4px;
- width: auto;
-}
-.openerp .oe_form .oe_datepicker_container {
- display: none;
-}
-.openerp .oe_form .oe_datepicker_root {
- display: inline-block;
-}
-.openerp .oe_form .oe_form_required input:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required select:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required textarea:not([disabled]):not([readonly]) {
- background-color: #d2d2ff !important;
-}
-.openerp .oe_form .oe_form_invalid input, .openerp .oe_form .oe_form_invalid select, .openerp .oe_form .oe_form_invalid textarea {
- background-color: #ff6666 !important;
- border: 1px solid #dd0000 !important;
-}
-.openerp .oe_form .oe_input_icon {
- cursor: pointer;
- margin: 3px 0 0 -21px;
- vertical-align: top;
-}
-.openerp .oe_form .oe_input_icon_disabled {
- position: absolute;
- cursor: default;
- opacity: 0.5;
- filter: alpha(opacity=50);
- right: 5px;
- top: 3px;
-}
-.openerp .oe_form .oe_form_field_with_button.oe_no_button > .oe_button {
- display: none;
-}
-.openerp .oe_form .oe_form_field_with_button:not(.oe_no_button) > .oe_button {
- float: right;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
- border-bottom-left-radius: 0px;
- height: 22px;
-}
-.openerp .oe_form .oe_form_field_with_button input {
- width: 100%;
-}
-.openerp .oe_form .oe_form_field_with_button > div {
- position: relative;
- overflow: hidden;
-}
-.openerp .oe_form .oe_form_embedded_html {
- position: relative;
- width: 600px;
- margin-left: 130px;
- margin-top: 32px;
- margin-bottom: 32px;
- text-align: justify;
-}
-.openerp .oe_form_editable .oe_form .oe_form_field_integer input {
- width: 6em !important;
-}
-.openerp .oe_form_editable .oe_form .oe_form_field_float input {
- width: 7em !important;
-}
-.openerp .oe_form_editable .oe_form .oe_form_field_date input {
- width: 7.5em !important;
-}
-.openerp .oe_form_editable .oe_form .oe_form_field_datetime input {
- width: 11.5em !important;
-}
-.openerp .oe_hidden_input_file {
- position: relative;
-}
-.openerp .oe_hidden_input_file input.oe_form_binary_file {
- z-index: 0;
- line-height: 0;
- font-size: 12px;
- position: absolute;
- top: 1px;
- left: 0;
- right: 0;
- opacity: 0;
- filter: alpha(opacity=0);
- -ms-filter: "alpha(opacity=0)";
- margin: 0;
- padding: 0;
-}
-.openerp .oe_form .oe_form_field_image {
- padding: 0;
- position: relative;
- display: inline-block;
- width: auto;
- vertical-align: top;
-}
-.openerp .oe_form .oe_form_field_image .oe_form_field_image_controls {
- position: absolute;
- top: 1px;
- padding: 4px;
- width: 100%;
- display: none;
- text-align: center;
- color: #eeeeee;
- background: rgba(37, 37, 37, 0.9);
- -moz-border-radius: 3px 3px 0 0;
- -webkit-border-radius: 3px 3px 0 0;
- border-radius: 3px 3px 0 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- box-sizing: border-box;
-}
-.openerp .oe_form .oe_form_field_image:hover .oe_form_field_image_controls {
- display: block;
-}
-.openerp .oe_form_field_many2one td:first-child {
- position: relative;
-}
-.openerp .oe_form_field_many2one span.oe_m2o_drop_down_button {
- position: absolute;
- top: 2px;
- right: 0px;
-}
-.openerp .oe_form_field_many2one .oe_m2o_cm_button {
- line-height: 14px;
- float: right;
- padding-left: 2px;
-}
-.openerp.ui-autocomplete li.oe_m2o_dropdown_option a {
- font-style: italic;
- padding-left: 2em;
-}
-.openerp.ui-autocomplete li:not(.oe_m2o_dropdown_option) + li.oe_m2o_dropdown_option {
- margin-top: 10px;
-}
-.openerp ul.oe_form_status, .openerp ul.oe_form_status_clickable {
- display: inline-block;
- margin: 0;
- padding: 0 18px 0 0;
-}
-.openerp ul.oe_form_status li, .openerp ul.oe_form_status_clickable li {
- display: inline-block;
- list-style-type: none;
- margin: 0 -18px 0 0;
- padding: 0;
- background-color: #fcfcfc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
- background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
- background-image: linear-gradient(to bottom, #fcfcfc, #dedede);
-}
-.openerp ul.oe_form_status li:first-child .label, .openerp ul.oe_form_status_clickable li:first-child .label {
- border-left: 1px solid #cacaca;
- padding-left: 14px;
-}
-.openerp ul.oe_form_status li:last-child, .openerp ul.oe_form_status_clickable li:last-child {
- border-right: 1px solid #cacaca;
-}
-.openerp ul.oe_form_status li:last-child .label, .openerp ul.oe_form_status_clickable li:last-child .label {
- padding-right: 14px;
-}
-.openerp ul.oe_form_status li:last-child .arrow, .openerp ul.oe_form_status_clickable li:last-child .arrow {
- display: none;
-}
-.openerp ul.oe_form_status li .label, .openerp ul.oe_form_status_clickable li .label {
- color: #4c4c4c;
- text-shadow: 0 1px 1px #fcfcfc, 0 -1px 1px #dedede;
- padding: 7px;
- display: inline-block;
- padding-left: 24px;
- margin: 0;
- position: relative;
-}
-.openerp ul.oe_form_status li .arrow, .openerp ul.oe_form_status_clickable li .arrow {
- width: 17px;
- display: inline-block;
- vertical-align: top;
- overflow: hidden;
- margin-left: -5px;
-}
-.openerp ul.oe_form_status li .arrow span, .openerp ul.oe_form_status_clickable li .arrow span {
- position: relative;
- width: 24px;
- height: 24px;
- display: inline-block;
- margin-left: -12px;
- margin-top: 3px;
- box-shadow: -1px 1px 2px rgba(255, 255, 255, 0.2), inset -1px 1px 1px rgba(0, 0, 0, 0.2);
- background-color: #dedede;
- background: -moz-linear-gradient(135deg, #dedede, #fcfcfc);
- background: -o-linear-gradient(135deg, #fcfcfc, #dedede);
- background: -webkit-gradient(linear, left top, right bottom, from(#fcfcfc), to(#dedede));
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- -webkit-transform: rotate(45deg);
- -moz-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- -o-transform: rotate(45deg);
- transform: rotate(45deg);
-}
-.openerp ul.oe_form_status li.oe_active, .openerp ul.oe_form_status_clickable li.oe_active {
- background-color: #729fcf;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#729fcf), to(#3465a4));
- background-image: -webkit-linear-gradient(top, #729fcf, #3465a4);
- background-image: -moz-linear-gradient(top, #729fcf, #3465a4);
- background-image: -ms-linear-gradient(top, #729fcf, #3465a4);
- background-image: -o-linear-gradient(top, #729fcf, #3465a4);
- background-image: linear-gradient(to bottom, #729fcf, #3465a4);
-}
-.openerp ul.oe_form_status li.oe_active .arrow span, .openerp ul.oe_form_status_clickable li.oe_active .arrow span {
- background-color: #3465a4;
- background: -moz-linear-gradient(135deg, #3465a4, #729fcf);
- background: -o-linear-gradient(135deg, #729fcf, #3465a4);
- background: -webkit-gradient(linear, left top, right bottom, from(#729fcf), to(#3465a4));
-}
-.openerp ul.oe_form_status li.oe_active .label, .openerp ul.oe_form_status_clickable li.oe_active .label {
- color: white;
- text-shadow: 0 1px 1px #729fcf, 0 -1px 1px #3465a4;
-}
-.openerp ul.oe_form_status_clickable li {
- cursor: pointer;
-}
-.openerp ul.oe_form_status_clickable li:hover {
- background-color: #e8e8e8;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#cacaca));
- background-image: -webkit-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: -moz-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: -ms-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: -o-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: linear-gradient(to bottom, #e8e8e8, #cacaca);
-}
-.openerp ul.oe_form_status_clickable li:hover .label {
- text-shadow: 0 -1px 1px #fcfcfc, 0 1px 1px #dedede;
-}
-.openerp ul.oe_form_status_clickable li:hover .arrow span {
- background-color: #e8e8e8;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#cacaca));
- background-image: -webkit-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: -moz-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: -ms-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: -o-linear-gradient(top, #e8e8e8, #cacaca);
- background-image: linear-gradient(to bottom, #e8e8e8, #cacaca);
-}
-.openerp ul.oe_form_status_clickable li .label {
- color: #7c7bad;
-}
-.openerp ul.oe_form_status_clickable li.oe_active:hover {
- background-color: #4c85c2;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#4c85c2), to(#284d7d));
- background-image: -webkit-linear-gradient(top, #4c85c2, #284d7d);
- background-image: -moz-linear-gradient(top, #4c85c2, #284d7d);
- background-image: -ms-linear-gradient(top, #4c85c2, #284d7d);
- background-image: -o-linear-gradient(top, #4c85c2, #284d7d);
- background-image: linear-gradient(to bottom, #4c85c2, #284d7d);
-}
-.openerp ul.oe_form_status_clickable li.oe_active:hover .label {
- text-shadow: 0 -1px 1px #729fcf, 0 1px 1px #3465a4;
-}
-.openerp ul.oe_form_status_clickable li.oe_active:hover .arrow span {
- background-color: #284d7d;
- background: -moz-linear-gradient(135deg, #284d7d, #4c85c2);
- background: -o-linear-gradient(135deg, #4c85c2, #284d7d);
- background: -webkit-gradient(linear, left top, right bottom, from(#4c85c2), to(#284d7d));
-}
-.openerp .oe_form .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page {
- display: none;
-}
-.openerp .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page, .openerp .oe_form_field_many2many > .oe_view_manager .oe_list_pager_single_page {
- display: none !important;
-}
-.openerp .oe_form_field_one2many .oe_form_field_one2many_list_row_add, .openerp .oe_form_field_many2many .oe_form_field_one2many_list_row_add {
- font-weight: bold;
-}
-.openerp .oe_form_field_one2many .oe_list_content > thead, .openerp .oe_form_field_many2many .oe_list_content > thead {
- border-bottom: 1px;
-}
-.openerp .oe_form_field_one2many .oe_list_content > tbody tr:nth-child(odd), .openerp .oe_form_field_many2many .oe_list_content > tbody tr:nth-child(odd) {
- background: transparent;
-}
-.openerp .oe_form_field_one2many .oe_list .oe_list_edit_row_save, .openerp .oe_form_field_many2many .oe_list .oe_list_edit_row_save {
- background: url(/web/static/src/img/iconset-b-remove.png) 50% 50% no-repeat;
-}
-.openerp .oe_form_field_one2many .oe_list .oe_list_edit_row_save:before, .openerp .oe_form_field_many2many .oe_list .oe_list_edit_row_save:before {
- visibility: hidden;
-}
-.openerp .oe_form_field_one2many > .oe_view_manager .oe_header_row_top, .openerp .oe_form_field_many2many > .oe_view_manager .oe_header_row_top {
- display: none;
-}
-.openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td {
- padding: 0px 8px;
- line-height: 16px;
-}
-.openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td .oe_i, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td .oe_i {
- font-size: 13px;
-}
-.openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group {
- height: auto;
- line-height: 16px;
-}
-.openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group li, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group li {
- height: auto;
- line-height: 16px;
-}
-.openerp .oe_form_field_one2many .oe_list_buttons.oe_editing .oe_list_save, .openerp .oe_form_field_many2many .oe_list_buttons.oe_editing .oe_list_save {
- visibility: hidden;
-}
-.openerp .oe_form_editable .oe_list_editable .oe_list_content td.oe_required {
- background-color: #d2d2ff;
-}
-.openerp .oe_form_editable .oe_list_editable .oe_list_content td.oe_readonly {
- background-color: #eeeeee;
-}
-.openerp .oe_list_editable .oe_list_content td.oe_list_field_cell {
- padding: 4px 6px 3px 6px;
-}
-.openerp .oe_list.oe_list_editable td.oe_list_record_delete {
- position: absolute;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) {
- color: transparent;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) * {
- visibility: hidden;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_m2o_drop_down_button {
- top: 5px;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_m2o_cm_button {
- display: none;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field textarea {
- height: 27px;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field textarea {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
- border: 1px solid #aaaaff;
- margin: 0;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_float input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_view_integer input {
- text-align: right;
- width: 100% !important;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime > span, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date > span {
- width: 100% !important;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime input.oe_datepicker_master, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date input.oe_datepicker_master {
- width: 100% !important;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field .oe_form_field_float, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field .oe_form_view_integer, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date {
- min-width: 0 !important;
- max-width: none !important;
-}
-.openerp .oe_list_group_name {
- white-space: nowrap;
-}
-.openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page {
- display: none;
-}
-.openerp .oe_list_buttons .oe_alternative {
- visibility: hidden;
-}
-.openerp .oe_list_buttons .oe_list_save, .openerp .oe_list_buttons .oe_list_discard {
- display: none;
-}
-.openerp .oe_list_buttons.oe_editing .oe_list_add {
- display: none;
-}
-.openerp .oe_list_buttons.oe_editing .oe_list_save {
- display: inline-block;
-}
-.openerp .oe_list_buttons.oe_editing .oe_list_discard {
- display: inline;
-}
-.openerp .oe_list_buttons.oe_editing .oe_alternative {
- visibility: visible;
-}
-.openerp .oe_list .oe_form .oe_form_nosheet {
- margin: 0;
- padding: 0;
- border: none;
-}
-.openerp .oe_list .oe_form .oe_form_field {
- width: auto;
- position: absolute;
- margin: 0 !important;
- padding: 0;
-}
-.openerp .oe_list .oe_list_content .oe_group_header {
- background-color: #fcfcfc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
- background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
- background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
- background-image: linear-gradient(to bottom, #fcfcfc, #dedede);
-}
-.openerp .oe_list_content {
- width: 100%;
-}
-.openerp .oe_list_content td:first-child:after, .openerp .oe_list_content th:first-child:after {
- border-width: 0;
-}
-.openerp .oe_list_content td.oe_number {
- text-align: right !important;
- max-width: 100px;
-}
-.openerp .oe_list_content > thead {
- border-bottom: 2px solid #cacaca;
- background: #eeeeee;
- vertical-align: top;
-}
-.openerp .oe_list_content td, .openerp .oe_list_content th {
- padding: 3px 6px;
- line-height: 18px;
-}
-.openerp .oe_list_content th.oe_sortable, .openerp .oe_list_content th.oe_sortable div {
- cursor: pointer;
-}
-.openerp .oe_list_content th.oe_sortable div {
- position: relative;
-}
-.openerp .oe_list_content th.oe_sortable div:after {
- position: absolute;
- right: 6px;
- content: "";
- margin-top: 7px;
- border-width: 0 4px 4px;
- border-style: solid;
- border-color: black transparent;
- visibility: hidden;
-}
-.openerp .oe_list_content th.sortup div:after {
- visibility: visible;
- filter: alpha(opacity=60);
- opacity: 0.6;
-}
-.openerp .oe_list_content th.sortdown div:after {
- border-bottom: none;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- border-top: 4px solid black;
- visibility: visible;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
- filter: alpha(opacity=60);
- opacity: 0.6;
-}
-.openerp .oe_list_content > tbody {
- cursor: pointer;
-}
-.openerp .oe_list_content > tbody > tr {
- height: 27px;
- border-top: 1px solid #dddddd;
-}
-.openerp .oe_list_content > tbody > tr > td.oe_list_field_cell {
- padding: 3px 6px;
- white-space: pre-line;
-}
-.openerp .oe_list_content > tbody > tr > td > button, .openerp .oe_list_content > tbody > tr > th > button {
- border: none;
- background: transparent;
- padding: 0;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.openerp .oe_list_content > tbody > tr > td.oe_list_checkbox:first-child, .openerp .oe_list_content > tbody > tr th.oe_list_checkbox:first-child {
- width: 17px;
-}
-.openerp .oe_list_content > tbody > tr > td.oe_list_checkbox:first-child:after, .openerp .oe_list_content > tbody > tr th.oe_list_checkbox:first-child:after {
- border-width: 0;
-}
-.openerp .oe_list_content > tbody > tr:nth-child(odd) {
- background-color: #f0f0fa;
- background-color: #f0f0fa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
- background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
- background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
-}
-.openerp .oe_list_content > tfoot {
- border-top: 2px solid #cacaca;
- border-bottom: 1px solid #cacaca;
- background: #eeeeee;
- font-weight: bold;
-}
-.openerp .oe_list_content .numeric {
- text-align: right;
- width: 82px;
-}
-.openerp .oe_list_content .numeric input {
- text-align: right;
-}
-.openerp .oe_list_content th.oe_list_header_handle {
- font-size: 1px;
- overflow: hidden;
- text-indent: -9001px;
-}
-.openerp .oe_list_content td.oe_list_field_handle {
- width: 1em;
- padding: 0 !important;
- cursor: ns-resize;
-}
-.openerp .oe_list_content td.oe_list_field_handle .oe_list_handle {
- font-size: 1px;
- letter-spacing: -1px;
- color: transparent;
- font-weight: normal;
- margin-right: 7px;
-}
-.openerp .oe_list_content td.oe_list_field_handle .oe_list_handle:before {
- font: 18px "entypoRegular";
- content: "}";
- color: #e0e0e0;
-}
-.openerp .oe_list_cannot_edit .oe_list_header_handle, .openerp .oe_list_cannot_edit .oe_list_field_handle {
- display: none !important;
- padding: 0 !important;
-}
-.openerp .oe_list_cannot_delete .oe_list_record_delete {
- display: none !important;
-}
-.openerp .tree_header {
- background-color: #f0f0f0;
- border-bottom: 1px solid #cacaca;
- color: #4c4c4c;
- padding: 5px;
- height: 25px;
-}
-.openerp .tree_header button {
- float: right;
- height: 27px;
- margin-right: 5px;
-}
-.openerp .oe-treeview-table {
- width: 100%;
- background-color: white;
- border-spacing: 0;
- color: #4c4c4c;
-}
-.openerp .oe-treeview-table th {
- padding: 10px;
- font-weight: bold;
- background-color: #f0f0f0;
- border-bottom: 2px solid #cacaca;
-}
-.openerp .oe-treeview-table td {
- cursor: pointer;
- vertical-align: middle;
- text-align: left;
- vertical-align: middle;
- height: 20px;
- padding-left: 4px;
- padding-right: 4px;
- border-right: 1px solid #e7e7e7;
-}
-.openerp .oe-treeview-table td.oe_number {
- text-align: right !important;
-}
-.openerp .oe-treeview-table tr {
- border-bottom: 1px solid #d6d6d6;
-}
-.openerp .oe-treeview-table tr:hover {
- background-color: #e7e7e7;
-}
-.openerp .oe-treeview-table span {
- font-size: 90%;
- font-weight: normal;
- white-space: nowrap;
- display: block;
-}
-.openerp .oe-treeview-table .treeview-tr.oe-treeview-first {
- background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat;
-}
-.openerp .oe-treeview-table .oe_open .treeview-tr.oe-treeview-first {
- background-image: url(/web/static/src/img/collapse.gif);
-}
-.openerp .oe-treeview-table .treeview-tr.oe-treeview-first span, .openerp .oe-treeview-table .treeview-td.oe-treeview-first span {
- margin-left: 16px;
-}
-.openerp .oe_layout_debugging .oe_form_group {
- outline: 2px dashed green;
-}
-.openerp .oe_layout_debugging .oe_form_group_cell {
- outline: 1px solid blue;
-}
-.openerp .oe_layout_debugging .oe_form_group:hover, .openerp .oe_layout_debugging .oe_form_group_cell:hover {
- outline-color: red;
-}
-.openerp .oe_layout_debugging .oe_form_group_row_incomplete > td:last-child:after {
- content: "[Incomplete Row]";
- background: red;
- padding: 2px;
- font-weight: bold;
- color: white;
- float: right;
-}
-.openerp .oe_layout_debugging .oe_form_group_row_incomplete.oe_form_group_row_newline > td:last-child:after {
- content: "[newline]";
-}
-.openerp .oe_debug_view {
- float: left;
-}
-.openerp .oe_debug_view_log {
- font-size: 95%;
-}
-.openerp .oe_debug_view_log label {
- display: block;
- width: 49%;
- text-align: right;
- float: left;
- font-weight: bold;
- color: #000099;
-}
-.openerp .oe_debug_view_log span {
- display: block;
- width: 49%;
- float: right;
- color: #333333;
-}
+ */ }
+ .openerp :-moz-placeholder {
+ color: #afafb6 !important;
+ font-style: italic !important; }
+ .openerp ::-webkit-input-placeholder {
+ color: #afafb6 !important;
+ font-style: italic !important; }
+ .openerp a {
+ text-decoration: none;
+ cursor: pointer !important; }
+ .openerp table {
+ padding: 0;
+ border-collapse: collapse; }
+ .openerp thead {
+ font-weight: bold;
+ background-color: #f0f0f0; }
+ .openerp thead th {
+ border-left: 1px solid #dfdfdf; }
+ .openerp thead th:first-child {
+ border-left: none; }
+ .openerp thead th.null {
+ border-left: none; }
+ .openerp th, .openerp td {
+ padding: 0;
+ text-align: left; }
+ .openerp th {
+ font-weight: bold;
+ vertical-align: middle; }
+ .openerp td {
+ vertical-align: top; }
+ .openerp .zebra tbody tr:nth-child(odd) td {
+ background-color: #f0f0fa;
+ background-color: #f0f0fa;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
+ background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6); }
+ .openerp .zebra tbody tr:hover td {
+ background-color: #eeeeee;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#dedede));
+ background-image: -webkit-linear-gradient(top, #eeeeee, #dedede);
+ background-image: -moz-linear-gradient(top, #eeeeee, #dedede);
+ background-image: -ms-linear-gradient(top, #eeeeee, #dedede);
+ background-image: -o-linear-gradient(top, #eeeeee, #dedede);
+ background-image: linear-gradient(to bottom, #eeeeee, #dedede); }
+ .openerp input, .openerp textarea, .openerp select {
+ padding: 2px 4px;
+ border: 1px solid #cccccc;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background: white; }
+ .openerp img {
+ vertical-align: middle; }
+ .openerp h4 {
+ margin: 4px 0; }
+ .openerp a.button:link, .openerp a.button:visited, .openerp button, .openerp input[type='submit'], .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
+ display: inline-block;
+ border: 1px solid rgba(0, 0, 0, 0.4);
+ color: #4c4c4c;
+ margin: 0;
+ padding: 3px 12px;
+ font-size: 13px;
+ text-align: center;
+ background-color: #efefef;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
+ background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: -ms-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: -o-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: linear-gradient(to bottom, #efefef, #d8d8d8);
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+ -webkit-font-smoothing: antialiased;
+ outline: none; }
+ .openerp a.button:hover, .openerp button:hover, .openerp input[type='submit']:hover, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-hover {
+ background-color: #f6f6f6;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
+ background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
+ cursor: pointer;
+ background-position: 0; }
+ .openerp a.button:focus, .openerp button:focus, .openerp input[type='submit']:focus, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-focus {
+ border: 1px solid #80bfff;
+ background-position: 0;
+ background-color: #f6f6f6;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
+ background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
+ -moz-box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ -webkit-box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset; }
+ .openerp a.button:active, .openerp a.button.active, .openerp button:active, .openerp button.active, .openerp input[type='submit']:active, .openerp input[type='submit'].active, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-active {
+ background-color: #e3e3e3;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
+ background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: -ms-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: -o-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: linear-gradient(to bottom, #e3e3e3, #f6f6f6);
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp a.button.disabled, .openerp button:disabled, .openerp input[type='submit']:disabled {
+ background: #efefef !important;
+ border: 1px solid #d1d1d1 !important;
+ -moz-box-shadow: none !important;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+ color: #aaaaaa !important;
+ cursor: default;
+ text-shadow: 0 1px 1px white !important; }
+ .openerp .ui-widget-content a {
+ color: #7c7bad; }
+ .openerp .oe_bounce_container {
+ display: inline-block; }
+ .openerp .ui-tabs {
+ position: static; }
+ .openerp.ui-dialog {
+ display: none;
+ padding: 6px;
+ background-color: rgba(60, 60, 60, 0.7);
+ border: 1px solid;
+ border-color: #888888 #555555 #444444;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ border-radius: 8px;
+ -moz-box-shadow: 0 1px 12px rgba(0, 0, 0, 0.6);
+ -webkit-box-shadow: 0 1px 12px rgba(0, 0, 0, 0.6);
+ box-shadow: 0 1px 12px rgba(0, 0, 0, 0.6);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box; }
+ .openerp.ui-dialog .ui-dialog-content {
+ padding: 0px; }
+ .openerp.ui-dialog .ui-dialog-titlebar, .openerp.ui-dialog .ui-dialog-content, .openerp.ui-dialog .ui-dialog-buttonpane {
+ padding: 16px; }
+ .openerp.ui-dialog .ui-dialog-titlebar {
+ border-bottom: 1px solid #cacaca;
+ -moz-border-radius: 2px 2px 0 0;
+ -webkit-border-radius: 2px 2px 0 0;
+ border-radius: 2px 2px 0 0;
+ background-color: #fcfcfc;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
+ background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: linear-gradient(to bottom, #fcfcfc, #dedede); }
+ .openerp.ui-dialog .ui-dialog-titlebar .ui-dialog-title {
+ margin: 0;
+ padding: 0; }
+ .openerp.ui-dialog .ui-widget-header {
+ border: none; }
+ .openerp.ui-dialog .ui-dialog-content {
+ background: white; }
+ .openerp.ui-dialog .ui-dialog-buttonpane {
+ border-top: 1px solid #e0e0e0;
+ background: #f5f7f9;
+ margin: 0;
+ -moz-border-radius: 0 0 2px 2px;
+ -webkit-border-radius: 0 0 2px 2px;
+ border-radius: 0 0 2px 2px; }
+ .openerp.ui-dialog .ui-dialog-buttonpane button {
+ margin: 0 4px 0 0; }
+ .openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: left; }
+ .openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
+ margin-right: 4px; }
+ .openerp.ui-dialog .ui-dialog-titlebar-close {
+ padding: 0; }
+ .openerp.ui-dialog .ui-dialog-titlebar-close .ui-icon-closethick {
+ display: none; }
+ .openerp.ui-dialog .ui-dialog-titlebar-close:before {
+ content: "×";
+ font-size: 18px;
+ font-weight: bold;
+ line-height: 16px;
+ color: black;
+ text-shadow: 0 1px 0 white;
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0; }
+ .openerp.ui-dialog .ui-dialog-titlebar-close:before:hover {
+ color: black;
+ text-decoration: none; }
+ .openerp.ui-dialog .oe_about {
+ background-color: white;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
+ -moz-border-radius: 0 0 2px 2px;
+ -webkit-border-radius: 0 0 2px 2px;
+ border-radius: 0 0 2px 2px; }
+ .openerp.ui-dialog .oe_about a {
+ color: #7c7bad; }
+ .openerp.ui-dialog .oe_about a:hover {
+ text-decoration: underline; }
+ .openerp.ui-dialog .oe_about a:focus {
+ outline: none; }
+ .openerp.ui-dialog .oe_about .oe_logo {
+ margin-left: -6px; }
+ .openerp.ui-dialog .oe_about .oe_bottom {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-shadow: 0 1px 1px #999999;
+ background-color: #b41616;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
+ background-image: -webkit-linear-gradient(top, #b41616, #600606);
+ background-image: -moz-linear-gradient(top, #b41616, #600606);
+ background-image: -ms-linear-gradient(top, #b41616, #600606);
+ background-image: -o-linear-gradient(top, #b41616, #600606);
+ background-image: linear-gradient(to bottom, #b41616, #600606);
+ color: #eeeeee;
+ padding: 0 16px;
+ -moz-border-radius: 0 0 2px 2px;
+ -webkit-border-radius: 0 0 2px 2px;
+ border-radius: 0 0 2px 2px; }
+ .openerp.ui-dialog .oe_about .oe_bottom a {
+ color: #eeeeee; }
+ .openerp.ui-dialog.oe_act_window .ui-dialog-content {
+ padding: 0px; }
+ .openerp .modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: black;
+ filter: alpha(opacity=30);
+ opacity: 0.3; }
+ .openerp .oe_i {
+ font-family: "mnmliconsRegular" !important;
+ font-size: 21px;
+ font-weight: 300 !important; }
+ .openerp .oe_e {
+ font-family: "entypoRegular" !important;
+ font-size: 34px;
+ font-weight: 300 !important; }
+ .openerp .oe_left {
+ float: left;
+ margin-right: 8px; }
+ .openerp .oe_right {
+ float: right;
+ margin-left: 8px; }
+ .openerp .oe_text_right {
+ text-align: right; }
+ .openerp .oe_clear {
+ clear: both; }
+ .openerp .oe_wait {
+ cursor: wait; }
+ .openerp .oe_fade {
+ color: #888888;
+ font-weight: normal; }
+ .openerp .oe_bold {
+ font-weight: bold; }
+ .openerp .oe_inline {
+ width: auto !important; }
+ .openerp .oe_highlight {
+ color: white;
+ background: #dc5f59; }
+ .openerp button.oe_highlight {
+ background-color: #df3f3f;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));
+ background-image: -webkit-linear-gradient(top, #df3f3f, #a21a1a);
+ background-image: -moz-linear-gradient(top, #df3f3f, #a21a1a);
+ background-image: -ms-linear-gradient(top, #df3f3f, #a21a1a);
+ background-image: -o-linear-gradient(top, #df3f3f, #a21a1a);
+ background-image: linear-gradient(to bottom, #df3f3f, #a21a1a);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset; }
+ .openerp button.oe_highlight:hover {
+ background-color: #e25858;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e25858), to(#ab1b1b));
+ background-image: -webkit-linear-gradient(top, #e25858, #ab1b1b);
+ background-image: -moz-linear-gradient(top, #e25858, #ab1b1b);
+ background-image: -ms-linear-gradient(top, #e25858, #ab1b1b);
+ background-image: -o-linear-gradient(top, #e25858, #ab1b1b);
+ background-image: linear-gradient(to bottom, #e25858, #ab1b1b); }
+ .openerp button.oe_highlight:active {
+ background-color: #c52020;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#c52020), to(#d22323));
+ background-image: -webkit-linear-gradient(top, #c52020, #d22323);
+ background-image: -moz-linear-gradient(top, #c52020, #d22323);
+ background-image: -ms-linear-gradient(top, #c52020, #d22323);
+ background-image: -o-linear-gradient(top, #c52020, #d22323);
+ background-image: linear-gradient(to bottom, #c52020, #d22323); }
+ .openerp .oe_background_grey {
+ background: #eeeeee !important; }
+ .openerp .oe_form_dirty .oe_highlight_on_dirty {
+ color: white;
+ background: #dc5f59;
+ font-weight: bold; }
+ .openerp .oe_form_dirty button.oe_highlight_on_dirty {
+ background-color: #dc5f59;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dc5f59), to(#b33630));
+ background-image: -webkit-linear-gradient(top, #dc5f59, #b33630);
+ background-image: -moz-linear-gradient(top, #dc5f59, #b33630);
+ background-image: -ms-linear-gradient(top, #dc5f59, #b33630);
+ background-image: -o-linear-gradient(top, #dc5f59, #b33630);
+ background-image: linear-gradient(to bottom, #dc5f59, #b33630);
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_form_dirty button.oe_highlight_on_dirty:hover {
+ background: #ed6f6a; }
+ .openerp .oe_title {
+ width: 50%;
+ float: left; }
+ .openerp .oe_title:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden; }
+ .openerp .oe_button_box {
+ width: 270px;
+ text-align: right; }
+ .openerp .oe_button_box button {
+ margin: 4px; }
+ .openerp .oe_avatar > img {
+ max-height: 90px;
+ max-width: 90px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ border: none;
+ margin-bottom: 10px; }
+ .openerp .oe_avatar + div {
+ margin-left: 5px; }
+ .openerp .oe_image_small > img {
+ max-width: 50px;
+ max-height: 50px; }
+ .openerp .oe_image_medium > img {
+ max-width: 180px;
+ max-height: 180px; }
+ .openerp .oe_button.oe_link {
+ border: none;
+ padding: 0;
+ margin: 0;
+ background: none;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_button.oe_link img {
+ display: none; }
+ .openerp .oe_button.oe_link span {
+ border: none;
+ padding: 0;
+ margin: 0;
+ background: none;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ color: #7c7bad;
+ font-weight: bold; }
+ .openerp .oe_button.oe_link span:hover {
+ text-decoration: underline; }
+ .openerp .oe_webclient .oe_star_on, .openerp .oe_webclient .oe_star_off {
+ color: #cccccc;
+ text-shadow: 0 0 2px black;
+ vertical-align: top;
+ position: relative;
+ top: -5px; }
+ .openerp .oe_webclient .oe_star_on:hover, .openerp .oe_webclient .oe_star_off:hover {
+ text-decoration: none; }
+ .openerp .oe_webclient .oe_star_on {
+ color: gold; }
+ .openerp p.oe_grey {
+ max-width: 650px; }
+ .openerp .oe_grey {
+ color: #aaaaaa; }
+ .openerp .oe_tag {
+ border: 1px solid #afafb6;
+ font-size: 11px;
+ padding: 2px 4px;
+ margin: 0 2px 2px 0;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background: #f0f0fa;
+ color: #4c4c4c; }
+ .openerp .oe_tag_dark {
+ background: #7c7bad;
+ color: #eeeeee; }
+ .openerp .oe_tags {
+ margin-bottom: 1px; }
+ .openerp .oe_tags.oe_inline {
+ min-width: 250px; }
+ .openerp .oe_tags .text-wrap {
+ width: 100% !important; }
+ .openerp .oe_tags .text-wrap textarea {
+ width: 100% !important; }
+ .openerp .oe_tags .text-core .text-wrap .text-dropdown .text-list .text-suggestion em {
+ font-style: italic;
+ text-decoration: none; }
+ .openerp.oe_tooltip {
+ font-size: 12px; }
+ .openerp.oe_tooltip .oe_tooltip_string {
+ color: #ffdd55;
+ font-weight: bold;
+ font-size: 13px; }
+ .openerp.oe_tooltip .oe_tooltip_help {
+ white-space: pre-wrap; }
+ .openerp.oe_tooltip .oe_tooltip_technical {
+ padding: 0 0 4px 0;
+ margin: 5px 0 0 15px; }
+ .openerp.oe_tooltip .oe_tooltip_technical li {
+ list-style: circle; }
+ .openerp.oe_tooltip .oe_tooltip_technical_title {
+ font-weight: bold; }
+ .openerp.oe_tooltip .oe_tooltip_close {
+ margin: -5px 0 0 2px;
+ cursor: default;
+ float: right;
+ color: white; }
+ .openerp.oe_tooltip .oe_tooltip_close:hover {
+ color: #999999;
+ cursor: pointer; }
+ .openerp.oe_tooltip .oe_tooltip_message {
+ max-width: 310px; }
+ .openerp .oe_notebook {
+ margin: 8px 0;
+ padding: 0 16px;
+ list-style: none;
+ zoom: 1; }
+ .openerp .oe_notebook.ui-corner-all {
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0; }
+ .openerp .oe_notebook:before, .openerp .oe_notebook:after {
+ display: table;
+ content: "";
+ zoom: 1; }
+ .openerp .oe_notebook:after {
+ clear: both; }
+ .openerp .oe_notebook > li {
+ float: left; }
+ .openerp .oe_notebook > li > a {
+ display: block;
+ color: #4c4c4c; }
+ .openerp .oe_notebook {
+ border-color: #dddddd;
+ border-style: solid;
+ border-width: 0 0 1px; }
+ .openerp .oe_notebook > li {
+ position: relative; }
+ .openerp .oe_notebook > li > a {
+ padding: 0 12px;
+ margin-right: 2px;
+ line-height: 30px;
+ border: 1px solid transparent;
+ -moz-border-radius: 4px 4px 0 0;
+ -webkit-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0; }
+ .openerp .oe_notebook > li > a:hover {
+ text-decoration: none;
+ background-color: #eeeeee;
+ border-color: #eeeeee #eeeeee #dddddd; }
+ .openerp .oe_notebook > li.ui-state-active > a, .openerp .oe_notebook > li.ui-state-active > a:hover {
+ background-color: white;
+ border: 1px solid #dddddd;
+ border-bottom-color: transparent;
+ cursor: default; }
+ .openerp .oe_notebook_page {
+ padding: 0; }
+ .openerp div.ui-tabs {
+ padding: 3px 0px 3px 0px; }
+ .openerp .ui-tabs-hide {
+ display: none; }
+ .openerp .oe_dropdown, .openerp .oe_dropdown_hover, .openerp .oe_dropdown_toggle {
+ position: relative;
+ cursor: pointer; }
+ .openerp .oe_dropdown_toggle {
+ color: rgba(0, 0, 0, 0.5);
+ font-weight: normal; }
+ .openerp .oe_dropdown_hover:hover .oe_dropdown_menu, .openerp .oe_dropdown_menu.oe_opened {
+ display: block; }
+ .openerp .oe_dropdown_menu {
+ display: none;
+ position: absolute;
+ top: 26px;
+ left: 0;
+ z-index: 3;
+ margin: 0;
+ padding: 0;
+ border: 1px solid #afafb6;
+ background: white;
+ padding: 4px 0;
+ min-width: 140px;
+ text-align: left;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); }
+ .openerp .oe_dropdown_menu > li {
+ list-style-type: none;
+ float: none;
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 2px 8px; }
+ .openerp .oe_dropdown_menu > li:hover {
+ background-color: #f0f0fa;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
+ background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_dropdown_menu > li > a {
+ white-space: nowrap;
+ display: block;
+ color: #4c4c4c;
+ text-decoration: none; }
+ .openerp .oe_dropdown_menu > li > a:hover {
+ text-decoration: none; }
+ .openerp .oe_dropdown_arrow:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ content: "&darr";
+ text-indent: -99999px;
+ vertical-align: top;
+ margin-top: 8px;
+ margin-left: 3px;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 4px solid #404040;
+ filter: alpha(opacity=50);
+ opacity: 0.5; }
+ .openerp .oe_sidebar {
+ white-space: nowrap; }
+ .openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment {
+ height: 20px;
+ cursor: pointer;
+ padding-left: 6px;
+ margin-top: 6px; }
+ .openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment span {
+ font-weight: bold; }
+ .openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment .oe_hidden_input_file {
+ width: 200px; }
+ .openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment:hover {
+ background-color: #f0f0fa;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
+ background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_sidebar .oe_dropdown_menu li .oe_sidebar_delete_item {
+ position: absolute;
+ top: 4px;
+ right: 4px;
+ display: none;
+ width: 12px;
+ height: 12px;
+ padding: 1px;
+ color: #8786b7;
+ line-height: 8px;
+ text-align: center;
+ font-weight: bold;
+ text-shadow: 0 1px 1px white; }
+ .openerp .oe_sidebar .oe_dropdown_menu li .oe_sidebar_delete_item:hover {
+ text-decoration: none;
+ color: white;
+ background: #8786b7;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ border-radius: 2px; }
+ .openerp .oe_sidebar .oe_dropdown_menu li:hover .oe_sidebar_delete_item {
+ display: inline-block; }
+ .openerp .oe_loading {
+ display: none;
+ z-index: 100;
+ position: fixed;
+ top: 0;
+ right: 50%;
+ padding: 4px 12px;
+ background: #a61300;
+ color: white;
+ text-align: center;
+ border: 1px solid #990000;
+ border-top: none;
+ -moz-border-radius-bottomright: 8px;
+ -moz-border-radius-bottomleft: 8px;
+ border-bottom-right-radius: 8px;
+ border-bottom-left-radius: 8px; }
+ .openerp .oe_notification {
+ z-index: 1050; }
+ .openerp .oe_login {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
+ text-align: center;
+ font-size: 14px;
+ height: 100%; }
+ .openerp .oe_login ul, .openerp .oe_login li {
+ margin: 0;
+ list-style-type: none;
+ padding: 0 0 4px 0; }
+ .openerp .oe_login button {
+ float: right;
+ display: inline-block;
+ cursor: pointer;
+ padding: 6px 16px;
+ border: 1px solid #222222;
+ color: white;
+ margin: 0;
+ background-color: #b92020;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#b92020), to(#600606));
+ background-image: -webkit-linear-gradient(top, #b92020, #600606);
+ background-image: -moz-linear-gradient(top, #b92020, #600606);
+ background-image: -ms-linear-gradient(top, #b92020, #600606);
+ background-image: -o-linear-gradient(top, #b92020, #600606);
+ background-image: linear-gradient(to bottom, #b92020, #600606);
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset; }
+ .openerp .oe_login input, .openerp .oe_login select {
+ width: 252px;
+ font-family: "Lucida Grande", Helvetica, Verdana, Arial;
+ border: 1px solid #999999;
+ background: whitesmoke;
+ -moz-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4);
+ -webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4);
+ box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4);
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px; }
+ .openerp .oe_login input {
+ margin-bottom: 9px;
+ padding: 5px 6px; }
+ .openerp .oe_login select {
+ padding: 1px; }
+ .openerp .oe_login .oe_login_dbpane {
+ position: fixed;
+ top: 0;
+ right: 8px;
+ padding: 5px 10px;
+ color: #eeeeee;
+ border: solid 1px #333333;
+ background: #1e1e1e;
+ background: rgba(30, 30, 30, 0.94);
+ -moz-border-radius: 0 0 8px 8px;
+ -webkit-border-radius: 0 0 8px 8px;
+ border-radius: 0 0 8px 8px; }
+ .openerp .oe_login .oe_login_dbpane input {
+ padding: 2px 4px;
+ margin: 4px 0; }
+ .openerp .oe_login .oe_login_bottom {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-shadow: 0 1px 1px #999999;
+ background-color: #b41616;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
+ background-image: -webkit-linear-gradient(top, #b41616, #600606);
+ background-image: -moz-linear-gradient(top, #b41616, #600606);
+ background-image: -ms-linear-gradient(top, #b41616, #600606);
+ background-image: -o-linear-gradient(top, #b41616, #600606);
+ background-image: linear-gradient(to bottom, #b41616, #600606); }
+ .openerp .oe_login .oe_login_pane {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin: -160px -166px;
+ border: solid 1px #333333;
+ background: #1e1e1e;
+ background: rgba(30, 30, 30, 0.94);
+ padding: 22px 32px;
+ color: #eeeeee;
+ text-align: left;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ border-radius: 8px;
+ -moz-box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
+ -webkit-box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
+ box-shadow: 0 0 18px rgba(0, 0, 0, 0.9); }
+ .openerp .oe_login .oe_login_pane h2 {
+ margin-top: 0;
+ font-size: 18px; }
+ .openerp .oe_login .oe_login_logo {
+ position: absolute;
+ top: -70px;
+ left: 0;
+ width: 100%;
+ margin: 0 auto;
+ text-align: center; }
+ .openerp .oe_login .oe_login_footer {
+ position: absolute;
+ bottom: -40px;
+ left: 0;
+ width: 100%;
+ text-align: center; }
+ .openerp .oe_login .oe_login_footer a {
+ color: #eeeeee;
+ margin: 0 8px; }
+ .openerp .oe_login .oe_login_footer a:hover {
+ text-decoration: underline; }
+ .openerp .oe_login .oe_login_footer span {
+ font-weight: bold;
+ font-size: 16px; }
+ .openerp .oe_login .oe_login_error_message {
+ display: none;
+ background-color: #b41616;
+ color: #eeeeee;
+ padding: 14px 18px;
+ margin-top: 15px;
+ text-align: center;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); }
+ .openerp .oe_login_invalid .oe_login_error_message {
+ display: inline-block; }
+ .openerp .oe_database_manager {
+ background: white;
+ color: black;
+ text-align: left; }
+ .openerp .oe_database_manager .oe_database_manager_menu {
+ color: black; }
+ .openerp .oe_webclient {
+ width: 100%;
+ height: 100%;
+ border-spacing: 0px; }
+ .openerp .oe_content_full_screen .oe_application {
+ top: 0;
+ left: 0; }
+ .openerp .oe_content_full_screen .oe_topbar, .openerp .oe_content_full_screen .oe_leftbar {
+ display: none; }
+ .openerp .oe_topbar {
+ width: 100%;
+ height: 32px;
+ background-color: #414141;
+ background-color: #646060;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626));
+ background-image: -webkit-linear-gradient(top, #646060, #262626);
+ background-image: -moz-linear-gradient(top, #646060, #262626);
+ background-image: -ms-linear-gradient(top, #646060, #262626);
+ background-image: -o-linear-gradient(top, #646060, #262626);
+ background-image: linear-gradient(to bottom, #646060, #262626); }
+ .openerp .oe_topbar .oe_topbar_item {
+ display: block;
+ padding: 5px 10px 7px;
+ line-height: 20px;
+ height: 20px;
+ text-decoration: none;
+ color: #eeeeee;
+ vertical-align: top;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ -webkit-transition: all 0.2s ease-out;
+ -moz-transition: all 0.2s ease-out;
+ -ms-transition: all 0.2s ease-out;
+ -o-transition: all 0.2s ease-out;
+ transition: all 0.2s ease-out; }
+ .openerp .oe_topbar .oe_topbar_item:hover {
+ background: rgba(0, 0, 0, 0.2);
+ text-shadow: black 0px 0px 3px;
+ color: white;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; }
+ .openerp .oe_topbar .oe_topbar_avatar {
+ width: 24px;
+ height: 24px;
+ margin: -2px 2px 0 0;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px; }
+ .openerp .oe_topbar .oe_topbar_avatar {
+ vertical-align: top; }
+ .openerp .oe_topbar .oe_dropdown_arrow:after {
+ border-top: 4px solid white; }
+ .openerp .oe_topbar .oe_dropdown_menu {
+ top: 32px;
+ background: #333333;
+ background: rgba(37, 37, 37, 0.9);
+ border-color: #999999;
+ border-color: rgba(0, 0, 0, 0.2);
+ border-style: solid;
+ border-width: 0 1px 1px;
+ -moz-border-radius: 0 0 6px 6px;
+ -webkit-border-radius: 0 0 6px 6px;
+ border-radius: 0 0 6px 6px;
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box; }
+ .openerp .oe_topbar .oe_dropdown_menu li {
+ float: none;
+ padding: 3px 12px; }
+ .openerp .oe_topbar .oe_dropdown_menu li a {
+ color: #eeeeee; }
+ .openerp .oe_topbar .oe_dropdown_menu li:hover {
+ background-color: #292929;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919));
+ background-image: -webkit-linear-gradient(top, #292929, #191919);
+ background-image: -moz-linear-gradient(top, #292929, #191919);
+ background-image: -ms-linear-gradient(top, #292929, #191919);
+ background-image: -o-linear-gradient(top, #292929, #191919);
+ background-image: linear-gradient(to bottom, #292929, #191919);
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_menu {
+ float: left;
+ padding: 0;
+ margin: 0;
+ font-size: 13px; }
+ .openerp .oe_menu > li {
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ float: left;
+ display: block;
+ color: #eeeeee; }
+ .openerp .oe_menu > li > a {
+ display: block;
+ padding: 5px 10px 7px;
+ line-height: 20px;
+ height: 20px;
+ text-decoration: none;
+ color: #eeeeee;
+ vertical-align: top;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ -webkit-transition: all 0.2s ease-out;
+ -moz-transition: all 0.2s ease-out;
+ -ms-transition: all 0.2s ease-out;
+ -o-transition: all 0.2s ease-out;
+ transition: all 0.2s ease-out; }
+ .openerp .oe_menu > li > a:hover {
+ background: rgba(0, 0, 0, 0.2);
+ text-shadow: black 0px 0px 3px;
+ color: white;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; }
+ .openerp .oe_menu > li > .oe_active {
+ background: rgba(0, 0, 0, 0.3);
+ text-shadow: black 0px 0px 3px;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; }
+ .openerp .oe_user_menu {
+ float: right;
+ padding: 0;
+ margin: 0; }
+ .openerp .oe_user_menu li {
+ list-style-type: none;
+ float: left; }
+ .openerp .oe_user_menu .oe_dropdown_menu {
+ right: -1px; }
+ .openerp .oe_systray > div {
+ float: left;
+ padding: 0 4px 0 4px; }
+ .openerp .oe_systray {
+ float: right; }
+ .openerp .oe_leftbar {
+ display: none;
+ width: 220px;
+ background: #f0eeee;
+ border-right: 1px solid #afafb6;
+ text-shadow: 0 1px 1px white;
+ padding-bottom: 16px; }
+ .openerp a.oe_logo {
+ width: 220px;
+ display: block;
+ text-align: center;
+ height: 70px;
+ line-height: 70px; }
+ .openerp a.oe_logo img {
+ height: 40px;
+ width: 157px;
+ margin: 14px 0; }
+ .openerp .oe_footer {
+ position: fixed;
+ bottom: 0;
+ padding: 4px 0;
+ background: #f0eeee;
+ width: 220px;
+ text-align: center; }
+ .openerp .oe_footer a {
+ font-weight: 800;
+ font-family: serif;
+ font-size: 16px;
+ color: black; }
+ .openerp .oe_footer a span {
+ color: #c81010;
+ font-style: italic; }
+ .openerp .oe_secondary_menu_section {
+ font-weight: bold;
+ margin-left: 8px;
+ color: #7c7bad; }
+ .openerp .oe_secondary_submenu {
+ padding: 2px 0 8px 0;
+ margin: 0;
+ width: 100%;
+ display: inline-block; }
+ .openerp .oe_secondary_submenu li {
+ position: relative;
+ margin: 0;
+ padding: 1px 0 1px 20px !important;
+ list-style-type: none; }
+ .openerp .oe_secondary_submenu li a {
+ display: block;
+ color: #4c4c4c;
+ padding: 2px 4px 2px 0; }
+ .openerp .oe_secondary_submenu li .oe_menu_label {
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ font-size: 10px;
+ background: #7c7bad;
+ color: white;
+ padding: 2px 4px;
+ margin: 1px 6px 0 0;
+ border: 1px solid lightGray;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); }
+ .openerp .oe_secondary_submenu .oe_menu_counter {
+ float: right;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ margin: 1px;
+ padding: 1px 4px;
+ border: none; }
+ .openerp .oe_secondary_submenu .oe_menu_counter:hover {
+ cursor: pointer;
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ transform: scale(1.1); }
+ .openerp .oe_secondary_submenu .oe_active {
+ border-top: 1px solid lightGray;
+ border-bottom: 1px solid #dedede;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
+ background: #7c7bad; }
+ .openerp .oe_secondary_submenu .oe_active a {
+ color: white; }
+ .openerp .oe_secondary_submenu .oe_active .oe_menu_label {
+ background: #eeeeee;
+ color: #7c7bad;
+ text-shadow: 0 1px 1px white;
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); }
+ .openerp .oe_secondary_submenu .oe_active .oe_menu_counter {
+ background: #eeeeee;
+ color: #7c7bad;
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); }
+ .openerp .oe_secondary_submenu .oe_menu_toggler:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ content: "&darr";
+ text-indent: -99999px;
+ vertical-align: top;
+ margin-left: -12px;
+ margin-top: 4px;
+ margin-right: 4px;
+ border-top: 4px solid transparent;
+ border-bottom: 4px solid transparent;
+ border-left: 4px solid #4c4c4c;
+ filter: alpha(opacity=50);
+ opacity: 0.5; }
+ .openerp .oe_secondary_submenu .oe_menu_opened:before {
+ margin-top: 6px;
+ margin-left: -16px;
+ margin-right: 4px;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 4px solid #4c4c4c; }
+ .openerp .oe_about {
+ background-color: white;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
+ -moz-border-radius: 0 0 2px 2px;
+ -webkit-border-radius: 0 0 2px 2px;
+ border-radius: 0 0 2px 2px; }
+ .openerp .oe_about a {
+ color: #7c7bad; }
+ .openerp .oe_about a:hover {
+ text-decoration: underline; }
+ .openerp .oe_about a:focus {
+ outline: none; }
+ .openerp .oe_about .oe_logo {
+ margin-left: -6px; }
+ .openerp .oe_about .oe_bottom {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-shadow: 0 1px 1px #999999;
+ background-color: #b41616;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
+ background-image: -webkit-linear-gradient(top, #b41616, #600606);
+ background-image: -moz-linear-gradient(top, #b41616, #600606);
+ background-image: -ms-linear-gradient(top, #b41616, #600606);
+ background-image: -o-linear-gradient(top, #b41616, #600606);
+ background-image: linear-gradient(to bottom, #b41616, #600606);
+ color: #eeeeee;
+ padding: 0 16px;
+ -moz-border-radius: 0 0 2px 2px;
+ -webkit-border-radius: 0 0 2px 2px;
+ border-radius: 0 0 2px 2px; }
+ .openerp .oe_about .oe_bottom a {
+ color: #eeeeee; }
+ .openerp .oe_application {
+ width: 100%; }
+ .openerp .oe_application a {
+ color: #7c7bad; }
+ .openerp .oe_application a:hover {
+ text-decoration: underline; }
+ .openerp .oe_application > div {
+ height: 100%; }
+ .openerp .oe_application .oe_breadcrumb_item:not(:last-child) {
+ display: inline-block;
+ max-width: 7em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis; }
+ .openerp .oe_view_manager .oe_view_manager_body {
+ height: inherit; }
+ .openerp .oe_view_manager .oe_view_manager_view_kanban {
+ height: inherit; }
+ .openerp .oe_view_manager table.oe_view_manager_header {
+ width: 100%;
+ table-layout: fixed; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_header_row {
+ clear: both;
+ text-shadow: 0 1px 1px white; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_header_row:last-child td {
+ padding-top: 0; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_header_row:first-child td {
+ padding-top: 8px; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_view_manager_sidebar {
+ margin: 0px auto;
+ text-align: center; }
+ .openerp .oe_view_manager table.oe_view_manager_header td {
+ line-height: 26px; }
+ .openerp .oe_view_manager table.oe_view_manager_header h2 {
+ font-size: 18px;
+ margin: 0;
+ float: left; }
+ .openerp .oe_view_manager table.oe_view_manager_header h2 a {
+ color: #7c7bad; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_dropdown_menu {
+ line-height: normal; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group {
+ display: inline-block;
+ border: 1px solid #ababab;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group li {
+ float: left;
+ border-right: 1px solid #ababab; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group li:last-child {
+ border: none; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group a {
+ color: #4c4c4c; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group a:hover {
+ text-decoration: none; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group .active {
+ background: #999999;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset; }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group .active a {
+ color: white;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); }
+ .openerp .oe_view_manager table.oe_view_manager_header .oe_view_manager_buttons {
+ white-space: nowrap; }
+ .openerp .oe_view_manager .oe_view_manager_pager {
+ line-height: 26px; }
+ .openerp .oe_view_manager .oe_view_manager_pager .oe_list_pager_single_page .oe_pager_group {
+ display: none; }
+ .openerp .oe_view_manager .oe_pager_value {
+ float: left;
+ margin-right: 8px; }
+ .openerp .oe_view_manager ul.oe_pager_group {
+ padding: 0;
+ margin: 0; }
+ .openerp .oe_view_manager .oe_pager_group {
+ float: left;
+ height: 24px;
+ line-height: 24px;
+ display: inline-block;
+ border: 1px solid #ababab;
+ cursor: pointer;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px; }
+ .openerp .oe_view_manager .oe_pager_group li {
+ height: 24px;
+ line-height: 24px;
+ padding: 0;
+ margin: 0;
+ list-style-type: none;
+ float: left;
+ border-right: 1px solid #ababab; }
+ .openerp .oe_view_manager .oe_pager_group li:last-child {
+ border: none; }
+ .openerp .oe_view_manager .oe_pager_group a {
+ color: #4c4c4c;
+ padding: 0 8px; }
+ .openerp .oe_view_manager .oe_pager_group a:hover {
+ text-decoration: none; }
+ .openerp .oe_view_manager .oe_pager_group .active {
+ background: #999999;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset; }
+ .openerp .oe_view_manager .oe_pager_group .active a {
+ color: white;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); }
+ .openerp .oe_view_manager .oe_view_manager_switch {
+ padding: 0;
+ margin: 0 0 0 8px; }
+ .openerp .oe_view_manager .oe_view_manager_switch li {
+ margin: 0;
+ width: 24px;
+ height: 24px;
+ line-height: 16px;
+ padding: 0;
+ text-align: center;
+ list-style-type: none; }
+ .openerp .oe_view_manager .oe_view_manager_switch li a {
+ position: relative; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_list:after, .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_tree:after {
+ padding: 2px;
+ content: "i"; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_form:after {
+ content: "m"; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_graph:after {
+ font-family: "mnmliconsRegular" !important;
+ font-size: 21px;
+ font-weight: 300 !important;
+ content: "}";
+ top: -2px;
+ position: relative; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_gantt:after {
+ font-family: "mnmliconsRegular" !important;
+ font-size: 21px;
+ font-weight: 300 !important;
+ content: "y";
+ top: -2px;
+ position: relative; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_calendar:after {
+ content: "P"; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_kanban:after {
+ content: "k"; }
+ .openerp .oe_view_manager .oe_view_manager_switch .oe_vm_switch_diagram:after {
+ content: "f"; }
+ .openerp .oe_view_manager_current {
+ height: 100%; }
+ .openerp .oe_view_manager_current > .oe_view_manager_header {
+ border-bottom: 1px solid #cacaca;
+ background-color: #fcfcfc;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
+ background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: linear-gradient(to bottom, #fcfcfc, #dedede);
+ -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 9px rgba(0, 0, 0, 0.1);
+ -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 9px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 9px rgba(0, 0, 0, 0.1); }
+ .openerp .oe_view_manager_current > .oe_view_manager_header .oe_header_row td {
+ padding: 8px; }
+ .openerp .oe_view_manager_current > .oe_view_manager_header .oe_header_row:first-child td {
+ padding-top: 8px; }
+ .openerp .oe_view_manager_inline, .openerp .oe_view_manager_inlineview {
+ height: 100%; }
+ .openerp .oe_view_manager_inline > .oe_view_manager_header, .openerp .oe_view_manager_inlineview > .oe_view_manager_header {
+ display: none; }
+ .openerp .oe_popup_form > .oe_formview > .oe_form_pager {
+ display: none !important; }
+ .openerp .oe_searchview {
+ cursor: text;
+ position: relative;
+ float: right;
+ padding: 1px 0;
+ line-height: 18px;
+ width: 400px;
+ border: 1px solid #ababab;
+ background: white;
+ -moz-border-radius: 13px;
+ -webkit-border-radius: 13px;
+ border-radius: 13px;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset; }
+ .openerp .oe_searchview input, .openerp .oe_searchview textarea {
+ padding: 3px;
+ height: 14px;
+ font-size: 12px;
+ line-height: 18px; }
+ .openerp .oe_searchview.oe_focused {
+ border-color: #a6a6fe;
+ -moz-box-shadow: 0 1px 2px #a6a6fe inset;
+ -webkit-box-shadow: 0 1px 2px #a6a6fe inset;
+ box-shadow: 0 1px 2px #a6a6fe inset; }
+ .openerp .oe_searchview .oe_searchview_clear {
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ right: 18px;
+ width: 15px;
+ height: 100%;
+ background: url(../img/search_reset.gif) center center no-repeat; }
+ .openerp .oe_searchview .oe_searchview_unfold_drawer {
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 100%;
+ padding: 0 7px 0 4px;
+ color: #cccccc;
+ cursor: pointer; }
+ .openerp .oe_searchview .oe_searchview_unfold_drawer:hover {
+ color: #999999; }
+ .openerp .oe_searchview .oe_searchview_unfold_drawer:before {
+ position: absolute;
+ top: 10px;
+ right: 7px;
+ width: 0;
+ height: 0;
+ display: inline-block;
+ content: "";
+ vertical-align: top;
+ border-top: 5px solid #4c4c4c;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ filter: alpha(opacity=50);
+ opacity: 0.5; }
+ .openerp .oe_searchview .oe_searchview_search {
+ font-size: 1px;
+ letter-spacing: -1px;
+ color: transparent;
+ font-weight: normal;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ position: absolute;
+ left: 3px;
+ top: 1px;
+ padding: 0;
+ border: none;
+ background: transparent; }
+ .openerp .oe_searchview .oe_searchview_search:before {
+ font: 21px "mnmliconsRegular";
+ content: "r";
+ color: #a3a3a3; }
+ .openerp .oe_searchview .oe_searchview_facets {
+ min-height: 22px;
+ margin-left: 15px; }
+ .openerp .oe_searchview .oe_searchview_facets * {
+ vertical-align: top;
+ display: inline-block;
+ line-height: 17px; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
+ height: 18px;
+ margin: 1px 0;
+ font-size: 11px; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
+ outline: none; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_input {
+ padding: 0 0 0 6px;
+ font-size: 12px;
+ height: 16px;
+ margin-top: 3px; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_input:focus {
+ outline: none; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
+ position: relative;
+ cursor: pointer;
+ padding: 0;
+ -webkit-font-smoothing: auto; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
+ border-color: #a6a6fe;
+ -moz-box-shadow: 0 0 3px 1px #a6a6fe;
+ -webkit-box-shadow: 0 0 3px 1px #a6a6fe;
+ box-shadow: 0 0 3px 1px #a6a6fe; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_values {
+ background: #f0f0fa;
+ -moz-border-radius: 0 3px 3px 0;
+ -webkit-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_category, .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value {
+ height: 18px;
+ padding: 0 4px; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_category {
+ color: white;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4); }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_category.oe_i {
+ font-size: 16px; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value {
+ border-left: 1px solid #afafb6;
+ text-shadow: 0 1px 1px white;
+ color: #4c4c4c; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value:last-child {
+ padding-right: 16px; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_remove {
+ position: absolute;
+ top: 3px;
+ right: 3px;
+ color: #8786b7;
+ line-height: 8px;
+ width: 12px;
+ height: 12px;
+ padding-top: 1px;
+ text-align: center;
+ font-weight: bold;
+ cursor: pointer;
+ text-shadow: 0 1px 1px white; }
+ .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_remove:hover {
+ color: white;
+ background: #8786b7;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ border-radius: 2px; }
+ .openerp .oe_searchview.oe_searchview_open_drawer .oe_searchview_drawer {
+ display: block; }
+ .openerp .oe_searchview .oe_searchview_drawer {
+ position: absolute;
+ z-index: 100;
+ margin-top: 4px;
+ top: 100%;
+ right: -1px;
+ background-color: white;
+ min-width: 100%;
+ display: none;
+ border: 1px solid #afafb6;
+ text-align: left;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); }
+ .openerp .oe_searchview .oe_searchview_drawer > div {
+ border-top: 1px solid #cccccc;
+ margin: 0;
+ padding: 8px; }
+ .openerp .oe_searchview .oe_searchview_drawer > div:first-child {
+ border-top: none;
+ margin: 0; }
+ .openerp .oe_searchview .oe_searchview_drawer h3 {
+ margin: 8px 4px 4px 12px;
+ color: #7c7bad;
+ font-size: 13px; }
+ .openerp .oe_searchview .oe_searchview_drawer h4, .openerp .oe_searchview .oe_searchview_drawer h4 * {
+ margin: 0;
+ cursor: pointer;
+ font-weight: normal;
+ display: inline-block; }
+ .openerp .oe_searchview .oe_searchview_drawer h4:hover, .openerp .oe_searchview .oe_searchview_drawer h4 *:hover {
+ background-color: #f0f0fa; }
+ .openerp .oe_searchview .oe_searchview_drawer h4:before {
+ content: "▸ ";
+ color: #a3a3a3; }
+ .openerp .oe_searchview .oe_searchview_drawer button {
+ margin: 4px 0; }
+ .openerp .oe_searchview .oe_searchview_drawer .button {
+ border: none;
+ background: transparent;
+ padding: 0 2px;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section {
+ display: table;
+ width: 100%; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section > div {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ box-sizing: border-box;
+ display: table-cell;
+ width: 50%; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section ul {
+ margin: 0 8px 8px;
+ padding: 0;
+ list-style: none; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li {
+ list-style: none;
+ padding: 2px 4px 2px 20px;
+ line-height: 14px;
+ color: inherit;
+ cursor: pointer;
+ position: relative; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li.oe_selected:before {
+ content: "W";
+ font-family: "entypoRegular" !important;
+ font-size: 24px;
+ font-weight: 300 !important;
+ color: #a3a3a3;
+ position: absolute;
+ left: 4px;
+ top: -2px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li:hover {
+ background-color: #f0f0fa; }
+ .openerp .oe_searchview .oe_searchview_drawer form {
+ margin-left: 12px; }
+ .openerp .oe_searchview .oe_searchview_drawer form p {
+ margin: 4px 0;
+ line-height: 18px; }
+ .openerp .oe_searchview .oe_searchview_drawer form button {
+ margin: 0 0 8px 0; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom {
+ padding: 0 8px 8px 8px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom form {
+ display: none; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li {
+ cursor: pointer;
+ position: relative;
+ line-height: 14px;
+ padding: 2px 4px 2px 20px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li:hover {
+ background-color: #f0f0fa; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li button {
+ position: absolute;
+ top: 0;
+ right: 5px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_dashboard form {
+ display: none;
+ margin-top: 2px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced form {
+ display: none;
+ margin-top: 8px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced button.oe_add_condition:before {
+ content: "Z";
+ font-family: "entypoRegular" !important;
+ font-size: 24px;
+ font-weight: 300 !important;
+ margin-right: 4px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced ul {
+ list-style: none;
+ padding: 0; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li {
+ position: relative;
+ list-style: none;
+ margin: 0;
+ white-space: nowrap; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or {
+ visibility: hidden; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or {
+ opacity: 0.5;
+ margin-left: -14px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_opened h4:before {
+ content: "▾ ";
+ position: relative;
+ top: -1px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_opened form {
+ display: block; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete, .openerp .oe_searchview .oe_searchview_drawer .searchview_extended_delete_prop {
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ line-height: 12px;
+ padding: 1px;
+ color: #8786b7;
+ line-height: 8px;
+ text-align: center;
+ font-weight: bold;
+ text-shadow: 0 1px 1px white; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete:hover, .openerp .oe_searchview .oe_searchview_drawer .searchview_extended_delete_prop:hover {
+ text-decoration: none;
+ color: white;
+ background: #8786b7;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ border-radius: 2px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete {
+ display: none;
+ position: absolute;
+ bottom: 1px;
+ right: 4px; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_private:hover .oe_searchview_custom_delete, .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_public:hover .oe_searchview_custom_delete {
+ display: inline-block; }
+ .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_public:after {
+ content: ",";
+ font-family: "entypoRegular" !important;
+ font-size: 22px;
+ font-weight: 300 !important;
+ margin: 0 0 0 4px;
+ padding: 0; }
+ .openerp .oe_view_nocontent {
+ padding: 15px;
+ margin-top: 0;
+ color: #777777;
+ font-size: 125%;
+ max-width: 700px; }
+ .openerp .oe_view_nocontent .oe_view_nocontent_create {
+ background: transparent url(/web/static/src/img/view_empty_arrow.png) no-repeat 7px 0;
+ margin-top: 0;
+ padding-top: 35px;
+ min-height: 28px;
+ color: #4c4c4c; }
+ .openerp .oe_view_nocontent > p {
+ padding-left: 95px; }
+ .openerp .oe_view_nocontent .oe_empty_custom_dashboard {
+ background: transparent url(/web/static/src/img/graph_background.png) no-repeat 0 0;
+ margin-top: -15px;
+ padding: 100px 0 0 137px;
+ min-height: 327px;
+ margin-left: -15px; }
+ .openerp .oe_formview {
+ background: white; }
+ .openerp .oe_form_dropdown_section {
+ position: relative;
+ display: inline-block; }
+ .openerp .oe_form_invalid input, .openerp .oe_form_invalid select, .openerp .oe_form_invalid textarea {
+ background-color: #ff6666 !important;
+ border: 1px solid #dd0000 !important; }
+ .openerp .oe_view_manager_current .oe_form_editable .oe_highlight {
+ color: #404040;
+ background: none; }
+ .openerp .oe_view_manager_current .oe_form_editable button.oe_highlight {
+ background-color: #efefef;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
+ background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: -ms-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: -o-linear-gradient(top, #efefef, #d8d8d8);
+ background-image: linear-gradient(to bottom, #efefef, #d8d8d8);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset; }
+ .openerp .oe_view_manager_current .oe_form_editable button.oe_highlight:active {
+ background-color: #e3e3e3;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
+ background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: -ms-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: -o-linear-gradient(top, #e3e3e3, #f6f6f6);
+ background-image: linear-gradient(to bottom, #e3e3e3, #f6f6f6);
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_view_manager_current .oe_form_editable button.oe_highlight:hover {
+ background-color: #f6f6f6;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
+ background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
+ background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset; }
+ .openerp .oe_form_invisible {
+ display: none !important; }
+ .openerp .oe_form_readonly .oe_edit_only, .openerp .oe_form_readonly .oe_form_field:empty {
+ display: none !important; }
+ .openerp .oe_form_readonly .oe_form .oe_form_field_date {
+ width: auto; }
+ .openerp .oe_form_nosheet {
+ margin: 16px; }
+ .openerp .oe_form_nosheet > header {
+ margin: -16px -16px 0 -16px;
+ padding: 0; }
+ .openerp .oe_form_sheetbg {
+ padding: 16px 0; }
+ .openerp .oe_form_sheet_width {
+ min-width: 650px;
+ max-width: 860px;
+ margin: 0 auto; }
+ .openerp .oe_form_sheet {
+ background: white;
+ min-height: 330px;
+ padding: 16px; }
+ .openerp .oe_application .oe_form_sheetbg {
+ background: url(/web/static/src/img/form_sheetbg.png);
+ border-bottom: 1px solid #dddddd; }
+ .openerp .oe_application .oe_form_sheet {
+ border: 1px solid #c8c8d3;
+ -moz-box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
+ -webkit-box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); }
+ .openerp .oe_application .oe_form_sheet .ui-tabs {
+ margin: 0 -16px; }
+ .openerp .oe_application .oe_form_sheet .oe_notebook_page {
+ padding: 0 16px; }
+ .openerp .oe_form header {
+ position: relative;
+ border-bottom: 1px solid #cacaca;
+ padding-left: 2px;
+ background-color: #fcfcfc;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
+ background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: linear-gradient(to bottom, #fcfcfc, #dedede); }
+ .openerp .oe_form header > span {
+ margin-left: 4px; }
+ .openerp .oe_form header ul {
+ display: inline-block;
+ float: right; }
+ .openerp .oe_form header .oe_button {
+ margin: 3px 2px 1px; }
+ .openerp .oe_form header .oe_button:first-child {
+ margin-left: 6px; }
+ .openerp .oe_form header .oe_tags {
+ margin: 5px 0 0 5px;
+ width: 400px;
+ padding-bottom: 0; }
+ .openerp .oe_form div.oe_chatter {
+ min-width: 650px;
+ max-width: 860px;
+ margin: 0 auto;
+ padding: 16px 0 48px; }
+ .openerp .oe_form div.oe_form_configuration p, .openerp .oe_form div.oe_form_configuration ul, .openerp .oe_form div.oe_form_configuration ol {
+ color: #aaaaaa;
+ max-width: 650px; }
+ .openerp .oe_form div.oe_form_configuration label {
+ min-width: 150px; }
+ .openerp .oe_form div.oe_form_configuration .oe_form_group_cell_label {
+ padding: 1px 0; }
+ .openerp .oe_form div.oe_form_configuration .oe_form_group_cell div div {
+ padding: 1px 0; }
+ .openerp .oe_form .oe_subtotal_footer {
+ width: 1% !important; }
+ .openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell {
+ text-align: right;
+ padding: 0 !important; }
+ .openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell_label {
+ border-right: none; }
+ .openerp .oe_form .oe_subtotal_footer .oe_subtotal_footer_separator {
+ width: 108px;
+ border-top: 1px solid #cacaca;
+ margin-top: 4px;
+ padding-top: 4px;
+ font-weight: bold;
+ font-size: 18px; }
+ .openerp .oe_form .oe_subtotal_footer label:after {
+ content: ":"; }
+ .openerp .oe_form .oe_subtotal_footer label.oe_subtotal_footer_separator {
+ font-weight: bold !important;
+ padding: 2px 11px 2px 0px !important; }
+ .openerp .oe_form .oe_subtotal_footer label.oe_form_label_help {
+ font-weight: normal; }
+ .openerp .oe_form .oe_form_button {
+ margin: 2px; }
+ .openerp .oe_form td.oe_form_group_cell_label {
+ border-right: 1px solid #dddddd;
+ padding: 2px 0px; }
+ .openerp .oe_form td.oe_form_group_cell_label label {
+ line-height: 18px;
+ display: block;
+ min-width: 140px; }
+ .openerp .oe_form td.oe_form_group_cell + .oe_form_group_cell {
+ padding: 2px 0 2px 8px; }
+ .openerp .oe_form .oe_form_group {
+ width: 100%;
+ margin: 9px 0 9px 0; }
+ .openerp .oe_form .oe_form_group .oe_form_group_cell.oe_group_right {
+ padding-left: 20px; }
+ .openerp .oe_form .oe_form_label_help[for], .openerp .oe_form .oe_form_label[for] {
+ font-weight: bold;
+ white-space: nowrap;
+ padding-right: 8px; }
+ .openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
+ font-size: 80%;
+ color: darkGreen;
+ vertical-align: top;
+ position: relative;
+ top: -4px;
+ padding: 0 2px; }
+ .openerp .oe_horizontal_border {
+ border-bottom: 1px solid black; }
+ .openerp .oe_horizontal_separator {
+ font-weight: bold;
+ font-size: 20px;
+ margin: 15px 0px 10px 0px;
+ color: #7c7bad; }
+ .openerp .oe_horizontal_separator:empty {
+ height: 5px; }
+ .openerp .oe_vertical_separator {
+ border-left: 1px solid #666666;
+ padding: 0 4px 0 4px; }
+ .openerp .oe_form_field_progressbar {
+ display: inline-block;
+ min-width: 70px; }
+ .openerp .oe_form_field_progressbar.ui-progressbar {
+ height: 22px;
+ font-size: 10px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #999999;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background: white;
+ min-width: 50px; }
+ .openerp .oe_form_field_progressbar.ui-progressbar span {
+ position: absolute;
+ margin-left: 10px;
+ font-weight: bold; }
+ .openerp .oe_form_field_progressbar.ui-progressbar .ui-widget-header {
+ background: #cccccc url(/web/static/lib/jquery.ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; }
+ .openerp .oe_form .oe_form_field_text {
+ width: 100%; }
+ .openerp .oe_form .oe_form_field_char input,
+ .openerp .oe_form .oe_form_field_url input,
+ .openerp .oe_form .oe_form_field_email input,
+ .openerp .oe_form .oe_form_field_text textarea,
+ .openerp .oe_form .oe_form_field_selection select {
+ width: 100%; }
+ .openerp .oe_form .oe_form_field_text.oe_inline, .openerp .oe_form .oe_form_field_text.oe_inline > textarea {
+ width: 500px; }
+ .openerp .oe_form h1, .openerp .oe_form h2, .openerp .oe_form h3, .openerp .oe_form h4, .openerp .oe_form h5, .openerp .oe_form h6 {
+ margin: 0 0 4px 0; }
+ .openerp .oe_form h1 input, .openerp .oe_form h2 input, .openerp .oe_form h3 input, .openerp .oe_form h4 input, .openerp .oe_form h5 input, .openerp .oe_form h6 input {
+ height: inherit !important;
+ font-size: inherit; }
+ .openerp .oe_form .oe_form_field {
+ width: 100%;
+ display: inline-block;
+ padding: 2px 2px 2px 0px; }
+ .openerp .oe_form .oe_form_field input {
+ margin: 0px; }
+ .openerp .oe_form input[type="text"], .openerp .oe_form input[type="password"], .openerp .oe_form input[type="file"], .openerp .oe_form select {
+ height: 22px;
+ padding-top: 2px; }
+ .openerp .oe_form input[type="text"], .openerp .oe_form input[type="password"], .openerp .oe_form input[type="file"], .openerp .oe_form select, .openerp .oe_form textarea {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ box-sizing: border-box;
+ background: white;
+ min-width: 60px;
+ color: #1f1f1f; }
+ .openerp .oe_form input[readonly], .openerp .oe_form select[readonly], .openerp .oe_form textarea[readonly], .openerp .oe_form input[disabled], .openerp .oe_form select[disabled] {
+ background: #e5e5e5 !important;
+ color: #666666; }
+ .openerp .oe_form textarea[disabled] {
+ border: none;
+ padding-left: 8px;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ -moz-border-radius: 0px;
+ -webkit-border-radius: 0px;
+ border-radius: 0px; }
+ .openerp .oe_form textarea.oe_inline[disabled] {
+ border-left: 8px solid #eeeeee; }
+ .openerp .oe_form .oe_form_field_url button img {
+ vertical-align: top; }
+ .openerp .oe_form .oe_form_field_date,
+ .openerp .oe_form .oe_form_field_datetime {
+ white-space: nowrap; }
+ .openerp .oe_form .oe_form_field_boolean {
+ padding-top: 4px;
+ width: auto; }
+ .openerp .oe_form .oe_datepicker_container {
+ display: none; }
+ .openerp .oe_form .oe_datepicker_root {
+ display: inline-block; }
+ .openerp .oe_form .oe_form_required input:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required select:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required textarea:not([disabled]):not([readonly]) {
+ background-color: #d2d2ff !important; }
+ .openerp .oe_form .oe_form_invalid input, .openerp .oe_form .oe_form_invalid select, .openerp .oe_form .oe_form_invalid textarea {
+ background-color: #ff6666 !important;
+ border: 1px solid #dd0000 !important; }
+ .openerp .oe_form .oe_input_icon {
+ cursor: pointer;
+ margin: 3px 0 0 -21px;
+ vertical-align: top; }
+ .openerp .oe_form .oe_input_icon_disabled {
+ position: absolute;
+ cursor: default;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ right: 5px;
+ top: 3px; }
+ .openerp .oe_form .oe_form_field_with_button.oe_no_button > .oe_button {
+ display: none; }
+ .openerp .oe_form .oe_form_field_with_button:not(.oe_no_button) > .oe_button {
+ float: right;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ border-bottom-left-radius: 0px;
+ height: 22px; }
+ .openerp .oe_form .oe_form_field_with_button input {
+ width: 100%; }
+ .openerp .oe_form .oe_form_field_with_button > div {
+ position: relative;
+ overflow: hidden; }
+ .openerp .oe_form .oe_form_embedded_html {
+ position: relative;
+ width: 600px;
+ margin-left: 130px;
+ margin-top: 32px;
+ margin-bottom: 32px;
+ text-align: justify; }
+ .openerp .oe_form_editable .oe_form .oe_form_field_integer input {
+ width: 6em !important; }
+ .openerp .oe_form_editable .oe_form .oe_form_field_float input {
+ width: 7em !important; }
+ .openerp .oe_form_editable .oe_form .oe_form_field_date input {
+ width: 7.5em !important; }
+ .openerp .oe_form_editable .oe_form .oe_form_field_datetime input {
+ width: 11.5em !important; }
+ .openerp .oe_hidden_input_file {
+ position: relative; }
+ .openerp .oe_hidden_input_file input.oe_form_binary_file {
+ z-index: 0;
+ line-height: 0;
+ font-size: 12px;
+ position: absolute;
+ top: 1px;
+ left: 0;
+ right: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ -ms-filter: "alpha(opacity=0)";
+ margin: 0;
+ padding: 0; }
+ .openerp .oe_form .oe_form_field_image {
+ padding: 0;
+ position: relative;
+ display: inline-block;
+ width: auto;
+ vertical-align: top; }
+ .openerp .oe_form .oe_form_field_image .oe_form_field_image_controls {
+ position: absolute;
+ top: 1px;
+ padding: 4px;
+ width: 100%;
+ display: none;
+ text-align: center;
+ color: #eeeeee;
+ background: rgba(37, 37, 37, 0.9);
+ -moz-border-radius: 3px 3px 0 0;
+ -webkit-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ box-sizing: border-box; }
+ .openerp .oe_form .oe_form_field_image:hover .oe_form_field_image_controls {
+ display: block; }
+ .openerp .oe_form_field_many2one td:first-child {
+ position: relative; }
+ .openerp .oe_form_field_many2one span.oe_m2o_drop_down_button {
+ position: absolute;
+ top: 2px;
+ right: 0px; }
+ .openerp .oe_form_field_many2one .oe_m2o_cm_button {
+ line-height: 14px;
+ float: right;
+ padding-left: 2px; }
+ .openerp.ui-autocomplete li.oe_m2o_dropdown_option a {
+ font-style: italic;
+ padding-left: 2em; }
+ .openerp.ui-autocomplete li:not(.oe_m2o_dropdown_option) + li.oe_m2o_dropdown_option {
+ margin-top: 10px; }
+ .openerp ul.oe_form_status, .openerp ul.oe_form_status_clickable {
+ display: inline-block;
+ margin: 0;
+ padding: 0 18px 0 0; }
+ .openerp ul.oe_form_status li, .openerp ul.oe_form_status_clickable li {
+ display: inline-block;
+ list-style-type: none;
+ margin: 0 -18px 0 0;
+ padding: 0;
+ background-color: #fcfcfc;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
+ background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: linear-gradient(to bottom, #fcfcfc, #dedede); }
+ .openerp ul.oe_form_status li:first-child .label, .openerp ul.oe_form_status_clickable li:first-child .label {
+ border-left: 1px solid #cacaca;
+ padding-left: 14px; }
+ .openerp ul.oe_form_status li:last-child, .openerp ul.oe_form_status_clickable li:last-child {
+ border-right: 1px solid #cacaca; }
+ .openerp ul.oe_form_status li:last-child .label, .openerp ul.oe_form_status_clickable li:last-child .label {
+ padding-right: 14px; }
+ .openerp ul.oe_form_status li:last-child .arrow, .openerp ul.oe_form_status_clickable li:last-child .arrow {
+ display: none; }
+ .openerp ul.oe_form_status li .label, .openerp ul.oe_form_status_clickable li .label {
+ color: #4c4c4c;
+ text-shadow: 0 1px 1px #fcfcfc, 0 -1px 1px #dedede;
+ padding: 7px;
+ display: inline-block;
+ padding-left: 24px;
+ margin: 0;
+ position: relative; }
+ .openerp ul.oe_form_status li .arrow, .openerp ul.oe_form_status_clickable li .arrow {
+ width: 17px;
+ display: inline-block;
+ vertical-align: top;
+ overflow: hidden;
+ margin-left: -5px; }
+ .openerp ul.oe_form_status li .arrow span, .openerp ul.oe_form_status_clickable li .arrow span {
+ position: relative;
+ width: 24px;
+ height: 24px;
+ display: inline-block;
+ margin-left: -12px;
+ margin-top: 3px;
+ box-shadow: -1px 1px 2px rgba(255, 255, 255, 0.2), inset -1px 1px 1px rgba(0, 0, 0, 0.2);
+ background-color: #dedede;
+ background: -moz-linear-gradient(135deg, #dedede, #fcfcfc);
+ background: -o-linear-gradient(135deg, #fcfcfc, #dedede);
+ background: -webkit-gradient(linear, left top, right bottom, from(#fcfcfc), to(#dedede));
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg); }
+ .openerp ul.oe_form_status li.oe_active, .openerp ul.oe_form_status_clickable li.oe_active {
+ background-color: #729fcf;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#729fcf), to(#3465a4));
+ background-image: -webkit-linear-gradient(top, #729fcf, #3465a4);
+ background-image: -moz-linear-gradient(top, #729fcf, #3465a4);
+ background-image: -ms-linear-gradient(top, #729fcf, #3465a4);
+ background-image: -o-linear-gradient(top, #729fcf, #3465a4);
+ background-image: linear-gradient(to bottom, #729fcf, #3465a4); }
+ .openerp ul.oe_form_status li.oe_active .arrow span, .openerp ul.oe_form_status_clickable li.oe_active .arrow span {
+ background-color: #3465a4;
+ background: -moz-linear-gradient(135deg, #3465a4, #729fcf);
+ background: -o-linear-gradient(135deg, #729fcf, #3465a4);
+ background: -webkit-gradient(linear, left top, right bottom, from(#729fcf), to(#3465a4)); }
+ .openerp ul.oe_form_status li.oe_active .label, .openerp ul.oe_form_status_clickable li.oe_active .label {
+ color: white;
+ text-shadow: 0 1px 1px #729fcf, 0 -1px 1px #3465a4; }
+ .openerp ul.oe_form_status_clickable li {
+ cursor: pointer; }
+ .openerp ul.oe_form_status_clickable li:hover {
+ background-color: #e8e8e8;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#cacaca));
+ background-image: -webkit-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: -moz-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: -ms-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: -o-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: linear-gradient(to bottom, #e8e8e8, #cacaca); }
+ .openerp ul.oe_form_status_clickable li:hover .label {
+ text-shadow: 0 -1px 1px #fcfcfc, 0 1px 1px #dedede; }
+ .openerp ul.oe_form_status_clickable li:hover .arrow span {
+ background-color: #e8e8e8;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#cacaca));
+ background-image: -webkit-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: -moz-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: -ms-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: -o-linear-gradient(top, #e8e8e8, #cacaca);
+ background-image: linear-gradient(to bottom, #e8e8e8, #cacaca); }
+ .openerp ul.oe_form_status_clickable li .label {
+ color: #7c7bad; }
+ .openerp ul.oe_form_status_clickable li.oe_active:hover {
+ background-color: #4c85c2;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#4c85c2), to(#284d7d));
+ background-image: -webkit-linear-gradient(top, #4c85c2, #284d7d);
+ background-image: -moz-linear-gradient(top, #4c85c2, #284d7d);
+ background-image: -ms-linear-gradient(top, #4c85c2, #284d7d);
+ background-image: -o-linear-gradient(top, #4c85c2, #284d7d);
+ background-image: linear-gradient(to bottom, #4c85c2, #284d7d); }
+ .openerp ul.oe_form_status_clickable li.oe_active:hover .label {
+ text-shadow: 0 -1px 1px #729fcf, 0 1px 1px #3465a4; }
+ .openerp ul.oe_form_status_clickable li.oe_active:hover .arrow span {
+ background-color: #284d7d;
+ background: -moz-linear-gradient(135deg, #284d7d, #4c85c2);
+ background: -o-linear-gradient(135deg, #4c85c2, #284d7d);
+ background: -webkit-gradient(linear, left top, right bottom, from(#4c85c2), to(#284d7d)); }
+ .openerp .oe_form .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page {
+ display: none; }
+ .openerp .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page, .openerp .oe_form_field_many2many > .oe_view_manager .oe_list_pager_single_page {
+ display: none !important; }
+ .openerp .oe_form_field_one2many .oe_form_field_one2many_list_row_add, .openerp .oe_form_field_many2many .oe_form_field_one2many_list_row_add {
+ font-weight: bold; }
+ .openerp .oe_form_field_one2many .oe_list_content > thead, .openerp .oe_form_field_many2many .oe_list_content > thead {
+ border-bottom: 1px; }
+ .openerp .oe_form_field_one2many .oe_list_content > tbody tr:nth-child(odd), .openerp .oe_form_field_many2many .oe_list_content > tbody tr:nth-child(odd) {
+ background: transparent; }
+ .openerp .oe_form_field_one2many .oe_list .oe_list_edit_row_save, .openerp .oe_form_field_many2many .oe_list .oe_list_edit_row_save {
+ background: url(/web/static/src/img/iconset-b-remove.png) 50% 50% no-repeat; }
+ .openerp .oe_form_field_one2many .oe_list .oe_list_edit_row_save:before, .openerp .oe_form_field_many2many .oe_list .oe_list_edit_row_save:before {
+ visibility: hidden; }
+ .openerp .oe_form_field_one2many > .oe_view_manager .oe_header_row_top, .openerp .oe_form_field_many2many > .oe_view_manager .oe_header_row_top {
+ display: none; }
+ .openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td {
+ padding: 0px 8px;
+ line-height: 16px; }
+ .openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td .oe_i, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td .oe_i {
+ font-size: 13px; }
+ .openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group {
+ height: auto;
+ line-height: 16px; }
+ .openerp .oe_form_field_one2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group li, .openerp .oe_form_field_many2many > .oe_view_manager .oe_view_manager_header2 td .oe_pager_group li {
+ height: auto;
+ line-height: 16px; }
+ .openerp .oe_form_field_one2many .oe_list_buttons.oe_editing .oe_list_save, .openerp .oe_form_field_many2many .oe_list_buttons.oe_editing .oe_list_save {
+ visibility: hidden; }
+ .openerp .oe_form_editable .oe_list_editable .oe_list_content td.oe_required {
+ background-color: #d2d2ff; }
+ .openerp .oe_form_editable .oe_list_editable .oe_list_content td.oe_readonly {
+ background-color: #eeeeee; }
+ .openerp .oe_list_editable .oe_list_content td.oe_list_field_cell {
+ padding: 4px 6px 3px 6px; }
+ .openerp .oe_list.oe_list_editable td.oe_list_record_delete {
+ position: absolute; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) {
+ color: transparent; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) * {
+ visibility: hidden; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_m2o_drop_down_button {
+ top: 5px; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_m2o_cm_button {
+ display: none; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field textarea {
+ height: 27px; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field textarea {
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ border: 1px solid #aaaaff;
+ margin: 0; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_float input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_view_integer input {
+ text-align: right;
+ width: 100% !important; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime > span, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date > span {
+ width: 100% !important; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime input.oe_datepicker_master, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date input.oe_datepicker_master {
+ width: 100% !important; }
+ .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field .oe_form_field_float, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field .oe_form_view_integer, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date {
+ min-width: 0 !important;
+ max-width: none !important; }
+ .openerp .oe_list_group_name {
+ white-space: nowrap; }
+ .openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page {
+ display: none; }
+ .openerp .oe_list_buttons .oe_alternative {
+ visibility: hidden; }
+ .openerp .oe_list_buttons .oe_list_save, .openerp .oe_list_buttons .oe_list_discard {
+ display: none; }
+ .openerp .oe_list_buttons.oe_editing .oe_list_add {
+ display: none; }
+ .openerp .oe_list_buttons.oe_editing .oe_list_save {
+ display: inline-block; }
+ .openerp .oe_list_buttons.oe_editing .oe_list_discard {
+ display: inline; }
+ .openerp .oe_list_buttons.oe_editing .oe_alternative {
+ visibility: visible; }
+ .openerp .oe_list .oe_form .oe_form_nosheet {
+ margin: 0;
+ padding: 0;
+ border: none; }
+ .openerp .oe_list .oe_form .oe_form_field {
+ width: auto;
+ position: absolute;
+ margin: 0 !important;
+ padding: 0; }
+ .openerp .oe_list .oe_list_content .oe_group_header {
+ background-color: #fcfcfc;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
+ background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -ms-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: -o-linear-gradient(top, #fcfcfc, #dedede);
+ background-image: linear-gradient(to bottom, #fcfcfc, #dedede); }
+ .openerp .oe_list_content {
+ width: 100%; }
+ .openerp .oe_list_content td:first-child:after, .openerp .oe_list_content th:first-child:after {
+ border-width: 0; }
+ .openerp .oe_list_content td.oe_number {
+ text-align: right !important;
+ max-width: 100px; }
+ .openerp .oe_list_content > thead {
+ border-bottom: 2px solid #cacaca;
+ background: #eeeeee;
+ vertical-align: top; }
+ .openerp .oe_list_content td, .openerp .oe_list_content th {
+ padding: 3px 6px;
+ line-height: 18px; }
+ .openerp .oe_list_content th.oe_sortable, .openerp .oe_list_content th.oe_sortable div {
+ cursor: pointer; }
+ .openerp .oe_list_content th.oe_sortable div {
+ position: relative; }
+ .openerp .oe_list_content th.oe_sortable div:after {
+ position: absolute;
+ right: 6px;
+ content: "";
+ margin-top: 7px;
+ border-width: 0 4px 4px;
+ border-style: solid;
+ border-color: black transparent;
+ visibility: hidden; }
+ .openerp .oe_list_content th.sortup div:after {
+ visibility: visible;
+ filter: alpha(opacity=60);
+ opacity: 0.6; }
+ .openerp .oe_list_content th.sortdown div:after {
+ border-bottom: none;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 4px solid black;
+ visibility: visible;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ filter: alpha(opacity=60);
+ opacity: 0.6; }
+ .openerp .oe_list_content > tbody {
+ cursor: pointer; }
+ .openerp .oe_list_content > tbody > tr {
+ height: 27px;
+ border-top: 1px solid #dddddd; }
+ .openerp .oe_list_content > tbody > tr > td.oe_list_field_cell {
+ padding: 3px 6px;
+ white-space: pre-line; }
+ .openerp .oe_list_content > tbody > tr > td > button, .openerp .oe_list_content > tbody > tr > th > button {
+ border: none;
+ background: transparent;
+ padding: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .openerp .oe_list_content > tbody > tr > td.oe_list_checkbox:first-child, .openerp .oe_list_content > tbody > tr th.oe_list_checkbox:first-child {
+ width: 17px; }
+ .openerp .oe_list_content > tbody > tr > td.oe_list_checkbox:first-child:after, .openerp .oe_list_content > tbody > tr th.oe_list_checkbox:first-child:after {
+ border-width: 0; }
+ .openerp .oe_list_content > tbody > tr:nth-child(odd) {
+ background-color: #f0f0fa;
+ background-color: #f0f0fa;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
+ background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -ms-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: -o-linear-gradient(top, #f0f0fa, #eeeef6);
+ background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6); }
+ .openerp .oe_list_content > tfoot {
+ border-top: 2px solid #cacaca;
+ border-bottom: 1px solid #cacaca;
+ background: #eeeeee;
+ font-weight: bold; }
+ .openerp .oe_list_content .numeric {
+ text-align: right;
+ width: 82px; }
+ .openerp .oe_list_content .numeric input {
+ text-align: right; }
+ .openerp .oe_list_content th.oe_list_header_handle {
+ font-size: 1px;
+ overflow: hidden;
+ text-indent: -9001px; }
+ .openerp .oe_list_content td.oe_list_field_handle {
+ width: 1em;
+ padding: 0 !important;
+ cursor: ns-resize; }
+ .openerp .oe_list_content td.oe_list_field_handle .oe_list_handle {
+ font-size: 1px;
+ letter-spacing: -1px;
+ color: transparent;
+ font-weight: normal;
+ margin-right: 7px; }
+ .openerp .oe_list_content td.oe_list_field_handle .oe_list_handle:before {
+ font: 18px "entypoRegular";
+ content: "}";
+ color: #e0e0e0; }
+ .openerp .oe_list_cannot_create .oe_view_nocontent_create {
+ display: none; }
+ .openerp .oe_list_cannot_edit .oe_list_header_handle, .openerp .oe_list_cannot_edit .oe_list_field_handle {
+ display: none !important;
+ padding: 0 !important; }
+ .openerp .oe_list_cannot_delete .oe_list_record_delete {
+ display: none !important; }
+ .openerp .tree_header {
+ background-color: #f0f0f0;
+ border-bottom: 1px solid #cacaca;
+ color: #4c4c4c;
+ padding: 5px;
+ height: 25px; }
+ .openerp .tree_header button {
+ float: right;
+ height: 27px;
+ margin-right: 5px; }
+ .openerp .oe-treeview-table {
+ width: 100%;
+ background-color: white;
+ border-spacing: 0;
+ color: #4c4c4c; }
+ .openerp .oe-treeview-table th {
+ padding: 10px;
+ font-weight: bold;
+ background-color: #f0f0f0;
+ border-bottom: 2px solid #cacaca; }
+ .openerp .oe-treeview-table td {
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: left;
+ vertical-align: middle;
+ height: 20px;
+ padding-left: 4px;
+ padding-right: 4px;
+ border-right: 1px solid #e7e7e7; }
+ .openerp .oe-treeview-table td.oe_number {
+ text-align: right !important; }
+ .openerp .oe-treeview-table tr {
+ border-bottom: 1px solid #d6d6d6; }
+ .openerp .oe-treeview-table tr:hover {
+ background-color: #e7e7e7; }
+ .openerp .oe-treeview-table span {
+ font-size: 90%;
+ font-weight: normal;
+ white-space: nowrap;
+ display: block; }
+ .openerp .oe-treeview-table .treeview-tr.oe-treeview-first {
+ background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat; }
+ .openerp .oe-treeview-table .oe_open .treeview-tr.oe-treeview-first {
+ background-image: url(/web/static/src/img/collapse.gif); }
+ .openerp .oe-treeview-table .treeview-tr.oe-treeview-first span, .openerp .oe-treeview-table .treeview-td.oe-treeview-first span {
+ margin-left: 16px; }
+ .openerp .oe_layout_debugging .oe_form_group {
+ outline: 2px dashed green; }
+ .openerp .oe_layout_debugging .oe_form_group_cell {
+ outline: 1px solid blue; }
+ .openerp .oe_layout_debugging .oe_form_group:hover, .openerp .oe_layout_debugging .oe_form_group_cell:hover {
+ outline-color: red; }
+ .openerp .oe_layout_debugging .oe_form_group_row_incomplete > td:last-child:after {
+ content: "[Incomplete Row]";
+ background: red;
+ padding: 2px;
+ font-weight: bold;
+ color: white;
+ float: right; }
+ .openerp .oe_layout_debugging .oe_form_group_row_incomplete.oe_form_group_row_newline > td:last-child:after {
+ content: "[newline]"; }
+ .openerp .oe_debug_view {
+ float: left; }
+ .openerp .oe_debug_view_log {
+ font-size: 95%; }
+ .openerp .oe_debug_view_log label {
+ display: block;
+ width: 49%;
+ text-align: right;
+ float: left;
+ font-weight: bold;
+ color: #000099; }
+ .openerp .oe_debug_view_log span {
+ display: block;
+ width: 49%;
+ float: right;
+ color: #333333; }
.kitten-mode-activated {
background-image: url(http://placekitten.com/g/1365/769);
background-size: cover;
- background-attachment: fixed;
-}
-.kitten-mode-activated > * {
- opacity: 0.7;
-}
+ background-attachment: fixed; }
+ .kitten-mode-activated > * {
+ opacity: 0.7; }
div.ui-widget-overlay {
background: black;
filter: alpha(opacity=30);
- opacity: 0.3;
-}
+ opacity: 0.3; }
.ui-widget {
font-family: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
color: #4c4c4c;
- font-size: 13px;
-}
+ font-size: 13px; }
.ui-menu {
padding: 2px 0;
@@ -2898,29 +2371,22 @@ div.ui-widget-overlay {
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
margin-top: 4px;
- border: 1px solid #afafb6;
-}
-.ui-menu .ui-menu-item {
- width: 100%;
- padding: 0;
-}
-.ui-menu .ui-menu-item a {
- padding: 1px 16px;
-}
-.ui-menu .ui-menu-item a.ui-corner-all {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
-}
-.ui-menu .ui-menu-item a.ui-state-active {
- background: #f0f0fa;
-}
-.ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active {
- background: #7c7bad;
-}
+ border: 1px solid #afafb6; }
+ .ui-menu .ui-menu-item {
+ width: 100%;
+ padding: 0; }
+ .ui-menu .ui-menu-item a {
+ padding: 1px 16px; }
+ .ui-menu .ui-menu-item a.ui-corner-all {
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0; }
+ .ui-menu .ui-menu-item a.ui-state-active {
+ background: #f0f0fa; }
+ .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active {
+ background: #7c7bad; }
.ui-corner-all {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
- border-radius: 3px;
-}
+ border-radius: 3px; }
From 40c3a1d748cb5cd27518e6881a83f7d38eb47380 Mon Sep 17 00:00:00 2001
From: Antony Lesuisse
Date: Tue, 23 Oct 2012 03:03:03 +0200
Subject: [PATCH 140/150] [FIX] process model link to doc.openerp.com
bzr revid: al@openerp.com-20121023010303-u0opl3aluqtogqeb
---
addons/process/static/src/js/process.js | 3 +--
addons/process/static/src/xml/process.xml | 4 ++--
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/addons/process/static/src/js/process.js b/addons/process/static/src/js/process.js
index c2ec4486507..2405f6d2aa5 100644
--- a/addons/process/static/src/js/process.js
+++ b/addons/process/static/src/js/process.js
@@ -176,11 +176,10 @@ instance.web.ViewManager.include({
var notes = new_notes.substring(0,60) +'..';
}
r.text(nodes.x+60, nodes.y+30, (notes || new_notes)).attr({"title":nodes.notes,"cursor": "default"});
- var DOC_URL = "http://doc.openerp.com/v6.1/index.php";
r['image']('/web/static/src/img/icons/gtk-info.png', nodes.x, nodes.y+75, 16, 16)
.attr({"cursor": "pointer", "title": "Help"})
.click(function() {
- window.open(nodes.url || DOC_URL + "?model=" + nodes.model);
+ window.open(nodes.url || "http://doc.openerp.com/v6.1/index.php?model=" + nodes.model);
});
if(nodes.menu) {
r['image']('/web/static/src/img/icons/gtk-jump-to.png', nodes.x+100, nodes.y+75, 16, 16)
diff --git a/addons/process/static/src/xml/process.xml b/addons/process/static/src/xml/process.xml
index b1a39aa6ce8..d6229b686f3 100644
--- a/addons/process/static/src/xml/process.xml
+++ b/addons/process/static/src/xml/process.xml
@@ -16,7 +16,7 @@
@@ -25,7 +25,7 @@
|
-
+
|
From c55438e695d03854ebf1b82aa0d6b33b3dc278f0 Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Tue, 23 Oct 2012 05:05:46 +0000
Subject: [PATCH 141/150] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20121023044839-5p7b9e93zpxmpfpv
bzr revid: launchpad_translations_on_behalf_of_openerp-20121023050546-in29ajkb3zkyg3za
---
addons/account_cancel/i18n/es_MX.po | 39 +-
addons/anonymization/i18n/mn.po | 4 +-
addons/hr/i18n/lt.po | 29 +-
addons/hr_timesheet_sheet/i18n/mk.po | 1031 ++++++++++++++++++++++++++
addons/l10n_mx/i18n/es_MX.po | 73 +-
addons/sale/i18n/lt.po | 30 +-
addons/web/i18n/it.po | 28 +-
7 files changed, 1139 insertions(+), 95 deletions(-)
create mode 100644 addons/hr_timesheet_sheet/i18n/mk.po
diff --git a/addons/account_cancel/i18n/es_MX.po b/addons/account_cancel/i18n/es_MX.po
index c3029cd8d53..c176d3a8f45 100644
--- a/addons/account_cancel/i18n/es_MX.po
+++ b/addons/account_cancel/i18n/es_MX.po
@@ -1,38 +1,23 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR , 2010.
+# FIRST AUTHOR , 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2010-11-23 09:43+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"\n"
-"Language-Team: Spanish \n"
+"POT-Creation-Date: 2012-02-08 00:35+0000\n"
+"PO-Revision-Date: 2012-10-22 17:44+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Spanish (Mexico) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:48+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2012-10-23 04:48+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
#. module: account_cancel
-#: model:ir.module.module,description:account_cancel.module_meta_information
-msgid ""
-"\n"
-" Module adds 'Allow cancelling entries' field on form view of account "
-"journal. If set to true it allows user to cancel entries & invoices.\n"
-" "
-msgstr ""
-"\n"
-" Este módulo añade el campo 'Permitir la cancelación de asientos' en la "
-"vista de formulario de los diarios contables. Si está marcado, permite a los "
-"usuarios cancelar los asientos y las facturas.\n"
-" "
-
-#. module: account_cancel
-#: model:ir.module.module,shortdesc:account_cancel.module_meta_information
-msgid "Account Cancel"
-msgstr "Cancelar asientos/facturas"
+#: view:account.invoice:0
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/addons/anonymization/i18n/mn.po b/addons/anonymization/i18n/mn.po
index cd54ad8ef6c..3ba97872c3c 100644
--- a/addons/anonymization/i18n/mn.po
+++ b/addons/anonymization/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-10-22 04:40+0000\n"
-"X-Generator: Launchpad (build 16165)\n"
+"X-Launchpad-Export-Date: 2012-10-23 04:48+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
#. module: anonymization
#: model:ir.model,name:anonymization.model_ir_model_fields_anonymize_wizard
diff --git a/addons/hr/i18n/lt.po b/addons/hr/i18n/lt.po
index f50c071b739..831a1fe29d5 100644
--- a/addons/hr/i18n/lt.po
+++ b/addons/hr/i18n/lt.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2012-10-21 21:20+0000\n"
-"Last-Translator: mchip \n"
+"PO-Revision-Date: 2012-10-22 07:48+0000\n"
+"Last-Translator: nanothole \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-10-22 04:40+0000\n"
-"X-Generator: Launchpad (build 16165)\n"
+"X-Launchpad-Export-Date: 2012-10-23 04:48+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
#. module: hr
#: model:process.node,name:hr.process_node_openerpuser0
@@ -56,7 +56,7 @@ msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.view_department_form_installer
msgid "Create Your Departments"
-msgstr ""
+msgstr "Sukurkite padalinius"
#. module: hr
#: model:ir.actions.act_window,help:hr.action_hr_job
@@ -77,12 +77,12 @@ msgstr "Padalinys"
#. module: hr
#: view:hr.job:0
msgid "Mark as Old"
-msgstr ""
+msgstr "Pažymeti kaip sena"
#. module: hr
#: view:hr.job:0
msgid "Jobs"
-msgstr ""
+msgstr "Darbai"
#. module: hr
#: view:hr.job:0
@@ -185,12 +185,12 @@ msgstr ""
#. module: hr
#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_new_config
msgid "Attendance"
-msgstr ""
+msgstr "Lankomumas"
#. module: hr
#: view:hr.employee:0
msgid "Social IDs"
-msgstr ""
+msgstr "SODRA Nr."
#. module: hr
#: field:hr.employee,work_phone:0
@@ -227,7 +227,7 @@ msgstr "Darbuotojas"
#. module: hr
#: model:process.node,note:hr.process_node_employeecontact0
msgid "Other information"
-msgstr ""
+msgstr "Kita informacija"
#. module: hr
#: field:hr.employee,work_email:0
@@ -237,7 +237,7 @@ msgstr "Darbo el. paštas"
#. module: hr
#: field:hr.employee,birthday:0
msgid "Date of Birth"
-msgstr ""
+msgstr "Gimimo data"
#. module: hr
#: model:ir.ui.menu,name:hr.menu_hr_reporting
@@ -253,7 +253,7 @@ msgstr ""
#. module: hr
#: view:hr.employee:0 field:hr.employee,job_id:0 view:hr.job:0
msgid "Job"
-msgstr ""
+msgstr "Darbas"
#. module: hr
#: field:hr.department,member_ids:0
@@ -268,7 +268,7 @@ msgstr "Nustatymai"
#. module: hr
#: view:hr.employee:0 field:hr.employee,category_ids:0
msgid "Categories"
-msgstr ""
+msgstr "Kategorijos"
#. module: hr
#: field:hr.job,expected_employees:0
@@ -799,3 +799,6 @@ msgstr ""
#~ msgstr ""
#~ "Objekto pavadinimas turi prasidėti su x_ ir jame negali būti specialiųjų "
#~ "ženklų!"
+
+#~ msgid "Work E-mail"
+#~ msgstr "Darbinis el. paštas"
diff --git a/addons/hr_timesheet_sheet/i18n/mk.po b/addons/hr_timesheet_sheet/i18n/mk.po
new file mode 100644
index 00000000000..23a08ee255d
--- /dev/null
+++ b/addons/hr_timesheet_sheet/i18n/mk.po
@@ -0,0 +1,1031 @@
+# Macedonian translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-02-08 01:37+0100\n"
+"PO-Revision-Date: 2012-10-22 12:23+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Macedonian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-23 04:48+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
+
+#. module: hr_timesheet_sheet
+#: field:hr.analytic.timesheet,sheet_id:0 field:hr.attendance,sheet_id:0
+#: field:hr_timesheet_sheet.sheet.account,sheet_id:0
+#: field:hr_timesheet_sheet.sheet.day,sheet_id:0
+msgid "Sheet"
+msgstr "Лист"
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,name:hr_timesheet_sheet.process_transition_timesheetdraft0
+msgid "Service"
+msgstr "Сервис"
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py:38
+#, python-format
+msgid "No employee defined for your user !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:hr_timesheet_sheet.sheet:0
+#: view:timesheet.report:0
+msgid "Group By..."
+msgstr "Групирај По..."
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,total_attendance:0
+#: field:hr_timesheet_sheet.sheet,total_attendance_day:0
+msgid "Total Attendance"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+#: field:hr_timesheet_sheet.sheet,department_id:0 view:timesheet.report:0
+#: field:timesheet.report,department_id:0
+msgid "Department"
+msgstr "Сектор"
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Timesheet in current year"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,name:hr_timesheet_sheet.process_transition_tasktimesheet0
+msgid "Task timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Today"
+msgstr "Денес"
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:274
+#, python-format
+msgid ""
+"Please verify that the total difference of the sheet is lower than %.2f !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "March"
+msgstr "Март"
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 field:timesheet.report,cost:0
+msgid "#Cost"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Timesheet of last month"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,company_id:0
+#: field:hr_timesheet_sheet.sheet,company_id:0 view:timesheet.report:0
+#: field:timesheet.report,company_id:0
+msgid "Company"
+msgstr "Фирма"
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:hr_timesheet_sheet.sheet:0
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_timesheet_report
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_timesheet_sheet_sheet
+#: model:ir.model,name:hr_timesheet_sheet.model_timesheet_report
+#: model:process.node,name:hr_timesheet_sheet.process_node_timesheet0
+#: view:timesheet.report:0
+msgid "Timesheet"
+msgstr "Работни Часови"
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Set to Draft"
+msgstr "Сетирај на Драфт"
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,date_to:0 field:timesheet.report,date_to:0
+msgid "Date to"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_invoiceonwork0
+msgid "Based on the timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Group by day of date"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:615
+#, python-format
+msgid "You cannot modify an entry in a confirmed timesheet!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition.action,name:hr_timesheet_sheet.process_transition_action_validatetimesheet0
+msgid "Validate"
+msgstr "Потврди"
+
+#. module: hr_timesheet_sheet
+#: selection:hr_timesheet_sheet.sheet,state:0
+msgid "Approved"
+msgstr "Одобрено"
+
+#. module: hr_timesheet_sheet
+#: selection:hr_timesheet_sheet.sheet,state_attendance:0
+msgid "Present"
+msgstr "Присутен"
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0
+msgid "Total Cost"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:263
+#, python-format
+msgid ""
+"In order to create a timesheet for this employee, you must assign the "
+"employee to an analytic journal!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+#: model:process.transition.action,name:hr_timesheet_sheet.process_transition_action_refusetimesheet0
+msgid "Refuse"
+msgstr "Одбиј"
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:619
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:639
+#, python-format
+msgid ""
+"You cannot enter an attendance date outside the current timesheet dates!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,help:hr_timesheet_sheet.action_hr_timesheet_current_open
+msgid ""
+"My Timesheet opens your timesheet so that you can book your activities into "
+"the system. From the same form, you can register your attendances (Sign "
+"In/Out) and describe the working hours made on the different projects. At "
+"the end of the period defined in the company, the timesheet is confirmed by "
+"the user and can be validated by his manager. If required, as defined on the "
+"project, you can generate the invoices based on the timesheet."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet.day:0
+msgid "Total Difference"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid " Month-1 "
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "My Departments Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_timesheet_sheet_sheet_by_day
+msgid "Timesheet by Day"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet.account,name:0
+msgid "Project / Analytic Account"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,name:hr_timesheet_sheet.process_transition_validatetimesheet0
+msgid "Validation"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:274
+#, python-format
+msgid "Warning !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_attendance0
+msgid "Employee's timesheet entry"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,account_id:0
+#: view:timesheet.report:0 field:timesheet.report,account_id:0
+msgid "Analytic Account"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:timesheet.report,nbr:0
+msgid "#Nbr"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,date_from:0
+#: field:timesheet.report,date_from:0
+msgid "Date from"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0
+msgid " Month "
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_employee_2_hr_timesheet
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_timesheet_sheet_form
+#: model:ir.ui.menu,name:hr_timesheet_sheet.menu_act_hr_timesheet_sheet_form
+#: view:res.company:0
+msgid "Timesheets"
+msgstr "Работни часови"
+
+#. module: hr_timesheet_sheet
+#: model:process.node,name:hr_timesheet_sheet.process_node_confirmedtimesheet0
+#: view:timesheet.report:0 selection:timesheet.report,state:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet.day,total_attendance:0
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_attendance
+#: model:process.node,name:hr_timesheet_sheet.process_node_attendance0
+msgid "Attendance"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition.action,name:hr_timesheet_sheet.process_transition_action_draftconfirmtimesheet0
+msgid "Confirm"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,timesheet_ids:0
+msgid "Timesheet lines"
+msgstr "Редови на работни часови"
+
+#. module: hr_timesheet_sheet
+#: constraint:res.company:0
+msgid "Error! You can not create recursive companies."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,state:0 view:timesheet.report:0
+#: field:timesheet.report,state:0
+msgid "State"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_confirmedtimesheet0
+msgid "State is 'confirmed'."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,employee_id:0
+msgid "Employee"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr_timesheet_sheet.sheet,state:0
+#: selection:timesheet.report,state:0
+msgid "New"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.action_week_attendance_graph
+msgid "My Total Attendances By Week"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:241
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:246
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:248
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:250
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:257
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:259
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:261
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:263
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:318
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:548
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:615
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:646
+#: code:addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py:38
+#, python-format
+msgid "Error !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet.account,total:0
+msgid "Total Time"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_timesheet_sheet_sheet_2_hr_analytic_timesheet
+msgid "Timesheet Lines"
+msgstr "Редови на работни часови"
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0
+msgid "Hours"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Group by month of date"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: constraint:hr.attendance:0
+msgid "Error: Sign in (resp. Sign out) must follow Sign out (resp. Sign in)"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:455
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:457
+#, python-format
+msgid "Invalid action !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,note:hr_timesheet_sheet.process_transition_validatetimesheet0
+msgid "The project manager validates the timesheets."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:res.company:0
+msgid "Configuration"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,name:hr_timesheet_sheet.process_node_workontask0
+msgid "Work on Task"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Daily"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 field:timesheet.report,quantity:0
+msgid "#Quantity"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,total_timesheet:0
+#: field:hr_timesheet_sheet.sheet,total_timesheet_day:0
+#: view:hr_timesheet_sheet.sheet.day:0
+#: field:hr_timesheet_sheet.sheet.day,total_timesheet:0
+msgid "Total Timesheet"
+msgstr "Вкупно работни часови"
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Available Attendance"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Sign In"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 field:timesheet.report,total_timesheet:0
+msgid "#Total Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_timesheet_current_open
+msgid "hr.timesheet.current.open"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Go to:"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:248
+#, python-format
+msgid ""
+"In order to create a timesheet for this employee, you must link the employee "
+"to a product, like 'Consultant'!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.current.open:0
+msgid "It will open your current timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:241
+#, python-format
+msgid "You cannot duplicate a timesheet!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,month:0
+#: selection:res.company,timesheet_range:0 view:timesheet.report:0
+#: field:timesheet.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 field:timesheet.report,total_diff:0
+msgid "#Total Diff"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "In Draft"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:261
+#, python-format
+msgid ""
+"In order to create a timesheet for this employee, you must link the employee "
+"to a product!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,name:hr_timesheet_sheet.process_transition_attendancetimesheet0
+msgid "Sign in/out"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr_timesheet_sheet.sheet,state:0
+msgid "Waiting Approval"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,name:hr_timesheet_sheet.process_transition_invoiceontimesheet0
+msgid "Billing"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,note:hr_timesheet_sheet.process_transition_timesheetdraft0
+msgid ""
+"The timesheet line represents the time spent by the employee on a specific "
+"service provided."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: constraint:hr_timesheet_sheet.sheet:0
+msgid "You must select a Current date which is in the timesheet dates !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,name:0
+msgid "Note"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,help:hr_timesheet_sheet.action_hr_timesheet_report_stat_all
+msgid ""
+"This report performs analysis on timesheets created by your human resources "
+"in the system. It allows you to have a full overview of entries done by "
+"your employees. You can group them by specific selection criteria thanks to "
+"the search tool."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 selection:timesheet.report,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:res.company,timesheet_max_difference:0
+msgid "Timesheet allowed difference(Hours)"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,note:hr_timesheet_sheet.process_transition_invoiceontimesheet0
+msgid "The invoice is created based on the timesheet."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,name:hr_timesheet_sheet.process_node_drafttimesheetsheet0
+msgid "Draft Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:res.company,timesheet_range:0
+msgid "Week"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Approve"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,state_attendance:0
+msgid "Current Status"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:646
+#, python-format
+msgid "You cannot modify an entry in a confirmed timesheet !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_timesheet_sheet_sheet_account
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_timesheet_sheet_sheet_day
+msgid "Timesheets by Period"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,user_id:0
+#: field:hr_timesheet_sheet.sheet,user_id:0 view:timesheet.report:0
+#: field:timesheet.report,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_timesheet_sheet_sheet_by_account
+msgid "Timesheet by Account"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr.timesheet.report,date:0 field:hr_timesheet_sheet.sheet.day,name:0
+msgid "Date"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:res.company,timesheet_range:0
+msgid "Timesheet range"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:548
+#, python-format
+msgid "You can not modify an entry in a confirmed timesheet !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:board.board:0
+msgid "My Total Attendance By Week"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:259
+#, python-format
+msgid ""
+"You cannot have 2 timesheets that overlaps!\n"
+"You should use the menu 'My Timesheet' to avoid this problem."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,help:hr_timesheet_sheet.act_hr_timesheet_sheet_form
+msgid ""
+"Check your timesheets for a specific period. You can also encode time spent "
+"on a project (i.e. an analytic account) thus generating costs in the "
+"analytic account concerned."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:237
+#, python-format
+msgid ""
+"The timesheet cannot be validated as it does not contain an equal number of "
+"sign ins and sign outs!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,note:hr_timesheet_sheet.process_transition_attendancetimesheet0
+msgid "The employee signs in and signs out."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.model,name:hr_timesheet_sheet.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Summary"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: constraint:hr_timesheet_sheet.sheet:0
+msgid ""
+"You cannot have 2 timesheets that overlaps !\n"
+"Please use the menu 'My Current Timesheet' to avoid this problem."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Unvalidated Timesheets"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:457
+#, python-format
+msgid "You cannot delete a timesheet which have attendance entries!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr.timesheet.report,quantity:0
+msgid "Quantity"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:455
+#, python-format
+msgid "You cannot delete a timesheet which is already confirmed!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,general_account_id:0
+#: view:timesheet.report:0 field:timesheet.report,general_account_id:0
+msgid "General Account"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: help:res.company,timesheet_range:0
+msgid "Periodicity on which you validate your timesheets."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet.account:0
+msgid "Search Account"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: help:res.company,timesheet_max_difference:0
+msgid ""
+"Allowed difference in hours between the sign in/out and the timesheet "
+"computation for one sheet. Set this to 0 if you do not want any control."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0 field:hr_timesheet_sheet.sheet,period_ids:0
+#: view:hr_timesheet_sheet.sheet.day:0
+msgid "Period"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,day:0
+#: selection:res.company,timesheet_range:0 view:timesheet.report:0
+#: field:timesheet.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.current.open:0
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.action_hr_timesheet_current_open
+#: model:ir.actions.server,name:hr_timesheet_sheet.ir_actions_server_timsheet_sheet
+#: model:ir.ui.menu,name:hr_timesheet_sheet.menu_act_hr_timesheet_sheet_form_my_current
+msgid "My Current Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 selection:timesheet.report,state:0
+msgid "Done"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_drafttimesheetsheet0
+msgid "State is 'draft'."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: constraint:hr.analytic.timesheet:0
+msgid "You cannot modify an entry in a Confirmed/Done timesheet !."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.current.open:0
+msgid "Cancel"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,name:hr_timesheet_sheet.process_node_validatedtimesheet0
+msgid "Validated"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,name:hr_timesheet_sheet.process_node_invoiceonwork0
+msgid "Invoice on Work"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Timesheet in current month"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet.account:0
+msgid "Timesheet by Accounts"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py:51
+#, python-format
+msgid "Open Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 view:timesheet.report:0
+msgid "Group by year of date"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_validatedtimesheet0
+msgid "State is 'validated'."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: help:hr_timesheet_sheet.sheet,state:0
+msgid ""
+" * The 'Draft' state is used when a user is encoding a new and unconfirmed "
+"timesheet. \n"
+"* The 'Confirmed' state is used for to confirm the timesheet by user. "
+" \n"
+"* The 'Done' state is used when users timesheet is accepted by his/her "
+"senior."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.action_hr_timesheet_report_stat_all
+#: model:ir.ui.menu,name:hr_timesheet_sheet.menu_hr_timesheet_report_all
+msgid "Timesheet Analysis"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Search Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Confirmed Timesheets"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.model,name:hr_timesheet_sheet.model_hr_analytic_timesheet
+msgid "Timesheet Line"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,product_id:0
+#: view:timesheet.report:0 field:timesheet.report,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+#: field:hr_timesheet_sheet.sheet,attendances_ids:0
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_timesheet_sheet_sheet_2_hr_attendance
+msgid "Attendances"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr.timesheet.report,name:0 field:timesheet.report,name:0
+msgid "Description"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,note:hr_timesheet_sheet.process_transition_confirmtimesheet0
+msgid "The employee periodically confirms his own timesheets."
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_workontask0
+msgid "Defines the work summary of task"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Sign Out"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,note:hr_timesheet_sheet.process_transition_tasktimesheet0
+msgid "Moves task entry into the timesheet line"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet.day:0
+msgid "Total Attendances"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:ir.actions.act_window,name:hr_timesheet_sheet.action_timesheet_report_stat_all
+#: model:ir.ui.menu,name:hr_timesheet_sheet.menu_timesheet_report_all
+msgid "Timesheet Sheet Analysis"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,total_difference:0
+#: field:hr_timesheet_sheet.sheet,total_difference_day:0
+#: field:hr_timesheet_sheet.sheet.day,total_difference:0
+msgid "Difference"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr_timesheet_sheet.sheet,state_attendance:0
+msgid "Absent"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: sql_constraint:res.company:0
+msgid "The company name must be unique !"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Employees"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.node,note:hr_timesheet_sheet.process_node_timesheet0
+msgid "Information of time spent on a service"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: selection:hr.timesheet.report,month:0 selection:timesheet.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.transition,name:hr_timesheet_sheet.process_transition_confirmtimesheet0
+msgid "Confirmation"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet.account,invoice_rate:0
+msgid "Invoice rate"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:619
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:639
+#, python-format
+msgid "UserError"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:250
+#, python-format
+msgid ""
+"In order to create a timesheet for this employee, you must assign the "
+"employee to an analytic journal, like 'Timesheet'!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:318
+#, python-format
+msgid "You cannot sign in/sign out from an other date than today"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "Submit to Manager"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,account_ids:0
+msgid "Analytic accounts"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 field:timesheet.report,to_invoice:0
+msgid "Type of Invoicing"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:246
+#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:257
+#, python-format
+msgid ""
+"In order to create a timesheet for this employee, you must assign it to a "
+"user!"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:timesheet.report:0 field:timesheet.report,total_attendance:0
+msgid "#Total Attendance"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr.timesheet.report,cost:0
+msgid "Cost"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr_timesheet_sheet.sheet,date_current:0
+#: field:timesheet.report,date_current:0
+msgid "Current date"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: model:process.process,name:hr_timesheet_sheet.process_process_hrtimesheetprocess0
+msgid "Hr Timesheet"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.report:0 field:hr.timesheet.report,year:0
+#: view:timesheet.report:0 field:timesheet.report,year:0
+msgid "Year"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr.timesheet.current.open:0 selection:hr_timesheet_sheet.sheet,state:0
+msgid "Open"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet:0
+msgid "To Approve"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: view:hr_timesheet_sheet.sheet.account:0
+msgid "Total"
+msgstr ""
+
+#. module: hr_timesheet_sheet
+#: field:hr.timesheet.report,journal_id:0
+msgid "Journal"
+msgstr ""
+
+#~ msgid "My Timesheet"
+#~ msgstr "Мои работни часови"
diff --git a/addons/l10n_mx/i18n/es_MX.po b/addons/l10n_mx/i18n/es_MX.po
index e9822e23498..eec525b5f53 100644
--- a/addons/l10n_mx/i18n/es_MX.po
+++ b/addons/l10n_mx/i18n/es_MX.po
@@ -1,28 +1,41 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR , 2011.
+# FIRST AUTHOR , 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:07+0000\n"
-"PO-Revision-Date: 2011-02-15 15:37+0000\n"
+"POT-Creation-Date: 2011-12-23 09:56+0000\n"
+"PO-Revision-Date: 2012-10-22 22:58+0000\n"
"Last-Translator: FULL NAME \n"
-"Language-Team: Spanish \n"
+"Language-Team: Spanish (Mexico) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:58+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2012-10-23 04:48+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
#. module: l10n_mx
-#: model:ir.module.module,description:l10n_mx.module_meta_information
-msgid ""
-"This is the module to manage the accounting chart for Mexico in Open ERP."
-msgstr ""
-"Este es el módulo para gestionar el plan contable para Méjico en Open ERP."
+#: model:account.account.type,name:l10n_mx.account_type_receivable
+msgid "Receivable"
+msgstr "Por cobrar"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_equity
+msgid "Equity"
+msgstr "Capital"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_tax
+msgid "Tax"
+msgstr "Impuesto"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_cash
+msgid "Cash"
+msgstr "Efectivo"
#. module: l10n_mx
#: model:ir.actions.todo,note:l10n_mx.config_call_account_template_mx_chart
@@ -35,16 +48,28 @@ msgid ""
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
"Chart of Accounts from a Chart Template."
msgstr ""
-"Generar Plan Contable a partir de una plantilla de Plan. Se le preguntará "
-"por el nombre de la compañía, la plantilla de plan contable a seguir, el no. "
-"de dígitos para generar el código de sus cuentas y la cuenta bancaria, la "
-"divisa para crear Diarios. Por lo tanto, la copia exacta de la plantilla de "
-"plan contable será generada.\n"
-"Este es el mismo asistente que se ejecuta desde Gestión "
-"Financiera/Configuración/Contabilidad Financiera/Contabilidad "
-"Financiera/Generar Plan Contable a partir de una Plantilla de Plan."
#. module: l10n_mx
-#: model:ir.module.module,shortdesc:l10n_mx.module_meta_information
-msgid "Mexico - Chart of Account"
-msgstr "Méjico - Plan Contable"
+#: model:account.account.type,name:l10n_mx.account_type_payable
+msgid "Payable"
+msgstr "A pagar"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_asset
+msgid "Asset"
+msgstr "Activo"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_income
+msgid "Income"
+msgstr "Ingreso"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_expense
+msgid "Expense"
+msgstr "Gasto"
+
+#. module: l10n_mx
+#: model:account.account.type,name:l10n_mx.account_type_view
+msgid "View"
+msgstr "Vista"
diff --git a/addons/sale/i18n/lt.po b/addons/sale/i18n/lt.po
index 46158f9bbde..bf590d7ca7f 100644
--- a/addons/sale/i18n/lt.po
+++ b/addons/sale/i18n/lt.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev_rc3\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-09-20 07:29+0000\n"
-"PO-Revision-Date: 2010-12-14 21:49+0000\n"
-"Last-Translator: qdp (OpenERP) \n"
+"PO-Revision-Date: 2012-10-22 17:52+0000\n"
+"Last-Translator: ignas \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-10-19 05:12+0000\n"
-"X-Generator: Launchpad (build 16165)\n"
+"X-Launchpad-Export-Date: 2012-10-23 04:48+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:215
@@ -160,14 +160,14 @@ msgstr ""
#. module: sale
#: field:sale.order,date_confirm:0
msgid "Confirmation Date"
-msgstr ""
+msgstr "Patvirtinimo data"
#. module: sale
#: view:sale.order:0
#: view:sale.order.line:0
#: view:sale.report:0
msgid "Group By..."
-msgstr ""
+msgstr "Grupuoti pagal..."
#. module: sale
#: view:sale.order.line:0
@@ -322,7 +322,7 @@ msgstr ""
#. module: sale
#: help:sale.order,amount_total:0
msgid "The total amount."
-msgstr ""
+msgstr "Bendra suma."
#. module: sale
#: view:sale.report:0
@@ -652,7 +652,7 @@ msgstr ""
#: view:board.board:0
#: model:ir.actions.act_window,name:sale.action_turnover_by_month
msgid "Monthly Turnover"
-msgstr ""
+msgstr "Mėnesinė apyvarta"
#. module: sale
#: view:sale.report:0
@@ -716,7 +716,7 @@ msgstr "Bendra kaina"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree
msgid "Old Quotations"
-msgstr ""
+msgstr "Seni pasiūlymai"
#. module: sale
#: help:sale.config.settings,module_sale_journal:0
@@ -816,7 +816,7 @@ msgstr "Iš viso :"
#. module: sale
#: view:sale.report:0
msgid "My Sales"
-msgstr ""
+msgstr "Mano pardavimai"
#. module: sale
#: code:addons/sale/sale.py:253
@@ -1233,7 +1233,7 @@ msgstr "Grupuoti sąskaitas faktūras"
#. module: sale
#: help:sale.order,amount_tax:0
msgid "The tax amount."
-msgstr ""
+msgstr "Mokesčiai"
#. module: sale
#: view:sale.order:0
@@ -1252,7 +1252,7 @@ msgstr ""
#. module: sale
#: selection:sale.report,month:0
msgid "August"
-msgstr ""
+msgstr "Rugpjūtis"
#. module: sale
#: view:sale.order:0
@@ -1282,7 +1282,7 @@ msgstr ""
#. module: sale
#: selection:sale.report,month:0
msgid "June"
-msgstr ""
+msgstr "Birželis"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_email_templates
@@ -1559,7 +1559,7 @@ msgstr ""
#: view:sale.report:0
#: field:sale.report,day:0
msgid "Day"
-msgstr ""
+msgstr "Diena"
#. module: sale
#: view:sale.order:0
@@ -1830,7 +1830,7 @@ msgstr ""
#. module: sale
#: view:sale.order:0
msgid "Other Information"
-msgstr ""
+msgstr "Kita informacija"
#. module: sale
#: view:res.partner:0
diff --git a/addons/web/i18n/it.po b/addons/web/i18n/it.po
index cd25e1fb9d6..7df8f4c27bb 100644
--- a/addons/web/i18n/it.po
+++ b/addons/web/i18n/it.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2012-07-02 09:06+0200\n"
-"PO-Revision-Date: 2012-02-16 21:49+0000\n"
-"Last-Translator: Davide Corio - agilebg.com \n"
+"PO-Revision-Date: 2012-10-22 14:36+0000\n"
+"Last-Translator: Marius Marolla \n"
"Language-Team: Italian \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-10-21 05:02+0000\n"
-"X-Generator: Launchpad (build 16165)\n"
+"X-Launchpad-Export-Date: 2012-10-23 05:05+0000\n"
+"X-Generator: Launchpad (build 16179)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:176
@@ -129,56 +129,56 @@ msgstr "OpenERP - Unsupported/Community Version"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:619
msgid "less than a minute ago"
-msgstr ""
+msgstr "meno di un minuto fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:620
msgid "about a minute ago"
-msgstr ""
+msgstr "circa un minuto fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:621
#, python-format
msgid "%d minutes ago"
-msgstr ""
+msgstr "%d minuti fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:622
msgid "about an hour ago"
-msgstr ""
+msgstr "circa un'ora fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:623
#, python-format
msgid "%d hours ago"
-msgstr ""
+msgstr "%d ore fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:624
msgid "a day ago"
-msgstr ""
+msgstr "un giorno fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:625
#, python-format
msgid "%d days ago"
-msgstr ""
+msgstr "%d giorni fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:626
msgid "about a month ago"
-msgstr ""
+msgstr "circa un mese fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:627
#, python-format
msgid "%d months ago"
-msgstr ""
+msgstr "%d mesi fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:628
msgid "about a year ago"
-msgstr ""
+msgstr "circa un anno fa"
#. openerp-web
#: addons/web/static/src/js/coresetup.js:629
From 5d7f760a05d3feee54bddc53666daf499ed7edbd Mon Sep 17 00:00:00 2001
From: "olt@tinyerp.com" <>
Date: Tue, 23 Oct 2012 09:23:17 +0200
Subject: [PATCH 142/150] [FIX] anonymization: add an object to handle
migration issues
bzr revid: olt@tinyerp.com-20121023072317-zkv1rbf8pt0qnh3g
---
addons/anonymization/anonymization.py | 75 ++++++++++++++++-----
addons/anonymization/anonymization_view.xml | 1 -
2 files changed, 58 insertions(+), 18 deletions(-)
diff --git a/addons/anonymization/anonymization.py b/addons/anonymization/anonymization.py
index 8834645c460..2326a4184ae 100644
--- a/addons/anonymization/anonymization.py
+++ b/addons/anonymization/anonymization.py
@@ -32,13 +32,23 @@ import datetime
from osv import fields, osv
from tools.translate import _
+from itertools import groupby
+from operator import itemgetter
+
FIELD_STATES = [('clear', 'Clear'), ('anonymized', 'Anonymized'), ('not_existing', 'Not Existing')]
ANONYMIZATION_STATES = FIELD_STATES + [('unstable', 'Unstable')]
+WIZARD_ANONYMIZATION_STATES = [('clear', 'Clear'), ('anonymized', 'Anonymized'), ('unstable', 'Unstable')]
ANONYMIZATION_HISTORY_STATE = [('started', 'Started'), ('done', 'Done'), ('in_exception', 'Exception occured')]
ANONYMIZATION_DIRECTION = [('clear -> anonymized', 'clear -> anonymized'), ('anonymized -> clear', 'anonymized -> clear')]
+def group(lst, cols):
+ if isinstance(cols, basestring):
+ cols = [cols]
+ return dict((k, [v for v in itr]) for k, itr in groupby(sorted(lst, key=itemgetter(*cols)), itemgetter(*cols)))
+
+
class ir_model_fields_anonymization(osv.osv):
_name = 'ir.model.fields.anonymization'
_rec_name = 'field_id'
@@ -207,8 +217,6 @@ class ir_model_fields_anonymization(osv.osv):
'state': lambda *a: 'clear',
}
-ir_model_fields_anonymization()
-
class ir_model_fields_anonymization_history(osv.osv):
_name = 'ir.model.fields.anonymization.history'
@@ -223,8 +231,6 @@ class ir_model_fields_anonymization_history(osv.osv):
'filepath': fields.char(string='File path', size=256, readonly=True),
}
-ir_model_fields_anonymization_history()
-
class ir_model_fields_anonymize_wizard(osv.osv_memory):
_name = 'ir.model.fields.anonymize.wizard'
@@ -250,8 +256,8 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
'name': fields.char(size=64, string='File Name'),
'summary': fields.function(_get_summary, type='text', string='Summary'),
'file_export': fields.binary(string='Export'),
- 'file_import': fields.binary(string='Import'),
- 'state': fields.function(_get_state, string='Status', type='selection', selection=ANONYMIZATION_STATES, readonly=False),
+ 'file_import': fields.binary(string='Import', help="This is the file created by the anonymization process. It should have the '.pickle' extention."),
+ 'state': fields.function(_get_state, string='Status', type='selection', selection=WIZARD_ANONYMIZATION_STATES, readonly=False),
'msg': fields.text(string='Message'),
}
@@ -319,6 +325,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
# clicked in the menu and the fields are already anonymized
placeholder.addnext(etree.Element('newline'))
placeholder.addnext(etree.Element('field', {'name': 'file_import', 'required': "1"}))
+ placeholder.addnext(etree.Element('label', {'string': 'Anonymization file'}))
eview.remove(placeholder)
elif step == 'just_anonymized':
# we just ran the anonymization process, we need the file export field
@@ -500,7 +507,6 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
def reverse_anonymize_database(self, cr, uid, ids, context=None):
"""Set the 'clear' state to defined fields"""
-
ir_model_fields_anonymization_model = self.pool.get('ir.model.fields.anonymization')
anonymization_history_model = self.pool.get('ir.model.fields.anonymization.history')
@@ -524,23 +530,46 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
wizards = self.browse(cr, uid, ids, context=context)
for wizard in wizards:
if not wizard.file_import:
- msg = "It is not possible to reverse the anonymization process without supplying anonymization export file."
+ msg = "It is not possible to reverse the anonymization process without supplying the anonymization export file."
self._raise_after_history_update(cr, uid, history_id, 'Error !', msg)
# reverse the anonymization:
# load the pickle file content into a data structure:
data = pickle.loads(base64.decodestring(wizard.file_import))
+ migration_fix_obj = self.pool.get('ir.model.fields.anonymization.migration.fix')
+ fix_ids = migration_fix_obj.search(cr, uid, [('target_version', '=', '7.0')])
+ fixes = migration_fix_obj.read(cr, uid, fix_ids, ['model_name', 'field_name', 'query', 'query_type', 'sequence'])
+ fixes = group(fixes, ('model_name', 'field_name'))
+
for line in data:
table_name = self.pool.get(line['model_id'])._table
- sql = "update %(table)s set %(field)s = %%(value)s where id = %%(id)s" % {
- 'table': table_name,
- 'field': line['field_id'],
- }
- cr.execute(sql, {
- 'value': line['value'],
- 'id': line['id']
- })
+
+ # check if custom sql exists:
+ key = (line['model_id'], line['field_id'])
+ custom_updates = fixes.get(key)
+ if custom_updates:
+ custom_updates.sort(itemgetter('sequence'))
+ queries = [(record['query'], record['query_type']) for record in custom_updates if record['query_type']]
+ else:
+ queries = [("update %(table)s set %(field)s = %%(value)s where id = %%(id)s" % {
+ 'table': table_name,
+ 'field': line['field_id'],
+ }, 'sql')]
+
+ for query in queries:
+ if query[1] == 'sql':
+ sql = query[0]
+ cr.execute(sql, {
+ 'value': line['value'],
+ 'id': line['id']
+ })
+ elif query[1] == 'python':
+ raw_code = query[0]
+ code = raw_code % line
+ eval(code)
+ else:
+ raise Exception("Unknown query type '%s'. Valid types are: sql, python." % (query['query_type'], ))
# update the anonymization fields:
ir_model_fields_anonymization_model = self.pool.get('ir.model.fields.anonymization')
@@ -589,7 +618,19 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
res = None
return res
-ir_model_fields_anonymize_wizard()
+class ir_model_fields_anonymization_migration_fix(osv.osv):
+ _name = 'ir.model.fields.anonymization.migration.fix'
+ _order = "sequence"
+
+ _columns = {
+ 'target_version': fields.char('Target Version'),
+ 'model_name': fields.char('Model'),
+ 'field_name': fields.char('Field'),
+ 'query': fields.text('Query'),
+ 'query_type': fields.selection(string='Query', selection=[('sql', 'sql'), ('python', 'python')]),
+ 'sequence': fields.integer('Sequence'),
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/anonymization/anonymization_view.xml b/addons/anonymization/anonymization_view.xml
index 1a6c6c355d5..fca112eb266 100644
--- a/addons/anonymization/anonymization_view.xml
+++ b/addons/anonymization/anonymization_view.xml
@@ -14,7 +14,6 @@
From a53941b1652f05f3759b88e0b7a02136ce50e850 Mon Sep 17 00:00:00 2001
From: "vta vta@openerp.com" <>
Date: Tue, 23 Oct 2012 09:50:35 +0200
Subject: [PATCH 143/150] [FIX] Fixed CallbackEnabled issues in POS.
bzr revid: vta@openerp.com-20121023075035-wx3awh0sdeeqa7t3
---
addons/point_of_sale/static/src/js/screens.js | 3 ++-
addons/point_of_sale/static/src/js/widgets.js | 16 ++++++++--------
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index 1ad03c5ead1..bd174b12fda 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -938,10 +938,11 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
this.renderElement();
},
addPaymentLine: function(newPaymentLine) {
+ var self = this;
var x = new module.PaymentlineWidget(null, {
payment_line: newPaymentLine
});
- x.on_delete.add(_.bind(this.deleteLine, this, x));
+ x.on('delete_payment_line', self, self.deleteLine);
x.appendTo(this.$('#paymentlines'));
},
renderElement: function() {
diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js
index 3f0e439cfba..28ab79c65b2 100644
--- a/addons/point_of_sale/static/src/js/widgets.js
+++ b/addons/point_of_sale/static/src/js/widgets.js
@@ -142,7 +142,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
},
click_handler: function() {
this.order.selectLine(this.model);
- this.on_selected();
+ this.trigger('order_line_selected');
},
renderElement: function() {
this._super();
@@ -153,10 +153,8 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
},
refresh: function(){
this.renderElement();
- this.on_refresh();
+ this.trigger('order_line_refreshed');
},
- on_selected: function() {},
- on_refresh: function(){},
});
module.OrderWidget = module.PosBaseWidget.extend({
@@ -230,8 +228,8 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
model: orderLine,
order: this.pos.get('selectedOrder'),
});
- line.on_selected.add(_.bind(this.update_numpad, this));
- line.on_refresh.add(_.bind(this.update_summary, this));
+ line.on('order_line_selected', self, self.update_numpad);
+ line.on('order_line_refreshed', self, self.update_summary);
line.appendTo($content);
}, this));
this.update_numpad();
@@ -303,7 +301,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.payment_line = options.payment_line;
this.payment_line.bind('change', this.changedAmount, this);
},
- on_delete: function() {},
changeAmount: function(event) {
var newAmount;
newAmount = event.currentTarget.value;
@@ -317,10 +314,13 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.renderElement();
},
renderElement: function() {
+ var self = this;
this.name = this.payment_line.get_cashregister().get('journal_id')[1];
this._super();
this.$('input').keyup(_.bind(this.changeAmount, this));
- this.$('.delete-payment-line').click(this.on_delete);
+ this.$('.delete-payment-line').click(function() {
+ self.trigger('delete_payment_line');
+ });
},
});
From b37b348107e48f3eb7e23a95af50217d1ed25d79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Tue, 23 Oct 2012 11:03:38 +0200
Subject: [PATCH 144/150] [OUCH] Removed a pdb.
bzr revid: tde@openerp.com-20121023090338-2vefi0yee077q2ne
---
addons/mail/tests/test_mail.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py
index 55f50fd720c..9fdabca315c 100644
--- a/addons/mail/tests/test_mail.py
+++ b/addons/mail/tests/test_mail.py
@@ -635,9 +635,9 @@ class test_mail(TestMailMockups):
# TDE note: temp various asserts because of the random bug about msg1.child_ids
msg_ids = self.mail_message.search(cr, uid, [('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], limit=1)
new_msg = self.mail_message.browse(cr, uid, msg_ids[0])
- if new_msg.parent_id.id != msg1.id:
- import pdb
- pdb.set_trace()
+ # if new_msg.parent_id.id != msg1.id:
+ # import pdb
+ # pdb.set_trace()
self.assertEqual(new_msg.parent_id, msg1, 'Newly processed mail_message (%d) should have msg1 as parent (msg2 is %d)' % (new_msg.id, msg2.id))
# 2. References header
From 5e839a72de59497140a98e489acbd19cfc978233 Mon Sep 17 00:00:00 2001
From: Christophe Matthieu
Date: Tue, 23 Oct 2012 13:38:42 +0200
Subject: [PATCH 145/150] [IMP] mail: convert parent_id to ancestor_id in js
side
bzr revid: chm@openerp.com-20121023113842-0c9rh3dvr205p7uz
---
addons/mail/static/src/js/mail.js | 105 ++++++++++++++++--------------
1 file changed, 55 insertions(+), 50 deletions(-)
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index 025e5d43b9a..4cf17218a4c 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -342,7 +342,7 @@ openerp.mail = function(session) {
'default_model': this.context.default_model,
'default_res_id': this.context.default_res_id,
'default_content_subtype': 'html',
- 'default_parent_id': this.id,
+ 'default_ancestor_id': this.id,
'default_body': mail.ChatterUtils.get_text2html(this.$render_expandable ? (this.$render_expandable.find('textarea').val() || '') : ''),
'default_attachment_ids': attachments,
'default_partner_ids': partner_ids
@@ -390,13 +390,12 @@ openerp.mail = function(session) {
false,
'comment',
'mail.mt_comment',
- this.context.default_parent_id,
+ this.context.default_ancestor_id,
attachments,
this.parent_thread.context
]).then(function(records){
self.parent_thread.switch_new_message(records);
self.on_cancel();
- self.do_show_compact();
//session.web.unblockUI();
});
return true;
@@ -483,12 +482,12 @@ openerp.mail = function(session) {
this.context = _.extend({
default_model: 'mail.thread',
default_res_id: 0,
- default_parent_id: false }, options.context || {});
+ default_ancestor_id: false }, options.context || {});
// data of this expandable message
this.id = datasets.id || -1,
this.model = datasets.model || false,
- this.parent_id = datasets.parent_id || false,
+ this.ancestor_id = datasets.ancestor_id || false,
this.nb_messages = datasets.nb_messages || 0,
this.thread_level = datasets.thread_level || 0,
this.type = 'expandable',
@@ -567,10 +566,10 @@ openerp.mail = function(session) {
* - record.attachment_ids[].url: url of each attachmentThe
* thread view :
* - root thread
- * - - sub message (parent_id = root message)
+ * - - sub message (ancestor_id = root message)
* - - - sub thread
* - - - - sub sub message (parent id = sub thread)
- * - - sub message (parent_id = root message)
+ * - - sub message (ancestor_id = root message)
* - - - sub thread
*/
mail.ThreadMessage = session.web.Widget.extend({
@@ -598,7 +597,7 @@ openerp.mail = function(session) {
// data of this message
this.id = datasets.id || -1,
this.model = datasets.model || false,
- this.parent_id = datasets.parent_id || false,
+ this.ancestor_id = datasets.ancestor_id || false,
this.res_id = datasets.res_id || false,
this.type = datasets.type || false,
this.is_author = datasets.is_author || false,
@@ -621,7 +620,7 @@ openerp.mail = function(session) {
this.context = _.extend({
default_model: 'mail.thread',
default_res_id: 0,
- default_parent_id: false }, options.context || {});
+ default_ancestor_id: false }, options.context || {});
// record options
this.options = options.options;
@@ -728,7 +727,7 @@ openerp.mail = function(session) {
'context':{
'default_model': this.model,
'default_res_id': this.res_id,
- 'default_parent_id': this.id
+ 'default_ancestor_id': this.id
},
'options': this.options
}
@@ -898,10 +897,10 @@ openerp.mail = function(session) {
* This widget handles the display of a thread of messages. The
* thread view:
* - root thread
- * - - sub message (parent_id = root message)
+ * - - sub message (ancestor_id = root message)
* - - - sub thread
* - - - - sub sub message (parent id = sub thread)
- * - - sub message (parent_id = root message)
+ * - - sub message (ancestor_id = root message)
* - - - sub thread
*/
mail.Thread = session.web.Widget.extend({
@@ -930,7 +929,7 @@ openerp.mail = function(session) {
this.context = _.extend({
default_model: 'mail.thread',
default_res_id: 0,
- default_parent_id: false }, options.context || {});
+ default_ancestor_id: false }, options.context || {});
this.options = options.options;
this.options._parents = (options.options._parents != undefined ? options.options._parents : []).concat( [this] );
@@ -941,7 +940,7 @@ openerp.mail = function(session) {
// data of this thread
this.id = datasets.id || false,
this.model = datasets.model || false,
- this.parent_id = datasets.parent_id || false,
+ this.ancestor_id = datasets.ancestor_id || false,
this.is_private = datasets.is_private || false,
this.author_id = datasets.author_id || false,
this.thread_level = (datasets.thread_level+1) || 0,
@@ -1048,8 +1047,8 @@ openerp.mail = function(session) {
if(arguments[1]) res.push(this);
if(isNaN(nb_thread_level) || nb_thread_level>0){
_(this.messages).each(function (val, key) {
- if(val.thread){
- res = res.concat( val.thread.get_childs((isNaN(nb_thread_level) ? null : nb_thread_level-1), true) )
+ if(val.thread) {
+ res = res.concat( val.thread.get_childs((isNaN(nb_thread_level) ? undefined : nb_thread_level-1), true) );
}
});
}
@@ -1149,7 +1148,7 @@ openerp.mail = function(session) {
// CHM note : option for sending in flat mode by server
var nb_indented_thread = this.options.display_indented_thread > this.thread_level ? this.options.display_indented_thread - this.thread_level : 0;
- return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded_ids, /*nb_indented_thread,*/ fetch_context, this.context.default_parent_id || undefined]
+ return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded_ids, /*nb_indented_thread,*/ fetch_context, this.context.default_ancestor_id || undefined]
).then(this.proxy('switch_new_message'));
},
@@ -1168,16 +1167,16 @@ openerp.mail = function(session) {
'context': {
'default_model': data.model || self.context.default_model,
'default_res_id': data.res_id || self.context.default_res_id,
- 'default_parent_id': self.id },
+ 'default_ancestor_id': self.id },
});
} else {
- var message = new mail.ThreadMessage(self, _.extend(data, {'thread_level': self.thread_level}), {
+ var message = new mail.ThreadMessage(self, _.extend(data, {'thread_level': data.thread_level ? data.thread_level : self.thread_level}), {
'domain': data.domain,
'context': {
'default_model': data.model,
'default_res_id': data.res_id,
- 'default_parent_id': data.id },
- 'options': self.options
+ 'default_ancestor_id': data.id },
+ 'options': _.extend(self.options, data.options)
});
}
@@ -1205,34 +1204,25 @@ openerp.mail = function(session) {
insert_message: function (message) {
var self=this;
- if(this.show_compose_message &&
- this.options.display_indented_thread >= self.thread_level){
+ if(this.show_compose_message /*&&
+ this.options.display_indented_thread >= self.thread_level*/){
this.ComposeMessage.do_show_compact();
}
this.$('.oe_wall_no_message').remove();
- // insert on hierarchy display => insert in self child
- var thread_messages = self.messages;
- var thread = self;
- if( self.options.display_indented_thread < self.thread_level ) {
- var thread = self.options._parents[self.options.display_indented_thread] || self.options._parents[0];
- var thread_messages = [];
- _(thread.get_childs()).each(function (val, key) { thread_messages.push(val.parent_message); });
- }
-
// check older and newer message for insertion
var parent_newer = false;
var parent_older = false;
if(message.id > 0){
- for(var i in thread_messages){
- if(thread_messages[i].id > message.id){
- if(!parent_newer || parent_newer.id > thread_messages[i].id) {
- parent_newer = thread_messages[i];
+ for(var i in self.messages){
+ if(self.messages[i].id > message.id){
+ if(!parent_newer || parent_newer.id > self.messages[i].id) {
+ parent_newer = self.messages[i];
}
- } else if(thread_messages[i].id > 0 && thread_messages[i].id < message.id) {
- if(!parent_older || parent_older.id < thread_messages[i].id) {
- parent_older = thread_messages[i];
+ } else if(self.messages[i].id > 0 && self.messages[i].id < message.id) {
+ if(!parent_older || parent_older.id < self.messages[i].id) {
+ parent_older = self.messages[i];
}
}
}
@@ -1253,11 +1243,11 @@ openerp.mail = function(session) {
} else if(message.id < 0) {
- message.appendTo(thread.$el);
+ message.appendTo(self.$el);
} else {
- message.prependTo(thread.$el);
+ message.prependTo(self.$el);
}
} else {
if (parent_older) {
@@ -1271,11 +1261,11 @@ openerp.mail = function(session) {
} else if(message.id < 0) {
- message.prependTo(thread.$el);
+ message.prependTo(self.$el);
} else {
- message.appendTo(thread.$el);
+ message.appendTo(self.$el);
}
}
@@ -1285,16 +1275,31 @@ openerp.mail = function(session) {
/**
*get the parent thread of the messages.
- * Each message is send to his parent object for creating the object message.
+ * Each message is send to his parent object (or parent thread flat mode) for creating the object message.
* @param : {Array} datas from calling RPC to "message_read"
*/
switch_new_message: function(records) {
var self=this;
_(records).each(function(record){
- self.browse_thread({
- 'id': record.parent_id,
+ var thread = self.browse_thread({
+ 'id': record.ancestor_id,
'default_return_top_thread':true
- }).create_message_object( record );
+ });
+
+ /*
+ record.thread_level = thread.thread_level;
+ record.options = {'_parents' : thread.options._parents };
+
+ // check for flat mode
+ var nb_level = thread.options.display_indented_thread - thread.thread_level;
+
+ if(nb_level <= 0){
+ var thread = thread.options._parents[ thread.options._parents.length - 1 + nb_level ];
+ }
+ */
+
+
+ thread.create_message_object( record );
});
},
@@ -1324,7 +1329,7 @@ openerp.mail = function(session) {
var msg_up = messages[it-1];
var msg_down = messages[it+1];
- var message_dom = [ '&', ["id","in",[message.id]], ['parent_id', '=', message.parent_id] ];
+ var message_dom = [ ["id", "=", message.id] ];
if ( msg_up && msg_up.type == "expandable" && msg_down && msg_down.type == "expandable") {
// concat two expandable message and add this message to this dom
@@ -1368,7 +1373,7 @@ openerp.mail = function(session) {
var expandable = new mail.ThreadExpandable(this, {
'id': message.id,
'model': message.model,
- 'parent_id': message.parent_id,
+ 'ancestor_id': message.ancestor_id,
'nb_messages': 1,
'thread_level': message.thread_level,
}, {
@@ -1376,7 +1381,7 @@ openerp.mail = function(session) {
'context': {
'default_model': message.model || this.context.default_model,
'default_res_id': message.res_id || this.context.default_res_id,
- 'default_parent_id': this.id },
+ 'default_ancestor_id': this.id },
});
// add object on array and DOM
From 8c8c0dd75325ffae7b2fc70a12a69dd12008bee9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Tue, 23 Oct 2012 13:41:24 +0200
Subject: [PATCH 146/150] [IMP] mail: message_read: improved flat / threaded
domains (using child_of for thread, or only id for flat); improved ancestor
fetching (not using parent_id anymore, because ancestor is the parent message
to display the message thread).
bzr revid: tde@openerp.com-20121023114124-co3ij97tz1c25qa8
---
addons/mail/mail_message.py | 71 ++++++++++++++++++++-----------
addons/mail/static/src/js/mail.js | 2 +-
2 files changed, 47 insertions(+), 26 deletions(-)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 1a650e8f67d..6f6a838533b 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -240,7 +240,7 @@ class mail_message(osv.Model):
'is_author': is_author,
# TDE note: is this useful ? to check
'partner_ids': partner_ids,
- 'parent_id': message['parent_id'] and message['parent_id'][0] or False,
+ 'ancestor_id': False,
'vote_nb': len(message['vote_user_ids']),
'has_voted': has_voted,
'is_private': is_private,
@@ -249,14 +249,26 @@ class mail_message(osv.Model):
}
def _message_read_add_expandables(self, cr, uid, message_list, read_messages,
- message_loaded_ids=[], domain=[], context=None, parent_id=False, limit=None):
- """ Create the expandable message for all parent message read
- this function is used by message_read
+ thread_level=0, message_loaded_ids=[], domain=[], parent_id=False, context=None, limit=None):
+ """ Create expandables for message_read, to load new messages.
+ 1. get the expandable for new threads
+ if display is flat (thread_level == 0):
+ fetch message_ids < min(already displayed ids), because we
+ want a flat display, ordered by id
+ else:
+ fetch message_ids that are not childs of already displayed
+ messages
+ 2. get the expandables for new messages inside threads if display
+ is not flat
+ for each thread header, search for its childs
+ for each hole in the child list based on message displayed,
+ create an expandable
- :param list message_list: list of messages given by message_read to
- which we have to add expandables
+ :param list message_list:list of message structure for the Chatter
+ widget to which expandables are added
:param dict read_messages: dict [id]: read result of the messages to
easily have access to their values, given their ID
+ :return bool: True
"""
def _get_expandable(domain, message_nb, parent_id, id, model):
return {
@@ -268,10 +280,22 @@ class mail_message(osv.Model):
# TDE note: why do we need model sometimes, and sometimes not ???
'model': model,
}
- all_not_loaded_ids = []
- # expandable for not show message
+
+ # all_not_loaded_ids = []
id_list = sorted(read_messages.keys())
- # print 'id_list', id_list
+
+ # 1. get the expandable for new threads
+ if thread_level == 0:
+ exp_domain = domain + [('id', '<', min(message_loaded_ids + id_list))]
+ else:
+ exp_domain = domain + ['!', ('id', 'child_of', message_loaded_ids + id_list)]
+ ids = self.search(cr, uid, exp_domain, context=context, limit=1)
+ if ids:
+ message_list.append(_get_expandable(exp_domain, -1, parent_id, -1, None))
+
+ # 2. get the expandables for new messages inside threads if display is not flat
+ if thread_level == 0:
+ return True
for message_id in id_list:
message = read_messages[message_id]
@@ -289,7 +313,7 @@ class mail_message(osv.Model):
continue
# print 'not_loaded_ids', not_loaded_ids
- all_not_loaded_ids += not_loaded_ids
+ # all_not_loaded_ids += not_loaded_ids
# group childs not read
id_min, id_max, nb = max(not_loaded_ids), 0, 0
for not_loaded_id in not_loaded_ids:
@@ -309,14 +333,9 @@ class mail_message(osv.Model):
exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
message_list.append(_get_expandable(exp_domain, nb, message_id, id_min, message.get('model')))
- message_loaded_ids = list(set(message_loaded_ids + read_messages.keys() + all_not_loaded_ids))
+ # message_loaded_ids = list(set(message_loaded_ids + read_messages.keys() + all_not_loaded_ids))
- # expandable for limit max
- ids = self.search(cr, uid, domain + [('id', 'not in', message_loaded_ids)], context=context, limit=1)
- if ids:
- message_list.append(_get_expandable(domain, -1, parent_id, -1, None))
-
- return message_list
+ return True
def _get_parent(self, cr, uid, message, context=None):
""" Tools method that tries to get the parent of a mail.message. If
@@ -333,14 +352,14 @@ class mail_message(osv.Model):
except (orm.except_orm, osv.except_osv):
return False
- def message_read(self, cr, uid, ids=False, domain=None, message_unload_ids=None, context=None, parent_id=False, limit=None):
+ def message_read(self, cr, uid, ids=False, domain=None, message_unload_ids=None, thread_level=0, context=None, parent_id=False, limit=None):
""" Read messages from mail.message, and get back a list of structured
messages to be displayed as discussion threads. If IDs is set,
fetch these records. Otherwise use the domain to fetch messages.
After having fetch messages, their ancestors will be added to obtain
well formed threads, if uid has access to them.
- After reading the messages, expandables messages are added in the
+ After reading the messages, expandable messages are added in the
message list (see ``_message_read_add_expandables``). It consists
in messages holding the 'read more' data: number of messages to
read, domain to apply.
@@ -355,6 +374,7 @@ class mail_message(osv.Model):
ancestors and expandables
:return list: list of message structure for the Chatter widget
"""
+ assert thread_level in [0, 1], 'message_read() thread_level should be 0 (flat) or 1 (1 level of thread); given %s.' % thread_level
domain = domain if domain is not None else []
message_unload_ids = message_unload_ids if message_unload_ids is not None else []
if message_unload_ids:
@@ -373,16 +393,18 @@ class mail_message(osv.Model):
# TDE FIXME: check access rights on search are implemented for mail.message
# fetch messages according to the domain, add their parents if uid has access to
ids = self.search(cr, uid, domain, context=context, limit=limit)
- # print 'message_read ids', ids
for message in self.read(cr, uid, ids, self._message_read_fields, context=context):
- # if not in tree and not in message_loded list
+ # if not in tree and not in message_loaded list
if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
read_messages[message.get('id')] = message
message_list.append(self._message_get_dict(cr, uid, message, context=context))
- # get the older ancestor the user can read
+ # get the older ancestor the user can read, update its ancestor field
+ if not thread_level:
+ continue
parent = self._get_parent(cr, uid, message, context=context)
while parent and parent.get('id') != parent_id:
+ message_list[-1]['ancestor_id'] = parent.get('id')
message = parent
parent = self._get_parent(cr, uid, message, context=context)
if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
@@ -391,9 +413,8 @@ class mail_message(osv.Model):
# get the child expandable messages for the tree
message_list = sorted(message_list, key=lambda k: k['id'])
- # print 'message_read message_list', message_list
- message_list = self._message_read_add_expandables(cr, uid, message_list, read_messages,
- message_loaded_ids=message_unload_ids, domain=domain, context=context, parent_id=parent_id, limit=limit)
+ self._message_read_add_expandables(cr, uid, message_list, read_messages, thread_level=thread_level,
+ message_loaded_ids=message_unload_ids, domain=domain, parent_id=parent_id, context=context, limit=limit)
# message_list = sorted(message_list, key=lambda k: k['id'])
return message_list
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index 7501eabe104..6d013c1d564 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -1047,7 +1047,7 @@ openerp.mail = function(session) {
fetch_context = replace_context ? replace_context : this.context;
var message_loaded = [this.datasets.id||0].concat( self.options.thread._parents[0].get_child_ids() );
- return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded, fetch_context, this.context.default_parent_id || undefined]
+ return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded, 1, fetch_context, this.context.default_parent_id || undefined]
).then(this.proxy('switch_new_message'));
},
From 4c99b037a6134a47f29eb64c1f501f4316e67f6b Mon Sep 17 00:00:00 2001
From: Christophe Matthieu
Date: Tue, 23 Oct 2012 14:16:47 +0200
Subject: [PATCH 147/150] [IMP] mail: ancestor_id
bzr revid: chm@openerp.com-20121023121647-erx0p6416ufz6ni5
---
addons/mail/static/src/js/mail.js | 16 ++--------------
1 file changed, 2 insertions(+), 14 deletions(-)
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index d4aafa02733..0b8c39aca81 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -1280,25 +1280,12 @@ openerp.mail = function(session) {
*/
switch_new_message: function(records) {
var self=this;
+ console.log(records);
_(records).each(function(record){
var thread = self.browse_thread({
'id': record.ancestor_id,
'default_return_top_thread':true
});
-
- /*
- record.thread_level = thread.thread_level;
- record.options = {'_parents' : thread.options._parents };
-
- // check for flat mode
- var nb_level = thread.options.display_indented_thread - thread.thread_level;
-
- if(nb_level <= 0){
- var thread = thread.options._parents[ thread.options._parents.length - 1 + nb_level ];
- }
- */
-
-
thread.create_message_object( record );
});
},
@@ -1376,6 +1363,7 @@ openerp.mail = function(session) {
'ancestor_id': message.ancestor_id,
'nb_messages': 1,
'thread_level': message.thread_level,
+ 'ancestor_id': message.ancestor_id
}, {
'domain': message_dom,
'context': {
From 7bae2a58fe122f07f9517532354d7e95f3463742 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Tue, 23 Oct 2012 14:28:24 +0200
Subject: [PATCH 148/150] [FIX] mail: message_read: expandable parent_id ->
ancestor_id; ancestor is now correctly set for messages, even when the parent
is not added to the message_list.
bzr revid: tde@openerp.com-20121023122824-yqhsr65cwygorani
---
addons/mail/mail_message.py | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 6f6a838533b..7e03bca9caa 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -270,12 +270,12 @@ class mail_message(osv.Model):
easily have access to their values, given their ID
:return bool: True
"""
- def _get_expandable(domain, message_nb, parent_id, id, model):
+ def _get_expandable(domain, message_nb, ancestor_id, id, model):
return {
'domain': domain,
'nb_messages': message_nb,
'type': 'expandable',
- 'parent_id': parent_id,
+ 'ancestor_id': ancestor_id,
'id': id,
# TDE note: why do we need model sometimes, and sometimes not ???
'model': model,
@@ -400,14 +400,13 @@ class mail_message(osv.Model):
message_list.append(self._message_get_dict(cr, uid, message, context=context))
# get the older ancestor the user can read, update its ancestor field
- if not thread_level:
- continue
parent = self._get_parent(cr, uid, message, context=context)
while parent and parent.get('id') != parent_id:
message_list[-1]['ancestor_id'] = parent.get('id')
message = parent
parent = self._get_parent(cr, uid, message, context=context)
- if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
+ # if in thread: add its ancestor to the list of messages
+ if thread_level and not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
read_messages[message.get('id')] = message
message_list.append(self._message_get_dict(cr, uid, message, context=context))
From b4bcff666a722778d35930279de499ee838290ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Tue, 23 Oct 2012 15:27:55 +0200
Subject: [PATCH 149/150] [FIX] mail: message_read: ancestor_id is set in
thread mode as the first displayed ancestor; ancestor_id is set to parent_id
parameter in flat mode.
bzr revid: tde@openerp.com-20121023132755-dp29bake9eux5vz7
---
addons/mail/mail_message.py | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 7e03bca9caa..fdcc1e73ec5 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -368,8 +368,10 @@ class mail_message(osv.Model):
:param list domain: optional domain for searching ids if ids not set
:param list message_unload_ids: optional ids we do not want to fetch,
because i.e. they are already displayed somewhere
- :param int parent_id: if parent_id reached when adding ancestors,
- stop going further in the ancestor search
+ :param int parent_id: context of parent_id
+ - if parent_id reached when adding ancestors, stop going further
+ in the ancestor search
+ - if set in flat mode, ancestor_id is set to parent_id
:param int limit: number of messages to fetch, before adding the
ancestors and expandables
:return list: list of message structure for the Chatter widget
@@ -400,13 +402,16 @@ class mail_message(osv.Model):
message_list.append(self._message_get_dict(cr, uid, message, context=context))
# get the older ancestor the user can read, update its ancestor field
+ if not thread_level:
+ message_list[-1]['ancestor_id'] = parent_id
+ continue
parent = self._get_parent(cr, uid, message, context=context)
while parent and parent.get('id') != parent_id:
message_list[-1]['ancestor_id'] = parent.get('id')
message = parent
parent = self._get_parent(cr, uid, message, context=context)
# if in thread: add its ancestor to the list of messages
- if thread_level and not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
+ if not read_messages.get(message.get('id')) and message.get('id') not in message_unload_ids:
read_messages[message.get('id')] = message
message_list.append(self._message_get_dict(cr, uid, message, context=context))
From 056db11d0b91da953fcee17f846e2951e8f68fdd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?=
Date: Tue, 23 Oct 2012 15:43:29 +0200
Subject: [PATCH 150/150] [TEST] mail: added first draft of tests for
message_read and expandables.
bzr revid: tde@openerp.com-20121023134329-m5hnpg2eosn7x3tq
---
addons/mail/tests/test_mail.py | 168 +++++++++++++++++++++++++++++----
1 file changed, 148 insertions(+), 20 deletions(-)
diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py
index 9fdabca315c..7668d743eab 100644
--- a/addons/mail/tests/test_mail.py
+++ b/addons/mail/tests/test_mail.py
@@ -526,10 +526,25 @@ class test_mail(TestMailMockups):
def test_30_message_read(self):
""" Tests for message_read and expandables. """
+
+ def _print_debug(message, debug=True, prefix=''):
+ if debug:
+ print prefix, message
+
+ def _print_msg(message, debug=True, prefix=''):
+ if not debug:
+ return
+ if message.get('type') == 'expandable':
+ print prefix, 'expandable', message
+ else:
+ print prefix, 'message', message.get('body'), message.get('id'), message.get('ancestor_id')
+
+ _debug = False
cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
pigs_domain = [('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)]
# Data: create a discussion in Pigs (2 messages, one with 2 and one with 3 answers)
+ msg_id0 = self.group_pigs.message_post(body='0', subtype='mt_comment')
msg_id1 = self.group_pigs.message_post(body='1', subtype='mt_comment')
msg_id2 = self.group_pigs.message_post(body='2', subtype='mt_comment')
msg_id3 = self.group_pigs.message_post(body='1-1', subtype='mt_comment', parent_id=msg_id1)
@@ -540,40 +555,153 @@ class test_mail(TestMailMockups):
msg_id8 = self.group_pigs.message_post(body='2-1-1', subtype='mt_comment', parent_id=msg_id4)
msg_id9 = self.group_pigs.message_post(body='1-1-1', subtype='mt_comment', parent_id=msg_id3)
msg_id10 = self.group_pigs.message_post(body='2-1-1', subtype='mt_comment', parent_id=msg_id4)
- msg_ids = [msg_id1, msg_id2, msg_id3, msg_id4, msg_id5, msg_id6, msg_id7, msg_id8, msg_id9, msg_id10]
+ msg_ids = [msg_id0, msg_id1, msg_id2, msg_id3, msg_id4, msg_id5, msg_id6, msg_id7, msg_id8, msg_id9, msg_id10]
# Test: read some specific ids
read_msg_list = self.mail_message.message_read(cr, uid, ids=msg_ids[2:4], domain=[('body', 'like', 'dummy')])
read_msg_ids = [msg.get('id') for msg in read_msg_list]
self.assertEqual(msg_ids[2:4], read_msg_ids, 'message_read with direct ids should read only the requested ids')
- # Test: read messages of Pigs through a domain
+ # Test: read messages of Pigs through a domain, being thread or not threaded
read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=200)
read_msg_ids = [msg.get('id') for msg in read_msg_list]
- self.assertEqual(msg_ids, read_msg_ids, 'message_read with domain on Pigs should equal all messages of Pigs')
+ self.assertEqual(msg_ids, read_msg_ids, 'message_read flat with domain on Pigs should equal all messages of Pigs')
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=200, thread_level=1)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list]
+ self.assertEqual(msg_ids, read_msg_ids, 'message_read threaded with domain on Pigs should equal all messages of Pigs')
- # Test: read last message, check expandables
- read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=1)
+ # ----------------------------------------
+ # CASE1: message_read with domain, threaded
+ # We simulate an entire flow, using the expandables to test them
+ # ----------------------------------------
+ _print_debug('\nCASE1: message_read with domain, threaded\n', _debug)
+
+ # Do: read last message, threaded
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=1, thread_level=1)
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
- # Test: parent is added to the read messages
+ # Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
+ self.assertEqual(len(read_msg_list), 4, 'message_read on last Pigs message should return 2 messages and 2 expandables')
self.assertEqual(set([msg_id2, msg_id10]), set(read_msg_ids), 'message_read on the last Pigs message should also get its parent')
- print read_msg_ids
- # Test: expandables
- # 1. expandable for childs of Body2 before the last reply
- # 2. expandable for messages before Body2
+ self.assertEqual(read_msg_list[1].get('ancestor_id'), read_msg_list[0].get('id'), 'message_read should set the ancestor to the thread header')
+ # Data: get expandables
+ new_threads_exp, new_msg_exp = None, None
for msg in read_msg_list:
- if msg.get('type') == 'expandable':
- print msg
- # 'read more threads' expandable
+ _print_msg(msg, _debug)
if msg.get('type') == 'expandable' and msg.get('nb_messages') == -1 and msg.get('id') == -1:
- domain = msg.get('domain', [])
- self.assertEqual(set(domain), set(pigs_domain), 'general expandable domain should equal the message_read domain parameter')
- # 'read more messages' expandables
+ new_threads_exp = msg
elif msg.get('type') == 'expandable':
- domain = msg.get('domain', [])
- self.assertIn(('id', 'child_of', msg_id2), domain, 'thread expandable domain should contain a child_of condition')
- self.assertIn(('id', '>=', msg_id4), domain, 'thread expandable domain should contain a child_of condition')
- self.assertIn(('id', '<=', msg_id8), domain, 'thread expandable domain should contain a child_of condition')
+ new_msg_exp = msg
+
+ # Do: fetch new messages in first thread, domain from expandable
+ self.assertIsNotNone(new_msg_exp, 'message_read on last Pigs message should have returned a new messages expandable')
+ domain = new_msg_exp.get('domain', [])
+ # Test: expandable, conditions in domain
+ _print_debug('Executing %s' % domain, _debug)
+ self.assertIn(('id', 'child_of', msg_id2), domain, 'new messages expandable domain should contain a child_of condition')
+ self.assertIn(('id', '>=', msg_id4), domain, 'new messages expandable domain should contain an id greater than condition')
+ self.assertIn(('id', '<=', msg_id8), domain, 'new messages expandable domain should contain an id less than condition')
+ self.assertEqual(new_msg_exp.get('ancestor_id'), msg_id2, 'new messages expandable should have ancestor_id set to the thread header')
+ # Do: message_read with domain, thread_level=0, parent_id=msg_id2 (should be imposed by JS)
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=200, thread_level=0, parent_id=msg_id2)
+ for msg in read_msg_list:
+ _print_msg(msg, _debug)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: other message in thread have been fetch
+ self.assertEqual(set([msg_id4, msg_id6, msg_id8]), set(read_msg_ids), 'message_read in Pigs thread should return all the previous messages')
+
+ # Do: fetch a new thread, domain from expandable
+ self.assertIsNotNone(new_threads_exp, 'message_read on last Pigs message should have returned a new threads expandable')
+ domain = new_threads_exp.get('domain', [])
+ # Test: expandable, conditions in domain
+ _print_debug('Executing %s' % domain, _debug)
+ for condition in pigs_domain:
+ self.assertIn(condition, domain, 'new threads expandable domain should contain the message_read domain parameter')
+ self.assertFalse(new_threads_exp.get('ancestor_id'), 'new threads expandable should not have an ancestor_id')
+ # Do: message_read with domain, thread_level=1 (should be imposed by JS)
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=1, thread_level=1)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
+ self.assertEqual(len(read_msg_list), 4, 'message_read on Pigs should return 2 messages and 2 expandables')
+ self.assertEqual(set([msg_id1, msg_id9]), set(read_msg_ids), 'message_read on a Pigs message should also get its parent')
+ self.assertEqual(read_msg_list[1].get('ancestor_id'), read_msg_list[0].get('id'), 'message_read should set the ancestor to the thread header')
+ # Data: get expandables
+ new_threads_exp, new_msg_exp = None, None
+ for msg in read_msg_list:
+ _print_msg(msg, _debug)
+ if msg.get('type') == 'expandable' and msg.get('nb_messages') == -1 and msg.get('id') == -1:
+ new_threads_exp = msg
+ elif msg.get('type') == 'expandable':
+ new_msg_exp = msg
+
+ # Do: fetch new messages in second thread, domain from expandable
+ self.assertIsNotNone(new_msg_exp, 'message_read on Pigs message should have returned a new messages expandable')
+ domain = new_msg_exp.get('domain', [])
+ # Test: expandable, conditions in domain
+ _print_debug('Executing %s' % domain, _debug)
+ self.assertIn(('id', 'child_of', msg_id1), domain, 'new messages expandable domain should contain a child_of condition')
+ self.assertIn(('id', '>=', msg_id3), domain, 'new messages expandable domain should contain an id greater than condition')
+ self.assertIn(('id', '<=', msg_id7), domain, 'new messages expandable domain should contain an id less than condition')
+ self.assertEqual(new_msg_exp.get('ancestor_id'), msg_id1, 'new messages expandable should have ancestor_id set to the thread header')
+ # Do: message_read with domain, thread_level=0, parent_id=msg_id1 (should be imposed by JS)
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=200, thread_level=0, parent_id=msg_id1)
+ for msg in read_msg_list:
+ _print_msg(msg, _debug)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: other message in thread have been fetch
+ self.assertEqual(set([msg_id3, msg_id5, msg_id7]), set(read_msg_ids), 'message_read on the last Pigs message should also get its parent')
+
+ # Test: fetch a new thread, domain from expandable
+ self.assertIsNotNone(new_threads_exp, 'message_read should have returned a new threads expandable')
+ domain = new_threads_exp.get('domain', [])
+ # Test: expandable, conditions in domain
+ _print_debug('Executing %s' % domain, _debug)
+ for condition in pigs_domain:
+ self.assertIn(condition, domain, 'general expandable domain should contain the message_read domain parameter')
+ # Do: message_read with domain, thread_level=1 (should be imposed by JS)
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=1, thread_level=1)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
+ self.assertEqual(len(read_msg_list), 1, 'message_read on Pigs should return 1 message because everything else has been fetched')
+ self.assertEqual([msg_id0], read_msg_ids, 'message_read after 2 More should return only 1 last message')
+ for msg in read_msg_list:
+ _print_msg(msg, _debug)
+
+ # ----------------------------------------
+ # CASE2: message_read with domain, flat
+ # ----------------------------------------
+ _print_debug('\nCASE2: message_read with domain, flat\n', _debug)
+
+ # Do: read 2 lasts message, flat
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=2, thread_level=0)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is not set, 1 expandable
+ self.assertEqual(len(read_msg_list), 3, 'message_read on last Pigs message should return 2 messages and 1 expandable')
+ self.assertEqual(set([msg_id9, msg_id10]), set(read_msg_ids), 'message_read flat on Pigs last messages should only return those messages')
+ self.assertFalse(read_msg_list[0].get('ancestor_id'), 'message_read flat should set the ancestor as False')
+ self.assertFalse(read_msg_list[1].get('ancestor_id'), 'message_read flat should set the ancestor as False')
+ # Data: get expandables
+ new_threads_exp, new_msg_exp = None, None
+ for msg in read_msg_list:
+ _print_msg(msg, _debug)
+ if msg.get('type') == 'expandable' and msg.get('nb_messages') == -1 and msg.get('id') == -1:
+ new_threads_exp = msg
+
+ # Do: fetch new messages, domain from expandable
+ self.assertIsNotNone(new_threads_exp, 'message_read flat on the 2 last Pigs messages should have returns a new threads expandable')
+ domain = new_threads_exp.get('domain', [])
+ # Test: expandable, conditions in domain
+ _print_debug('Executing %s' % domain, _debug)
+ for condition in pigs_domain:
+ self.assertIn(condition, domain, 'new threads expandable domain should contain the message_read domain parameter')
+ # Do: message_read with domain, thread_level=0 (should be imposed by JS)
+ read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=20, thread_level=0)
+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
+ # Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
+ self.assertEqual(len(read_msg_list), 9, 'message_read on Pigs should return 9 messages and 0 expandable')
+ self.assertEqual([msg_id0, msg_id1, msg_id2, msg_id3, msg_id4, msg_id5, msg_id6, msg_id7, msg_id8], read_msg_ids,
+ 'message_read, More on flat, should return all remaning messages')
+ for msg in read_msg_list:
+ _print_msg(msg, _debug)
def test_40_needaction(self):
""" Tests for mail.message needaction. """
|