diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 10df94099a1..c70ef41c0f2 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -194,8 +194,10 @@ + + on_change="onchange_journal_id(journal_id)" options="{'no_create': True}" + attrs="{'readonly':[('internal_number','!=',False)]}"/> @@ -339,8 +341,10 @@ + + on_change="onchange_journal_id(journal_id)" options="{'no_create': True}" + attrs="{'readonly':[('internal_number','!=',False)]}"/> diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 2c1422c1369..348d0ced3bc 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -452,7 +452,7 @@ class account_move_line(osv.osv): 'debit': fields.float('Debit', digits_compute=dp.get_precision('Account')), 'credit': fields.float('Credit', digits_compute=dp.get_precision('Account')), 'account_id': fields.many2one('account.account', 'Account', required=True, ondelete="cascade", domain=[('type','<>','view'), ('type', '<>', 'closed')], select=2), - 'move_id': fields.many2one('account.move', 'Journal Entry', ondelete="cascade", help="The move of this entry line.", select=2, required=True), + 'move_id': fields.many2one('account.move', 'Journal Entry', ondelete="cascade", help="The move of this entry line.", select=2, required=True, auto_join=True), 'narration': fields.related('move_id','narration', type='text', relation='account.move', string='Internal Note'), 'ref': fields.related('move_id', 'ref', string='Reference', type='char', store=True), 'statement_id': fields.many2one('account.bank.statement', 'Statement', help="The bank statement used for bank reconciliation", select=1, copy=False), diff --git a/addons/account_followup/account_followup.py b/addons/account_followup/account_followup.py index c7e397a19f2..3ed0c5cbadc 100644 --- a/addons/account_followup/account_followup.py +++ b/addons/account_followup/account_followup.py @@ -310,6 +310,7 @@ class res_partner(osv.osv): ('reconcile_id', '=', False), ('state', '!=', 'draft'), ('company_id', '=', company_id), + ('date_maturity', '<=', fields.date.context_today(self,cr,uid)), ], context=context): raise UserError(_("The partner does not have any accounting entries to print in the overdue report for the current company.")) self.message_post(cr, uid, [ids[0]], body=_('Printed overdue payments report'), context=context) diff --git a/addons/account_followup/report/account_followup_print.py b/addons/account_followup/report/account_followup_print.py index 683c4d4ed50..ab72b621788 100644 --- a/addons/account_followup/report/account_followup_print.py +++ b/addons/account_followup/report/account_followup_print.py @@ -21,7 +21,7 @@ import time from collections import defaultdict -from openerp.osv import osv +from openerp.osv import osv, fields from openerp.report import report_sxw from openerp.exceptions import UserError @@ -56,6 +56,7 @@ class report_rappel(report_sxw.rml_parse): ('reconcile_id', '=', False), ('state', '!=', 'draft'), ('company_id', '=', company_id), + ('date_maturity', '<=', fields.date.context_today(self,self.cr,self.uid)), ]) # lines_per_currency = {currency: [line data, ...], ...} diff --git a/addons/analytic/views/analytic_view.xml b/addons/analytic/views/analytic_view.xml index 683db370fd7..d977caa25ac 100644 --- a/addons/analytic/views/analytic_view.xml +++ b/addons/analytic/views/analytic_view.xml @@ -29,7 +29,7 @@ - + diff --git a/addons/board/board.py b/addons/board/board.py index 5e33bb5433b..96f7ef9cee9 100644 --- a/addons/board/board.py +++ b/addons/board/board.py @@ -23,7 +23,7 @@ from operator import itemgetter from textwrap import dedent -from openerp import tools +from openerp import tools, SUPERUSER_ID from openerp.osv import fields, osv class board_board(osv.osv): @@ -143,7 +143,7 @@ class board_create(osv.osv_memory): ''') }, context=context) - menu_id = self.pool.get('ir.ui.menu').create(cr, uid, { + menu_id = self.pool.get('ir.ui.menu').create(cr, SUPERUSER_ID, { 'name': this.name, 'parent_id': this.menu_parent_id.id, 'action': 'ir.actions.act_window,%s' % (action_id,) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 70239d01acb..ead2b7d6b90 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -321,6 +321,7 @@ class crm_lead(format_address, osv.osv): values = { 'partner_name': partner.parent_id.name if partner.parent_id else partner.name, 'contact_name': partner.name if partner.parent_id else False, + 'title': partner.title and partner.title.id or False, 'street': partner.street, 'street2': partner.street2, 'city': partner.city, @@ -331,6 +332,7 @@ class crm_lead(format_address, osv.osv): 'mobile': partner.mobile, 'fax': partner.fax, 'zip': partner.zip, + 'function': partner.function, } return {'value': values} diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 9ac36bbc63c..d1947fb2c10 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -568,12 +568,13 @@ class hr_timesheet_sheet_sheet_day(osv.osv): MAX(id) as id, name, sheet_id, + timezone, SUM(total_timesheet) as total_timesheet, - CASE WHEN SUM(total_attendance) < 0 + CASE WHEN SUM(orphan_attendances) != 0 THEN (SUM(total_attendance) + CASE WHEN current_date <> name THEN 1440 - ELSE (EXTRACT(hour FROM current_time AT TIME ZONE 'UTC') * 60) + EXTRACT(minute FROM current_time AT TIME ZONE 'UTC') + ELSE (EXTRACT(hour FROM current_time AT TIME ZONE 'UTC' AT TIME ZONE coalesce(timezone, 'UTC')) * 60) + EXTRACT(minute FROM current_time AT TIME ZONE 'UTC' AT TIME ZONE coalesce(timezone, 'UTC')) END ) ELSE SUM(total_attendance) @@ -582,21 +583,25 @@ class hr_timesheet_sheet_sheet_day(osv.osv): (( select min(hrt.id) as id, + 'UTC' as timezone, l.date::date as name, s.id as sheet_id, sum(l.unit_amount) as total_timesheet, + 0 as orphan_attendances, 0.0 as total_attendance from hr_analytic_timesheet hrt JOIN account_analytic_line l ON l.id = hrt.line_id LEFT JOIN hr_timesheet_sheet_sheet s ON s.id = hrt.sheet_id - group by l.date::date, s.id + group by l.date::date, s.id, timezone ) union ( select -min(a.id) as id, + p.tz as timezone, (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))::date as name, s.id as sheet_id, 0.0 as total_timesheet, + SUM(CASE WHEN a.action = 'sign_in' THEN -1 ELSE 1 END) as orphan_attendances, SUM(((EXTRACT(hour FROM (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))) * 60) + EXTRACT(minute FROM (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC')))) * (CASE WHEN a.action = 'sign_in' THEN -1 ELSE 1 END)) as total_attendance from hr_attendance a @@ -611,9 +616,9 @@ class hr_timesheet_sheet_sheet_day(osv.osv): LEFT JOIN res_partner p ON u.partner_id = p.id WHERE action in ('sign_in', 'sign_out') - group by (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))::date, s.id + group by (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))::date, s.id, timezone )) AS foo - GROUP BY name, sheet_id + GROUP BY name, sheet_id, timezone )) AS bar""") diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index dd089e728f7..a7c21762297 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -21,6 +21,7 @@ import time import openerp.addons.decimal_precision as dp +from collections import OrderedDict from openerp.osv import fields, osv from openerp.tools import DEFAULT_SERVER_DATE_FORMAT from openerp.tools.translate import _ @@ -851,7 +852,7 @@ class mrp_production(osv.osv): product_qty = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, production.product_id.uom_id.id) - produced_qty production_qty = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, production.product_id.uom_id.id) - scheduled_qty = {} + scheduled_qty = OrderedDict() for scheduled in production.product_lines: if scheduled.product_id.type == 'service': continue @@ -860,7 +861,7 @@ class mrp_production(osv.osv): scheduled_qty[scheduled.product_id.id] += qty else: scheduled_qty[scheduled.product_id.id] = qty - dicts = {} + dicts = OrderedDict() # Find product qty to be consumed and consume it for product_id in scheduled_qty.keys(): @@ -903,7 +904,7 @@ class mrp_production(osv.osv): else: dicts[product_id][lot_id] = quant_qty qty -= quant_qty - if qty > 0: + if float_compare(qty, 0, self.pool['decimal.precision'].precision_get(cr, uid, 'Product Unit of Measure')) == 1: if dicts[product_id].get(False): dicts[product_id][False] += qty else: diff --git a/addons/mrp/wizard/mrp_product_produce.py b/addons/mrp/wizard/mrp_product_produce.py index ce4e0ae76c3..f91b0106eb7 100644 --- a/addons/mrp/wizard/mrp_product_produce.py +++ b/addons/mrp/wizard/mrp_product_produce.py @@ -29,7 +29,7 @@ class mrp_product_produce_line(osv.osv_memory): _columns = { 'product_id': fields.many2one('product.product', string='Product'), - 'product_qty': fields.float('Quantity (in default UoM)'), + 'product_qty': fields.float('Quantity (in default UoM)', digits_compute=dp.get_precision('Product Unit of Measure')), 'lot_id': fields.many2one('stock.production.lot', string='Lot'), 'produce_id': fields.many2one('mrp.product.produce', string="Produce"), 'track_production': fields.related('product_id', 'track_production', type='boolean', string="Track Production"), diff --git a/addons/project/project.py b/addons/project/project.py index 16ff6fc67e8..dc8f375288b 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -370,7 +370,7 @@ class project(osv.osv): return True _constraints = [ - (_check_dates, 'Error! project start-date must be lower then project end-date.', ['date_start', 'date']) + (_check_dates, 'Error! project start-date must be lower than project end-date.', ['date_start', 'date']) ] def set_template(self, cr, uid, ids, context=None): @@ -897,7 +897,7 @@ class task(osv.osv): _constraints = [ (_check_recursion, 'Error ! You cannot create recursive tasks.', ['parent_ids']), - (_check_dates, 'Error ! Task starting date must be lower then its ending date.', ['date_start','date_end']) + (_check_dates, 'Error ! Task starting date must be lower than its ending date.', ['date_start','date_end']) ] # Override view according to the company definition diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 98a3fa1ae33..2cd69fb85cb 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -149,6 +149,19 @@ class purchase_order(osv.osv): limit=1) return res and res[0] or False + def _has_non_stockable_item(self, cr, uid, ids, *args): + res = dict.fromkeys(ids, False) + for order in self.browse(cr, uid, ids): + for order_line in order.order_line: + if ( + not order_line.product_id + or + order_line.product_id + and order_line.product_id.type not in ('product', 'consu') + ): + res[order.id] = True + return res + def _get_picking_in(self, cr, uid, context=None): obj_data = self.pool.get('ir.model.data') type_obj = self.pool.get('stock.picking.type') @@ -298,6 +311,7 @@ class purchase_order(osv.osv): 'create_uid': fields.many2one('res.users', 'Responsible'), 'company_id': fields.many2one('res.company', 'Company', required=True, select=1, states={'confirmed': [('readonly', True)], 'approved': [('readonly', True)]}), 'journal_id': fields.many2one('account.journal', 'Journal'), + 'has_non_stockable_item': fields.function(_has_non_stockable_item, method=True, type='boolean', string='Contains a non-stockable item'), 'bid_date': fields.date('Bid Received On', readonly=True, help="Date on which the bid was received"), 'bid_validity': fields.date('Bid Valid Until', help="Date on which the bid expired"), 'picking_type_id': fields.many2one('stock.picking.type', 'Deliver To', help="This will determine picking type of incoming shipment", required=True, @@ -481,6 +495,7 @@ class purchase_order(osv.osv): action['res_id'] = pick_ids and pick_ids[0] or False return action + def wkf_approve_order(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'approved', 'date_approve': fields.date.context_today(self,cr,uid,context=context)}) return True @@ -539,6 +554,10 @@ class purchase_order(osv.osv): for po in self.browse(cr, uid, ids, context=context): if not po.order_line: raise UserError(_('You cannot confirm a purchase order without any purchase order line.')) + if po.invoice_method == 'picking' and po.has_non_stockable_item is True: + raise osv.except_osv( + _('Error!'), + _("You cannot confirm a purchase order with Invoice Control Method 'Based on incoming shipments' that contains non-stockable items.")) for line in po.order_line: if line.state=='draft': todo.append(line.id) diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py index 00c69b4e86b..bd0303f9610 100644 --- a/addons/purchase/stock.py +++ b/addons/purchase/stock.py @@ -74,7 +74,7 @@ class stock_move(osv.osv): purchase_obj = self.pool.get('purchase.order') invoice_line_obj = self.pool.get('account.invoice.line') purchase_id = move.purchase_line_id.order_id.id - purchase_line_ids = purchase_line_obj.search(cr, uid, [('order_id', '=', purchase_id), ('product_id.type', '=', 'service'), ('invoice_lines', '=', False)], context=context) + purchase_line_ids = purchase_line_obj.search(cr, uid, [('order_id', '=', purchase_id), ('invoice_lines', '=', False), '|', ('product_id', '=', False), ('product_id.type', '=', 'service')], context=context) if purchase_line_ids: inv_lines = [] for po_line in purchase_line_obj.browse(cr, uid, purchase_line_ids, context=context): diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 78d887469ee..2e181782775 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -708,8 +708,9 @@ class sale_order(osv.osv): procurement_obj.check(cr, uid, [x.id for x in line.procurement_ids if x.state not in ['cancel', 'done']]) line.refresh() #run again procurement that are in exception in order to trigger another move - proc_ids += [x.id for x in line.procurement_ids if x.state in ('exception', 'cancel')] - procurement_obj.reset_to_confirmed(cr, uid, proc_ids, context=context) + except_proc_ids = [x.id for x in line.procurement_ids if x.state in ('exception', 'cancel')] + procurement_obj.reset_to_confirmed(cr, uid, except_proc_ids, context=context) + proc_ids += except_proc_ids elif sale_line_obj.need_procurement(cr, uid, [line.id], context=context): if (line.state == 'done') or not line.product_id: continue diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 60866b782c3..7c22c8307a7 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -305,6 +305,14 @@ class sale_order_line(osv.osv): res['value'].update({'product_packaging': False}) return res + # set product uom in context to get virtual stock in current uom + if res.get('value', {}).get('product_uom'): + # use the uom changed by super call + context.update({'uom': res['value']['product_uom']}) + elif uom: + # fallback on selected + context.update({'uom': uom}) + #update of result obtained in super function product_obj = product_obj.browse(cr, uid, product, context=context) res['value'].update({'product_tmpl_id': product_obj.product_tmpl_id.id, 'delay': (product_obj.sale_delay or 0.0)}) @@ -376,7 +384,7 @@ class stock_move(osv.osv): }) sale_line_obj = self.pool.get('sale.order.line') invoice_line_obj = self.pool.get('account.invoice.line') - sale_line_ids = sale_line_obj.search(cr, uid, [('order_id', '=', move.procurement_id.sale_line_id.order_id.id), ('product_id.type', '=', 'service'), ('invoiced', '=', False)], context=context) + sale_line_ids = sale_line_obj.search(cr, uid, [('order_id', '=', move.procurement_id.sale_line_id.order_id.id), ('invoiced', '=', False), '|', ('product_id', '=', False), ('product_id.type', '=', 'service')], context=context) if sale_line_ids: created_lines = sale_line_obj.invoice_line_create(cr, uid, sale_line_ids, context=context) invoice_line_obj.write(cr, uid, created_lines, {'invoice_id': invoice_line_vals['invoice_id']}, context=context) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 325729cf992..7623b84cd32 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -3065,20 +3065,33 @@ class stock_warehouse(osv.osv): raise UserError(_('Can\'t find any customer or supplier location.')) return location_obj.browse(cr, uid, [customer_loc, supplier_loc], context=context) + def _location_used(self, cr, uid, location_id, warehouse, context=None): + pull_obj = self.pool['procurement.rule'] + push_obj = self.pool['stock.location.path'] + pulls = pull_obj.search(cr, uid, ['&', ('route_id', 'not in', [x.id for x in warehouse.route_ids]), '|', ('location_src_id', '=', location_id), ('location_id', '=', location_id)], context=context) + pushs = push_obj.search(cr, uid, ['&', ('route_id', 'not in', [x.id for x in warehouse.route_ids]), '|', ('location_from_id', '=', location_id), ('location_dest_id', '=', location_id)], context=context) + if pulls or pushs: + return True + return False + def switch_location(self, cr, uid, ids, warehouse, new_reception_step=False, new_delivery_step=False, context=None): location_obj = self.pool.get('stock.location') new_reception_step = new_reception_step or warehouse.reception_steps new_delivery_step = new_delivery_step or warehouse.delivery_steps if warehouse.reception_steps != new_reception_step: - location_obj.write(cr, uid, [warehouse.wh_input_stock_loc_id.id, warehouse.wh_qc_stock_loc_id.id], {'active': False}, context=context) + if not self._location_used(cr, uid, warehouse.wh_input_stock_loc_id.id, warehouse, context=context): + location_obj.write(cr, uid, [warehouse.wh_input_stock_loc_id.id, warehouse.wh_qc_stock_loc_id.id], {'active': False}, context=context) if new_reception_step != 'one_step': location_obj.write(cr, uid, warehouse.wh_input_stock_loc_id.id, {'active': True}, context=context) if new_reception_step == 'three_steps': location_obj.write(cr, uid, warehouse.wh_qc_stock_loc_id.id, {'active': True}, context=context) if warehouse.delivery_steps != new_delivery_step: - location_obj.write(cr, uid, [warehouse.wh_output_stock_loc_id.id, warehouse.wh_pack_stock_loc_id.id], {'active': False}, context=context) + if not self._location_used(cr, uid, warehouse.wh_output_stock_loc_id.id, warehouse, context=context): + location_obj.write(cr, uid, [warehouse.wh_output_stock_loc_id.id], {'active': False}, context=context) + if not self._location_used(cr, uid, warehouse.wh_pack_stock_loc_id.id, warehouse, context=context): + location_obj.write(cr, uid, [warehouse.wh_pack_stock_loc_id.id], {'active': False}, context=context) if new_delivery_step != 'ship_only': location_obj.write(cr, uid, warehouse.wh_output_stock_loc_id.id, {'active': True}, context=context) if new_delivery_step == 'pick_pack_ship': diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 40bf55a3ece..c71c340dd04 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -2168,6 +2168,10 @@ .openerp .oe_form_field_many2one input { padding-right: 13px; } +.openerp.ui-autocomplete { + top: 0; + left: 0; +} .openerp.ui-autocomplete li.oe_m2o_dropdown_option a { font-style: italic; padding-left: 2em; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 60d0c5497ef..1432352aa7e 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1809,6 +1809,11 @@ $sheet-padding: 16px input padding-right: 13px &.ui-autocomplete + // http://bugs.jqueryui.com/ticket/8749 + // https://github.com/jquery/jquery-ui/commit/d693ce5324f6f3be8479ef083e4eaf3c705ef043 + // Odoo 8.0 currently uses JQuery 1.9.1, and the above fix, that we need, is in 1.9.2. + top: 0 + left: 0 li.oe_m2o_dropdown_option a font-style: italic padding-left: 2em diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 89af8bd34fb..92e6bf3b766 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2850,6 +2850,7 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we this.$textarea = this.$el.find('textarea'); this.auto_sized = false; this.default_height = this.$textarea.css('height'); + if (this.default_height === '0px') this.default_height = '90px'; if (this.get("effective_readonly")) { this.$textarea.attr('disabled', 'disabled'); } diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index dcd6ae77117..97c4abda05f 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -299,21 +299,24 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi this.$pager .on('click', 'a[data-pager-action]', function () { var $this = $(this); - var max_page = Math.floor(self.dataset.size() / self.limit()); + var max_page_index = Math.ceil(self.dataset.size() / self.limit()) - 1; switch ($this.data('pager-action')) { case 'first': - self.page = 0; break; + self.page = 0; + break; case 'last': - self.page = max_page - 1; + self.page = max_page_index; break; case 'next': - self.page += 1; break; + self.page += 1; + break; case 'previous': - self.page -= 1; break; + self.page -= 1; + break; } if (self.page < 0) { - self.page = max_page; - } else if (self.page > max_page) { + self.page = max_page_index; + } else if (self.page > max_page_index) { self.page = 0; } self.reload_content(); diff --git a/doc/_themes/odoodoc/static/style.css b/doc/_themes/odoodoc/static/style.css index 985c9d1dd2e..7ca2b0264f8 100644 --- a/doc/_themes/odoodoc/static/style.css +++ b/doc/_themes/odoodoc/static/style.css @@ -6609,6 +6609,9 @@ body { dt:hover > a > .viewcode-link { display: inline; } +blockquote.highlights { + border: none; +} div.section > h1 { padding-bottom: 9px; margin: 40px 0 20px; @@ -6822,7 +6825,7 @@ td.field-body > ul { padding-right: 1em; } .stripe .section:not(.force-right) > .force-right, - .stripe .section:not(.force-right) > [class*=highlight] { + .stripe .section:not(.force-right) > [class*=highlight-] { float: none; clear: none; margin-left: 50%; @@ -6830,31 +6833,31 @@ td.field-body > ul { color: #eeeeee; } .stripe .section:not(.force-right) > .force-right legend, - .stripe .section:not(.force-right) > [class*=highlight] legend { + .stripe .section:not(.force-right) > [class*=highlight-] legend { color: inherit; } .stripe .section:not(.force-right) > .force-right input, - .stripe .section:not(.force-right) > [class*=highlight] input { + .stripe .section:not(.force-right) > [class*=highlight-] input { color: inherit; background-color: #555555; } .stripe .section:not(.force-right) > .force-right a, - .stripe .section:not(.force-right) > [class*=highlight] a { + .stripe .section:not(.force-right) > [class*=highlight-] a { color: #d9a8cc; } .stripe .section:not(.force-right) > .force-right code, - .stripe .section:not(.force-right) > [class*=highlight] code, + .stripe .section:not(.force-right) > [class*=highlight-] code, .stripe .section:not(.force-right) > .force-right .literal, - .stripe .section:not(.force-right) > [class*=highlight] .literal { + .stripe .section:not(.force-right) > [class*=highlight-] .literal { color: #f9f2f4; background-color: #555555; } .stripe .section:not(.force-right) > .force-right:not(.highlight-json) .highlight, - .stripe .section:not(.force-right) > [class*=highlight]:not(.highlight-json) .highlight { + .stripe .section:not(.force-right) > [class*=highlight-]:not(.highlight-json) .highlight { border-bottom-color: #777777; } .stripe .section:not(.force-right) > .force-right.admonition, - .stripe .section:not(.force-right) > [class*=highlight].admonition { + .stripe .section:not(.force-right) > [class*=highlight-].admonition { margin-left: 51%; width: 49%; border-top-color: #777777; @@ -6862,7 +6865,7 @@ td.field-body > ul { border-right-color: #777777; } .stripe .section:not(.force-right) > .force-right .highlight, - .stripe .section:not(.force-right) > [class*=highlight] .highlight { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight { border-color: #555555; border-style: solid; border-width: 1px 0; @@ -6940,281 +6943,281 @@ td.field-body > ul { /* Literal.Number.Integer.Long */ } .stripe .section:not(.force-right) > .force-right .highlight .lineno, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .lineno { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .lineno { color: #586e75; } .stripe .section:not(.force-right) > .force-right .highlight .c, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .c { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .c { color: #586e75; } .stripe .section:not(.force-right) > .force-right .highlight .err, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .err { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .err { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .g, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .g { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .g { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .k, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .k { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .k { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .l, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .l { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .l { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .n, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .n { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .n { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .o, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .o { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .o { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .x, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .x { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .x { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .p, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .p { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .p { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .cm, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .cm { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .cm { color: #586e75; } .stripe .section:not(.force-right) > .force-right .highlight .cp, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .cp { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .cp { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .c1, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .c1 { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .c1 { color: #586e75; } .stripe .section:not(.force-right) > .force-right .highlight .cs, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .cs { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .cs { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .gd, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gd { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gd { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .ge, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .ge { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .ge { color: #cccccc; font-style: italic; } .stripe .section:not(.force-right) > .force-right .highlight .gr, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gr { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gr { color: #dc322f; } .stripe .section:not(.force-right) > .force-right .highlight .gh, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gh { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gh { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .gi, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gi { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gi { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .go, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .go { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .go { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .gp, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gp { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gp { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .gs, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gs { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gs { color: #cccccc; font-weight: bold; } .stripe .section:not(.force-right) > .force-right .highlight .gu, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gu { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gu { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .gt, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .gt { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .gt { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .kc, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .kc { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .kc { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .kd, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .kd { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .kd { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .kn, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .kn { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .kn { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .kp, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .kp { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .kp { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .kr, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .kr { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .kr { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .kt, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .kt { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .kt { color: #dc322f; } .stripe .section:not(.force-right) > .force-right .highlight .ld, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .ld { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .ld { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .m, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .m { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .m { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .s, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .s { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .s { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .na, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .na { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .na { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .nb, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nb { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nb { color: #b58900; } .stripe .section:not(.force-right) > .force-right .highlight .nc, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nc { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nc { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .no, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .no { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .no { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .nd, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nd { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nd { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .ni, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .ni { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .ni { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .ne, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .ne { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .ne { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .nf, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nf { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nf { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .nl, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nl { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nl { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .nn, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nn { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nn { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .nx, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nx { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nx { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .py, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .py { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .py { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .nt, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nt { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nt { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .nv, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .nv { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .nv { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .ow, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .ow { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .ow { color: #859900; } .stripe .section:not(.force-right) > .force-right .highlight .w, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .w { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .w { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .mf, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .mf { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .mf { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .mh, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .mh { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .mh { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .mi, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .mi { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .mi { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .mo, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .mo { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .mo { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .sb, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .sb { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .sb { color: #586e75; } .stripe .section:not(.force-right) > .force-right .highlight .sc, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .sc { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .sc { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .sd, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .sd { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .sd { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .s2, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .s2 { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .s2 { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .se, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .se { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .se { color: #cb4b16; } .stripe .section:not(.force-right) > .force-right .highlight .sh, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .sh { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .sh { color: #cccccc; } .stripe .section:not(.force-right) > .force-right .highlight .si, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .si { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .si { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .sx, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .sx { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .sx { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .sr, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .sr { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .sr { color: #dc322f; } .stripe .section:not(.force-right) > .force-right .highlight .s1, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .s1 { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .s1 { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .ss, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .ss { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .ss { color: #2aa198; } .stripe .section:not(.force-right) > .force-right .highlight .bp, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .bp { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .bp { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .vc, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .vc { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .vc { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .vg, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .vg { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .vg { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .vi, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .vi { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .vi { color: #268bd2; } .stripe .section:not(.force-right) > .force-right .highlight .il, - .stripe .section:not(.force-right) > [class*=highlight] .highlight .il { + .stripe .section:not(.force-right) > [class*=highlight-] .highlight .il { color: #2aa198; } .stripe .body > .section > .section { diff --git a/doc/_themes/odoodoc/static/style.less b/doc/_themes/odoodoc/static/style.less index bea588932d6..d0c24c6f6f0 100644 --- a/doc/_themes/odoodoc/static/style.less +++ b/doc/_themes/odoodoc/static/style.less @@ -393,6 +393,9 @@ dt:hover > a > .viewcode-link { // either that or overwrite visit_attribution/depart_attribution blockquote p.attribution:extend(blockquote footer) {} +blockquote.highlights { + border: none; +} div.section > h1 { .page-header(); @@ -622,7 +625,7 @@ td.field-body { padding-right: 1em; } .section:not(.force-right) > .force-right, - .section:not(.force-right) > [class*=highlight] { + .section:not(.force-right) > [class*=highlight-] { float: none; clear: none; margin-left: 50%; diff --git a/doc/cla/individual/JesusVMayor.md b/doc/cla/individual/JesusVMayor.md new file mode 100644 index 00000000000..c009f323be9 --- /dev/null +++ b/doc/cla/individual/JesusVMayor.md @@ -0,0 +1,12 @@ +Spain, 2015-03-06 + +I hereby agree to the terms of the Odoo Individual Contributor License +Agreement v1.0. + +I declare that I am authorized and able to make this agreement and sign this +declaration. + +Signed, + +Jesús Ventosinos Mayor jesus@pexego.es https://github.com/jesusVMayor + diff --git a/openerp/addons/base/ir/ir_attachment.py b/openerp/addons/base/ir/ir_attachment.py index 8beb80e3a3b..6c569fdc798 100644 --- a/openerp/addons/base/ir/ir_attachment.py +++ b/openerp/addons/base/ir/ir_attachment.py @@ -184,7 +184,9 @@ class ir_attachment(osv.osv): return fname def _file_delete(self, cr, uid, fname): - count = self.search_count(cr, 1, [('store_fname','=',fname)]) + # using SQL to include files hidden through unlink or due to record rules + cr.execute("SELECT COUNT(*) FROM ir_attachment WHERE store_fname = %s", (fname,)) + count = cr.fetchone()[0] full_path = self._full_path(cr, uid, fname) if not count and os.path.exists(full_path): try: diff --git a/openerp/addons/base/ir/ir_filters.py b/openerp/addons/base/ir/ir_filters.py index 0cbdcbb6e05..3b48d723f21 100644 --- a/openerp/addons/base/ir/ir_filters.py +++ b/openerp/addons/base/ir/ir_filters.py @@ -140,13 +140,14 @@ class ir_filters(osv.osv): ] def _auto_init(self, cr, context=None): - super(ir_filters, self)._auto_init(cr, context) + result = super(ir_filters, self)._auto_init(cr, context) # Use unique index to implement unique constraint on the lowercase name (not possible using a constraint) cr.execute("DROP INDEX IF EXISTS ir_filters_name_model_uid_unique_index") # drop old index w/o action cr.execute("SELECT indexname FROM pg_indexes WHERE indexname = 'ir_filters_name_model_uid_unique_action_index'") if not cr.fetchone(): cr.execute("""CREATE UNIQUE INDEX "ir_filters_name_model_uid_unique_action_index" ON ir_filters (lower(name), model_id, COALESCE(user_id,-1), COALESCE(action_id,-1))""") + return result _columns = { 'name': fields.char('Filter Name', translate=True, required=True),