From 798ce97df4fc111c0e2e44f6776904a41fdab03d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 7 Jul 2014 09:59:05 +0200 Subject: [PATCH 1/8] [IMP] raise exception when a DB request fetches ids it was not asked for Likely caused by a type incoherence e.g. providing an id as string when the table uses integer ids. Postgres performs an implicit conversion from string to integer[0], this wasn't much of an issue in the old API, whatever cache was there would simply not be used, but because the new API's cache is part of its behavior it has a semantic impact and can lead to infinite recursion. [0] more precisely from quoted value, which is untyped --- openerp/models.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openerp/models.py b/openerp/models.py index 86d702ef582..9e289965733 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -3231,8 +3231,16 @@ class BaseModel(object): record._cache.update(record._convert_to_cache(vals)) # store failed values in cache for the records that could not be read - missing = self - self.browse(ids) + fetched = self.browse(ids) + missing = self - fetched if missing: + extras = fetched - self + if extras: + raise AccessError( + _("Database fetch misses ids ({}) and has extra ids ({}), may be caused by a type incoherence in a previous request").format( + ', '.join(map(repr, missing._ids)), + ', '.join(map(repr, extras._ids)), + )) # store an access error exception in existing records exc = AccessError( _('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \ From 33eb3dffb2bd3ac9d886a17c3c67ea83e65dcaa1 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 7 Jul 2014 11:50:30 +0200 Subject: [PATCH 2/8] [REM] models: remove the magic methods signal_XXX() --- addons/account/account_invoice.py | 2 +- addons/mrp/mrp.py | 4 ++-- addons/mrp/procurement.py | 2 +- addons/mrp/stock.py | 4 ++-- addons/point_of_sale/point_of_sale.py | 10 +++++----- addons/purchase/purchase.py | 16 ++++++++-------- .../purchase_requisition/purchase_requisition.py | 8 ++++---- addons/sale/wizard/sale_make_invoice.py | 2 +- addons/sale_stock/sale_stock.py | 4 ++-- .../sale_stock/test/cancel_order_sale_stock.yml | 2 +- addons/sale_stock/test/picking_order_policy.yml | 2 +- addons/stock/wizard/make_procurement_product.py | 2 +- addons/website_quote/controllers/main.py | 2 +- openerp/addons/base/ir/ir_actions.py | 4 ++-- openerp/models.py | 13 ------------- 15 files changed, 32 insertions(+), 45 deletions(-) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index ad99ae40058..455feb14afb 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -98,7 +98,7 @@ class account_invoice(models.Model): def _compute_reconciled(self): self.reconciled = self.test_paid() if not self.reconciled and self.state == 'paid': - self.signal_open_test() + self.signal_workflow('open_test') @api.model def _get_reference_type(self): diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 73d0688a543..453bfe5c458 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -884,7 +884,7 @@ class mrp_production(osv.osv): production = self.browse(cr, uid, production_id, context=context) if not production.move_lines and production.state == 'ready': # trigger workflow if not products to consume (eg: services) - self.signal_button_produce(cr, uid, [production_id]) + self.signal_workflow(cr, uid, [production_id], 'button_produce') produced_qty = self._get_produced_qty(cr, uid, production, context=context) @@ -944,7 +944,7 @@ class mrp_production(osv.osv): stock_mov_obj.action_done(cr, uid, [extra_move_id], context=context) self.message_post(cr, uid, production_id, body=_("%s produced") % self._description, context=context) - self.signal_button_produce_done(cr, uid, [production_id]) + self.signal_workflow(cr, uid, [production_id], 'button_produce_done') return True def _costs_generate(self, cr, uid, production): diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py index 50650b7b371..06eacc6a1a2 100644 --- a/addons/mrp/procurement.py +++ b/addons/mrp/procurement.py @@ -114,7 +114,7 @@ class procurement_order(osv.osv): procurement.refresh() self.production_order_create_note(cr, uid, procurement, context=context) production_obj.action_compute(cr, uid, [produce_id], properties=[x.id for x in procurement.property_ids]) - production_obj.signal_button_confirm(cr, uid, [produce_id]) + production_obj.signal_workflow(cr, uid, [produce_id], 'button_confirm') else: res[procurement.id] = False self.message_post(cr, uid, [procurement.id], body=_("No BoM exists for this product!"), context=context) diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py index e04c434a741..236fec019dd 100644 --- a/addons/mrp/stock.py +++ b/addons/mrp/stock.py @@ -159,7 +159,7 @@ class StockMove(osv.osv): 'consumed_for': consumed_for}, context=context) self.action_done(cr, uid, res, context=context) production_ids = production_obj.search(cr, uid, [('move_lines', 'in', [move.id])]) - production_obj.signal_button_produce(cr, uid, production_ids) + production_obj.signal_workflow(cr, uid, production_ids, button_produce) for new_move in res: if new_move != move.id: #This move is not already there in move lines of production order @@ -181,7 +181,7 @@ class StockMove(osv.osv): #If we are not scrapping our whole move, tracking and lot references must not be removed production_ids = production_obj.search(cr, uid, [('move_lines', 'in', [move.id])]) for prod_id in production_ids: - production_obj.signal_button_produce(cr, uid, [prod_id]) + production_obj.signal_workflow(cr, uid, [prod_id], 'button_produce') for new_move in new_moves: production_obj.write(cr, uid, production_ids, {'move_lines': [(4, new_move)]}) res.append(new_move) diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 1eec3cb48d4..5c8103c7626 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -497,7 +497,7 @@ class pos_session(osv.osv): _('Error!'), _("You cannot confirm all orders of this session, because they have not the 'paid' status")) else: - pos_order_obj.signal_done(cr, uid, [order.id]) + pos_order_obj.signal_workflow(cr, uid, [order.id], 'done') return True @@ -581,14 +581,14 @@ class pos_order(osv.osv): order_ids.append(order_id) try: - self.signal_paid(cr, uid, [order_id]) + self.signal_workflow(cr, uid, [order_id], 'paid') except Exception as e: _logger.error('Could not fully process the POS Order: %s', tools.ustr(e)) if to_invoice: self.action_invoice(cr, uid, [order_id], context) order_obj = self.browse(cr, uid, order_id, context) - self.pool['account.invoice'].signal_invoice_open(cr, uid, [order_obj.invoice_id.id]) + self.pool['account.invoice'].signal_workflow(cr, uid, [order_obj.invoice_id.id], 'invoice_open') return order_ids @@ -933,8 +933,8 @@ class pos_order(osv.osv): inv_line['invoice_line_tax_id'] = [(6, 0, [x.id for x in line.product_id.taxes_id] )] inv_line_ref.create(cr, uid, inv_line, context=context) inv_ref.button_reset_taxes(cr, uid, [inv_id], context=context) - self.signal_invoice(cr, uid, [order.id]) - inv_ref.signal_validate(cr, uid, [inv_id]) + self.signal_workflow(cr, uid, [order.id], 'invoice') + inv_ref.signal_workflow(cr, uid, [inv_id], 'validate') if not inv_ids: return {} diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index e8622de493d..da14954d4a0 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -328,7 +328,7 @@ class purchase_order(osv.osv): raise osv.except_osv(_('Invalid Action!'), _('In order to delete a purchase order, you must cancel it first.')) # automatically sending subflow.delete upon deletion - self.signal_purchase_cancel(cr, uid, unlink_ids) + self.signal_workflow(cr, uid, unlink_ids, 'purchase_cancel') return super(purchase_order, self).unlink(cr, uid, unlink_ids, context=context) @@ -519,7 +519,7 @@ class purchase_order(osv.osv): This function prints the request for quotation and mark it as sent, so that we can see more easily the next step of the workflow ''' assert len(ids) == 1, 'This option should only be used for a single id at a time' - self.signal_send_rfq(cr, uid, ids) + self.signal_workflow(cr, uid, ids, 'send_rfq') return self.pool['report'].get_action(cr, uid, ids, 'purchase.report_purchasequotation', context=context) def wkf_confirm_order(self, cr, uid, ids, context=None): @@ -680,19 +680,19 @@ class purchase_order(osv.osv): _('Unable to cancel the purchase order %s.') % (purchase.name), _('First cancel all receptions related to this purchase order.')) self.pool.get('stock.picking') \ - .signal_button_cancel(cr, uid, map(attrgetter('id'), purchase.picking_ids)) + .signal_workflow(cr, uid, map(attrgetter('id'), purchase.picking_ids), 'button_cancel') for inv in purchase.invoice_ids: if inv and inv.state not in ('cancel', 'draft'): raise osv.except_osv( _('Unable to cancel this purchase order.'), _('You must first cancel all invoices related to this purchase order.')) self.pool.get('account.invoice') \ - .signal_invoice_cancel(cr, uid, map(attrgetter('id'), purchase.invoice_ids)) + .signal_workflow(cr, uid, map(attrgetter('id'), purchase.invoice_ids), 'invoice_cancel') self.pool['purchase.order.line'].write(cr, uid, [l.id for l in purchase.order_line], {'state': 'cancel'}) self.write(cr, uid, ids, {'state': 'cancel'}) self.set_order_line_status(cr, uid, ids, 'cancel', context=context) - self.signal_purchase_cancel(cr, uid, ids) + self.signal_workflow(cr, uid, ids, 'purchase_cancel') return True def _prepare_order_line_move(self, cr, uid, order, order_line, picking_id, group_id, context=None): @@ -933,7 +933,7 @@ class purchase_order(osv.osv): # make triggers pointing to the old orders point to the new order for old_id in old_ids: self.redirect_workflow(cr, uid, [(old_id, neworder_id)]) - self.signal_purchase_cancel(cr, uid, [old_id]) + self.signal_workflow(cr, uid, [old_id], 'purchase_cancel') return orders_info @@ -1370,7 +1370,7 @@ class mail_mail(osv.Model): if mail_sent and mail.model == 'purchase.order': obj = self.pool.get('purchase.order').browse(cr, uid, mail.res_id, context=context) if obj.state == 'draft': - self.pool.get('purchase.order').signal_send_rfq(cr, uid, [mail.res_id]) + self.pool.get('purchase.order').signal_workflow(cr, uid, [mail.res_id], 'send_rfq') return super(mail_mail, self)._postprocess_sent_message(cr, uid, mail=mail, context=context, mail_sent=mail_sent) @@ -1423,7 +1423,7 @@ class mail_compose_message(osv.Model): context = context or {} if context.get('default_model') == 'purchase.order' and context.get('default_res_id'): context = dict(context, mail_post_autofollow=True) - self.pool.get('purchase.order').signal_send_rfq(cr, uid, [context['default_res_id']]) + self.pool.get('purchase.order').signal_workflow(cr, uid, [context['default_res_id']], 'send_rfq') return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context) diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index a4908f23687..954547cb5b5 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -245,7 +245,7 @@ class purchase_requisition(osv.osv): for quotation in tender.purchase_ids: if (self.check_valid_quotation(cr, uid, quotation, context=context)): #use workflow to set PO state to confirm - po.signal_purchase_confirm(cr, uid, [quotation.id]) + po.signal_workflow(cr, uid, [quotation.id], 'purchase_confirm') #get other confirmed lines per supplier for po_line in tender.po_line_ids: @@ -268,13 +268,13 @@ class purchase_requisition(osv.osv): vals = self._prepare_po_line_from_tender(cr, uid, tender, line, new_po, context=context) poline.copy(cr, uid, line.id, default=vals, context=context) #use workflow to set new PO state to confirm - po.signal_purchase_confirm(cr, uid, [new_po]) + po.signal_workflow(cr, uid, [new_po], 'purchase_confirm') #cancel other orders self.cancel_unconfirmed_quotations(cr, uid, tender, context=context) #set tender to state done - self.signal_done(cr, uid, [tender.id]) + self.signal_workflow(cr, uid, [tender.id], 'done') return True def cancel_unconfirmed_quotations(self, cr, uid, tender, context=None): @@ -282,7 +282,7 @@ class purchase_requisition(osv.osv): po = self.pool.get('purchase.order') for quotation in tender.purchase_ids: if quotation.state in ['draft', 'sent', 'bid']: - self.pool.get('purchase.order').signal_purchase_cancel(cr, uid, [quotation.id]) + self.pool.get('purchase.order').signal_workflow(cr, uid, [quotation.id], 'purchase_cancel') po.message_post(cr, uid, [quotation.id], body=_('Cancelled by the call for bids associated to this request for quotation.'), context=context) return True diff --git a/addons/sale/wizard/sale_make_invoice.py b/addons/sale/wizard/sale_make_invoice.py index 170259824f7..073c2481160 100644 --- a/addons/sale/wizard/sale_make_invoice.py +++ b/addons/sale/wizard/sale_make_invoice.py @@ -60,7 +60,7 @@ class sale_make_invoice(osv.osv_memory): for i in o.invoice_ids: newinv.append(i.id) # Dummy call to workflow, will not create another invoice but bind the new invoice to the subflow - order_obj.signal_manual_invoice(cr, uid, [o.id for o in orders if o.order_policy == 'manual']) + order_obj.signal_workflow(cr, uid, [o.id for o in orders if o.order_policy == 'manual'], 'manual_invoice') result = mod_obj.get_object_reference(cr, uid, 'account', 'action_invoice_tree1') id = result and result[1] or False result = act_obj.read(cr, uid, [id], context=context)[0] diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 61183413a33..20bac48c562 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -159,7 +159,7 @@ class sale_order(osv.osv): raise osv.except_osv( _('Cannot cancel sales order!'), _('You must first cancel all delivery order(s) attached to this sales order.')) - stock_obj.signal_button_cancel(cr, uid, [p.id for p in sale.picking_ids]) + stock_obj.signal_workflow(cr, uid, [p.id for p in sale.picking_ids], 'button_cancel') return super(sale_order, self).action_cancel(cr, uid, ids, context=context) def action_wait(self, cr, uid, ids, context=None): @@ -356,7 +356,7 @@ class stock_move(osv.osv): if move.procurement_id and move.procurement_id.sale_line_id: sale_ids.append(move.procurement_id.sale_line_id.order_id.id) if sale_ids: - self.pool.get('sale.order').signal_ship_except(cr, uid, sale_ids) + self.pool.get('sale.order').signal_workflow(cr, uid, sale_ids, 'ship_except') return super(stock_move, self).action_cancel(cr, uid, ids, context=context) def _create_invoice_line_from_vals(self, cr, uid, move, invoice_line_vals, context=None): diff --git a/addons/sale_stock/test/cancel_order_sale_stock.yml b/addons/sale_stock/test/cancel_order_sale_stock.yml index 302cbf4a933..49835b064c9 100644 --- a/addons/sale_stock/test/cancel_order_sale_stock.yml +++ b/addons/sale_stock/test/cancel_order_sale_stock.yml @@ -76,7 +76,7 @@ !python {model: sale.order}: | invoice_ids = self.browse(cr, uid, ref("sale.sale_order_8")).invoice_ids first_invoice_id = invoice_ids[0] - self.pool.get('account.invoice').signal_invoice_cancel(cr, uid, [first_invoice_id.id]) + self.pool.get('account.invoice').signal_workflow(cr, uid, [first_invoice_id.id], 'invoice_cancel') - I check order status in "Invoice Exception" and related invoice is in cancel state. - diff --git a/addons/sale_stock/test/picking_order_policy.yml b/addons/sale_stock/test/picking_order_policy.yml index 57ba0323b4c..8de8ea45a08 100644 --- a/addons/sale_stock/test/picking_order_policy.yml +++ b/addons/sale_stock/test/picking_order_policy.yml @@ -190,7 +190,7 @@ so = self.browse(cr, uid, ref("sale_order_service")) account_invoice_obj = self.pool.get('account.invoice') for invoice in so.invoice_ids: - account_invoice_obj.signal_invoice_open(cr, uid, [invoice.id]) + account_invoice_obj.signal_workflow(cr, uid, [invoice.id], 'invoice_open') - I pay the invoice - diff --git a/addons/stock/wizard/make_procurement_product.py b/addons/stock/wizard/make_procurement_product.py index 73dda6bbb3e..5c6f4b618ee 100644 --- a/addons/stock/wizard/make_procurement_product.py +++ b/addons/stock/wizard/make_procurement_product.py @@ -76,7 +76,7 @@ class make_procurement(osv.osv_memory): 'location_id': wh.lot_stock_id.id, 'company_id': wh.company_id.id, }) - procurement_obj.signal_button_confirm(cr, uid, [procure_id]) + procurement_obj.signal_workflow(cr, uid, [procure_id], 'button_confirm') id2 = data_obj._get_id(cr, uid, 'procurement', 'procurement_tree_view') id3 = data_obj._get_id(cr, uid, 'procurement', 'procurement_form_view') diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py index 522a613bdff..8fab07fcce2 100644 --- a/addons/website_quote/controllers/main.py +++ b/addons/website_quote/controllers/main.py @@ -65,7 +65,7 @@ class sale_quote(http.Controller): if token != order.access_token: return request.website.render('website.404') attachments=sign and [('signature.png', sign.decode('base64'))] or [] - order_obj.signal_order_confirm(request.cr, SUPERUSER_ID, [order_id], context=request.context) + order_obj.signal_workflow(request.cr, SUPERUSER_ID, [order_id], 'order_confirm', context=request.context) message = _('Order signed by %s') % (signer,) self.__message_post(message, order_id, type='comment', subtype='mt_comment', attachments=attachments) return True diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 7ac8783ddd9..c9195d93d12 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -848,9 +848,9 @@ class ir_actions_server(osv.osv): def run_action_trigger(self, cr, uid, action, eval_context=None, context=None): """ Trigger a workflow signal, depending on the use_relational_model: - - `base`: base_model_pool.signal_(cr, uid, context.get('active_id')) + - `base`: base_model_pool.signal_workflow(cr, uid, context.get('active_id'), ) - `relational`: find the related model and object, using the relational - field, then target_model_pool.signal_(cr, uid, target_id) + field, then target_model_pool.signal_workflow(cr, uid, target_id, ) """ obj_pool = self.pool[action.model_id.model] if action.use_relational_model == 'base': diff --git a/openerp/models.py b/openerp/models.py index 86d702ef582..a87ab3e8b23 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -4937,19 +4937,6 @@ class BaseModel(object): """ stuff to do right after the registry is built """ pass - def __getattr__(self, name): - if name.startswith('signal_'): - # self.signal_XXX() sends signal XXX to the record's workflow - signal_name = name[7:] - assert signal_name - return (lambda *args, **kwargs: - self.signal_workflow(*args, signal=signal_name, **kwargs)) - - get = getattr(super(BaseModel, self), '__getattr__', None) - if get is None: - raise AttributeError("%r has no attribute %r" % (type(self).__name__, name)) - return get(name) - def _patch_method(self, name, method): """ Monkey-patch a method for all instances of this model. This replaces the method called `name` by `method` in `self`'s class. From 630580df7f9e9e8d82799fd138fb2ecb49a77a2c Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 7 Jul 2014 13:12:37 +0200 Subject: [PATCH 3/8] [FIX] signal_XXX -> signal_workflow: forgot quotes around signal name --- addons/mrp/stock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py index 236fec019dd..2718b77d051 100644 --- a/addons/mrp/stock.py +++ b/addons/mrp/stock.py @@ -159,7 +159,7 @@ class StockMove(osv.osv): 'consumed_for': consumed_for}, context=context) self.action_done(cr, uid, res, context=context) production_ids = production_obj.search(cr, uid, [('move_lines', 'in', [move.id])]) - production_obj.signal_workflow(cr, uid, production_ids, button_produce) + production_obj.signal_workflow(cr, uid, production_ids, 'button_produce') for new_move in res: if new_move != move.id: #This move is not already there in move lines of production order From 831b85778c8ac7fc08ba2525689515009c59b8bb Mon Sep 17 00:00:00 2001 From: hugosdsantos Date: Wed, 2 Jul 2014 17:07:00 +0100 Subject: [PATCH 4/8] [I18N] sale: fix pt translations "Ordem de Vendas" changed to "Ordem de Venda" (Rebase of PR #883) --- addons/sale/i18n/pt.po | 104 ++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/addons/sale/i18n/pt.po b/addons/sale/i18n/pt.po index 62208c9e84a..db2251e1c15 100644 --- a/addons/sale/i18n/pt.po +++ b/addons/sale/i18n/pt.po @@ -328,7 +328,7 @@ msgstr "Cancelada" #. module: sale #: view:sale.order.line:0 msgid "Sales Order Lines related to a Sales Order of mine" -msgstr "Linhas da ordem de vendas relacionadas com uma ordem de vendas minha" +msgstr "Linhas da ordem de venda relacionadas com uma ordem de venda minha" #. module: sale #: selection:sale.order,state:0 @@ -589,7 +589,7 @@ msgstr "Ordem de venda confirmada" #. module: sale #: view:sale.order:0 msgid "Sales Order that haven't yet been confirmed" -msgstr "Ordem de Vendas que ainda não foram confirmadas" +msgstr "Ordens de Venda que ainda não foram confirmadas" #. module: sale #: view:sale.order:0 @@ -898,11 +898,11 @@ msgid "" "1.The state of this sales order line is either \"draft\" or \"cancel\"!\n" "2.The Sales Order Line is Invoiced!" msgstr "" -"Fatura não pode ser criada para esta linha de Ordem de vendas devido a uma " +"Fatura não pode ser criada para esta linha de Ordem de venda devido a uma " "das seguintes razões:\n" -"1.O estado desta linha ordem de vendas esteja como \"Projeto\" ou " +"1.O estado desta linha de ordem de venda seja \"Projeto\" ou " "\"cancelada\"!\n" -"2.A linha da ordem de vendas é faturada!" +"2.A linha da ordem de venda é faturada!" #. module: sale #: view:sale.order.line.make.invoice:0 @@ -1092,7 +1092,7 @@ msgstr "Termos e condições" #: model:ir.ui.menu,name:sale.menu_sale_order #: view:sale.order:0 msgid "Sales Orders" -msgstr "Ordens de Vendas" +msgstr "Ordens de Venda" #. module: sale #: help:sale.order,amount_tax:0 @@ -1230,7 +1230,7 @@ msgid "" "if the shipping policy is 'Payment before Delivery'." msgstr "" "O vendedor cria uma fatura manualmente, se a política de entrega da ordem de " -"vendas é 'Entrega Manual em Processamento'. A fatura é criada " +" é 'Entrega Manual em Processamento'. A fatura é criada " "automaticamente se a política de entrega é 'Pagamento depois da Entrega'." #. module: sale @@ -1336,7 +1336,7 @@ msgstr "" #. module: sale #: help:sale.order,origin:0 msgid "Reference of the document that generated this sales order request." -msgstr "Da referência do documento que gerou a ordem do pedido de vendas." +msgstr "Da referência do documento que gerou a ordem do pedido de ." #. module: sale #: code:addons/sale/sale.py:955 @@ -1431,7 +1431,7 @@ msgstr "Faturas de clientes" #. module: sale #: model:process.node,note:sale.process_node_order0 msgid "Confirmed sales order to invoice." -msgstr "Confirmação da fatura da ordem de vendas." +msgstr "Confirmação da fatura da ordem de venda." #. module: sale #: field:sale.order.line,sequence:0 @@ -1505,7 +1505,7 @@ msgstr "Fatura" #. module: sale #: view:sale.order.line:0 msgid "My Sales Order Lines" -msgstr "Minhas linhas da ordem de vendas" +msgstr "Minhas linhas da ordens de venda" #. module: sale #: model:process.transition.action,name:sale.process_transition_action_cancel0 @@ -2034,7 +2034,7 @@ msgstr "" #. module: sale #: view:sale.report:0 msgid "Ordered month of the sales order" -msgstr "Ordenado pelo mês da ordem de vendas" +msgstr "Ordenado pelo mês da ordem de venda" #. module: sale #: model:process.transition,name:sale.process_transition_saleinvoice0 @@ -2054,7 +2054,7 @@ msgid "" "generates an invoice or a delivery order as soon as it is confirmed by the " "salesman." msgstr "" -"Dependendo da ordem de vendas e controle das faturas, estas pode ser " +"Dependendo da ordem de venda e controle das faturas, estas pode ser " "baseadas em entregas ou em quantidades encomendadas. Assim, uma ordem de " "venda pode gerar uma fatura ou uma ordem de entrega, assim que é confirmada " "pelo vendedor." @@ -2084,7 +2084,7 @@ msgstr "Termo do Pagamento" #. module: sale #: view:sale.order:0 msgid "Sales Order ready to be invoiced" -msgstr "Ordem de vendas pronta a ser faturada" +msgstr "Ordem de venda pronta a ser faturada" #. module: sale #: field:sale.config.settings,group_invoice_so_lines:0 @@ -2170,7 +2170,7 @@ msgstr "" #. module: sale #: view:sale.report:0 msgid "Ordered date of the sales order" -msgstr "Data do Pedido da ordem de vendas" +msgstr "Data do Pedido da ordem de venda" #~ msgid "Quantity (UoM)" #~ msgstr "Quantidade (UdM)" @@ -2474,7 +2474,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Contas de Pagamento" #~ msgid "Sales orders" -#~ msgstr "Ordens de Vendas" +#~ msgstr "Ordens de Venda" #~ msgid "Draft Invoice" #~ msgstr "Factura Rascunho" @@ -2598,7 +2598,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Somente Entregar Ordem de Venda" #~ msgid "Sales order lines" -#~ msgstr "Linhas da ordens de vendas" +#~ msgstr "Linhas de ordens de venda" #~ msgid "Packing OUT is created for stockable products." #~ msgstr "Saída de Embalagem é criada para produtos armazenáveis." @@ -2774,7 +2774,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Tem de associar um lote de produção a este artigo" #~ msgid "Margins in Sales Orders" -#~ msgstr "Fusão de ordens de vendas" +#~ msgstr "Fusão de ordens de venda" #~ msgid "You invoice has been successfully created!" #~ msgstr "A sua fatura foi criada com êxito!" @@ -2830,7 +2830,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Aprovisionamento do material vendido" #~ msgid "Sales Order Dates" -#~ msgstr "Datas da Ordem de Vendas" +#~ msgstr "Datas da Ordem de Venda" #~ msgid "Sales Application Configuration" #~ msgstr "Configuração da Aplicação de Vendas" @@ -2956,7 +2956,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ "directamente e aguardar que o utilizador clique no botão 'Factura' para " #~ "gerar a factura do projecto. \n" #~ " - A escolha 'Factura contra Entrega' irá gerar a factura com base em " -#~ "ordens de vendas, quando todas as listas de recolha forem concluídas.\n" +#~ "ordens de venda, quando todas as listas de recolha forem concluídas.\n" #~ " - A escolha 'Factura da Recolha' é usada para criar uma factura durante o " #~ "processo de recolha." @@ -2974,7 +2974,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ "For every sales order line, a procurement order is created to supply the " #~ "sold product." #~ msgstr "" -#~ "Para cada linha de pedido de vendas, uma ordem de aquisição é criada para " +#~ "Para cada linha de pedido de venda, uma ordem de aquisição é criada para " #~ "fornecer o artigo vendido." #~ msgid "Setup your sales workflow and default values." @@ -3008,10 +3008,10 @@ msgstr "Data do Pedido da ordem de vendas" #~ " " #~ msgstr "" #~ "\n" -#~ " O módulo base para gerir cotações e pedidos de vendas.\n" +#~ " O módulo base para gerir cotações e pedidos de venda.\n" #~ "\n" #~ " * Fluxo de trabalho com etapas de validação:\n" -#~ " - Cotação -> Ordem de Vendas -> Factura\n" +#~ " - Cotação -> Ordem de Venda -> Factura\n" #~ " * Métodos de facturação:\n" #~ " - Facturas ordenadas (antes ou depois do envio)\n" #~ " - Factura na entrega\n" @@ -3159,7 +3159,7 @@ msgstr "Data do Pedido da ordem de vendas" #, python-format #~ msgid "The sales order '%s' has been cancelled." -#~ msgstr "A ordem de vendas '%s' foi cancelada" +#~ msgstr "A ordem de venda '%s' foi cancelada" #~ msgid "" #~ "* The 'Draft' state is set when the related sales order in draft state. " @@ -3172,13 +3172,13 @@ msgstr "Data do Pedido da ordem de vendas" #~ " \n" #~ "* The 'Cancelled' state is set when a user cancel the sales order related." #~ msgstr "" -#~ "* O estado 'Rascunho' é definido quando a ordem de vendas relacionada se " +#~ "* O estado 'Rascunho' é definido quando a ordem de venda relacionada se " #~ "encontra em estado 'Rascunho'. \n" -#~ "* O estado 'Confirmado' é definido quando a ordem de vendas relacionada é " +#~ "* O estado 'Confirmado' é definido quando a ordem de venda relacionada é " #~ "confirmada. \n" #~ "* O estado 'Excepção' é definido quando a ordem relacionada é definida como " #~ "uma excepção. \n" -#~ "* O estado 'Feito' é definido quando a linha da ordem de vendas foi " +#~ "* O estado 'Feito' é definido quando a linha da ordem de venda foi " #~ "escolhida. \n" #~ "* O estado 'Cancelado' é definido quando o utilizador cancela a ordem de " #~ "vendar relacionada." @@ -3193,23 +3193,23 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Configure a aplicação da gerência de vendas" #~ msgid "Sales Order Layout Improvement" -#~ msgstr "Melhoria do Layout da Ordem vendas" +#~ msgstr "Melhoria do Layout da Ordem de venda" #~ msgid "" #~ "One Procurement order for each sales order line and for each of the " #~ "components." #~ msgstr "" -#~ "Uma ordem de Aquisições para cada linha de pedido de vendas e para cada um " +#~ "Uma ordem de Aquisições para cada linha de pedido de venda e para cada um " #~ "dos componentes." #, python-format #~ msgid "Cannot delete Sales Order(s) which are already confirmed !" #~ msgstr "" -#~ "Não é possível eliminar a(s) ordem(s) de vendas que já foram confirmadas !" +#~ "Não é possível eliminar a(s) ordem(s) de venda que já foram confirmadas !" #, python-format #~ msgid "The sales order '%s' has been set in draft state." -#~ msgstr "A ordem de vendas '%s' foi definida com o estado rascunho." +#~ msgstr "A ordem de venda '%s' foi definida com o estado rascunho." #~ msgid "" #~ "If you have more than one shop reselling your company products, you can " @@ -3243,7 +3243,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ "Provides some features to improve the layout of the Sales Order reports." #~ msgstr "" #~ "Fornece alguns recursos para melhorar a apresentação dos relatórios da Ordem " -#~ "de vendas." +#~ "de venda." #~ msgid "Based on Tasks' Work" #~ msgstr "Baseada nas tarefas' Trabalho" @@ -3264,7 +3264,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ "Sale Order Lines that are confirmed, done or in exception state and haven't " #~ "yet been invoiced" #~ msgstr "" -#~ "Linhas da ordem de vendas estão confirmadas, concluídas ou em estado de " +#~ "Linhas da ordem de venda estão confirmadas, concluídas ou em estado de " #~ "exceção e ainda não foram faturados" #~ msgid "Invoice based on deliveries" @@ -3304,7 +3304,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ "'para gerar o rascunho da fatura com base na ordem de venda ou as linhas da " #~ "ordem de venda.\n" #~ " - A opção 'Fatura após Entrega' irá gerar o rascunho da fatura baseada na " -#~ "ordem de vendas depois de todas as listas de picking terem sido terminadas.\n" +#~ "ordem de venda depois de todas as listas de picking terem sido terminadas.\n" #~ " - A opção 'Fatura baseada nas entregas' é usada para criar uma fatura " #~ "durante o processo de picking." @@ -3328,7 +3328,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Não pode mover os artigos de ou para um local de tipo vista." #~ msgid "Based on Sales Orders" -#~ msgstr "Baseado na ordem de vendas" +#~ msgstr "Baseado na ordem de venda" #~ msgid "Line Sequence" #~ msgstr "Sequência da linha" @@ -3371,7 +3371,7 @@ msgstr "Data do Pedido da ordem de vendas" #, python-format #~ msgid "Cannot delete a sales order line which is in state '%s'!" #~ msgstr "" -#~ "Não é possível excluir uma linha da ordem de vendas que esteja no estado " +#~ "Não é possível excluir uma linha da ordem de venda que esteja no estado " #~ "'%s'!" #, python-format @@ -3382,7 +3382,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Cobram a entrega?" #~ msgid "Sales order created in current month" -#~ msgstr "Ordens de vendas criadas este mês" +#~ msgstr "Ordens de venda criadas este mês" #~ msgid "" #~ "If 'on order', it triggers a procurement when the sale order is confirmed to " @@ -3403,7 +3403,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "${object.company_id.name} Order (Ref ${object.name or 'n/a' })" #~ msgid "Confirmed sale order lines, not yet delivered" -#~ msgstr "Linhas da ordem de vendas confirmadas, mas ainda não foram entregues" +#~ msgstr "Linhas da ordem de venda confirmadas, mas ainda não entregues" #~ msgid "Setup your Invoicing Method" #~ msgstr "Configure o seu método de faturação" @@ -3415,19 +3415,19 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Ordem de Impressão" #~ msgid "Sale order lines done" -#~ msgstr "Linhas da ordem de vendas concluídas" +#~ msgstr "Linhas da ordem de venda concluídas" #~ msgid "Sale Order Lines ready to be invoiced" -#~ msgstr "Linhas da ordem de vendas prontas para serem faturadas" +#~ msgstr "Linhas da ordem de venda prontas para serem faturadas" #~ msgid "Sale Order Lines that are in 'done' state" -#~ msgstr "Linhas da ordem de vendas que estejam no estado 'Concluído'" +#~ msgstr "Linhas da ordem de venda que estejam no estado 'Concluído'" #~ msgid "Main Method Based On" #~ msgstr "Métodos principais baseados" #~ msgid "Sales order created in current year" -#~ msgstr "Ordens de Vendas criadas este ano" +#~ msgstr "Ordens de Venda criadas este ano" #~ msgid "Contract/Analytic Account" #~ msgstr "Contrato / Conta Analítica" @@ -3450,7 +3450,7 @@ msgstr "Data do Pedido da ordem de vendas" #~ msgstr "Sem stock suficiente ! : " #~ msgid "Sales order created in last month" -#~ msgstr "Ordem de vendas criadas no mês passado" +#~ msgstr "Ordem de venda criadas no mês passado" #~ msgid "Deliver & invoice on demand" #~ msgstr "Entrega & Fatura a pedido" @@ -3467,8 +3467,8 @@ msgstr "Data do Pedido da ordem de vendas" #~ "sales orders partially, by lines of sales order. You do not need this list " #~ "if you invoice from the delivery orders or if you invoice sales totally." #~ msgstr "" -#~ "Aqui está uma lista de cada pedido de vendas a ser faturado. Pode faturar " -#~ "ordens de venda parcialmente, por linhas de pedido de vendas. Não precisa " +#~ "Aqui está uma lista de cada pedido de venda a ser faturado. Pode faturar " +#~ "ordens de venda parcialmente, por linhas de pedido de venda. Não precisa " #~ "desta lista se faturar os pedidos de entrega ou se facturar a venda " #~ "totalmente." @@ -3488,12 +3488,12 @@ msgstr "Data do Pedido da ordem de vendas" #~ "configuration of the sales order, a draft invoice will be generated so that " #~ "you just have to confirm it when you want to bill your customer." #~ msgstr "" -#~ "Pedidos de Vendas ajudá-lo a gerir citações e ordens de seus clientes. " +#~ "Ordens de Venda ajudam-no a gerir citações e ordens de seus clientes. " #~ "OpenERP sugere que se comece a criar um orçamento. Uma vez confirmada, a " #~ "cotação será convertida numa ordem de venda. O OpenERP pode gerir vários " #~ "tipos de artigos, possibilitando que uma ordem de venda desencadeie tarefas, " #~ "ordens de entrega, ordens de produção, compras e assim por diante. Com base " -#~ "na configuração da ordem de vendas, uma fatura projeto será gerada para que " +#~ "na configuração da ordem de venda, uma fatura projeto será gerada para que " #~ "só tenha que confirmar isso quando quiser faturar o cliente." #~ msgid "Order Line" @@ -3788,10 +3788,10 @@ msgstr "Data do Pedido da ordem de vendas" #~ "parts to the sales order. There is 1 pick list by sales order line which " #~ "evolves with the availability of parts." #~ msgstr "" -#~ "O formulário da Lista Pick é criado assim que a ordem de vendas é " +#~ "O formulário da Lista Pick é criado assim que a ordem de venda é " #~ "confirmada, ao mesmo tempo que a ordem de aquisição. Ele representa a " -#~ "atribuição de peças para a ordem de vendas. Há uma lista de seleção de linha " -#~ "da ordem de vendas que evolui com a disponibilidade das peças." +#~ "atribuição de peças para a ordem de venda. Há uma lista de seleção de linha " +#~ "da ordem de venda que evolui com a disponibilidade das peças." #~ msgid "Sales by Month" #~ msgstr "Vendas por mês" @@ -3802,14 +3802,14 @@ msgstr "Data do Pedido da ordem de vendas" #~ "production of products regarding to the rules and to the sales order's " #~ "parameters. " #~ msgstr "" -#~ "A ordem de aquisição é criada automaticamente, logo que uma ordem de vendas " +#~ "A ordem de aquisição é criada automaticamente, logo que uma ordem de venda " #~ "é confirmada ou a fatura é paga. Que impulsiona a compra e a produção de " -#~ "artigos em relação às regras e aos parâmetros da ordem de vendas. " +#~ "artigos em relação às regras e aos parâmetros da ordem de venda. " #, python-format #~ msgid "You must first cancel all invoices attached to this sales order." #~ msgstr "" -#~ "É necessário cancelar todas as faturas ligadas a esta ordem de vendas." +#~ "É necessário cancelar todas as faturas ligadas a esta ordem de venda." #~ msgid "Invoice Based on Deliveries" #~ msgstr "Fatura Baseada em Entregas" From 94d65557fcd8d8e5fa6344069993b585302692c0 Mon Sep 17 00:00:00 2001 From: Cedric Snauwaert Date: Mon, 7 Jul 2014 11:48:31 +0200 Subject: [PATCH 5/8] [FIX]menu bar: clean up css and few cosmetics --- .../static/src/css/attendance.css | 2 +- addons/im_chat/static/src/css/im_chat.css | 1 - addons/web/static/src/css/base.css | 180 ++++-------------- addons/web/static/src/css/base.sass | 137 +++---------- 4 files changed, 65 insertions(+), 255 deletions(-) diff --git a/addons/hr_attendance/static/src/css/attendance.css b/addons/hr_attendance/static/src/css/attendance.css index 2346e2b3a2d..767cfbc061a 100644 --- a/addons/hr_attendance/static/src/css/attendance.css +++ b/addons/hr_attendance/static/src/css/attendance.css @@ -1,3 +1,3 @@ .oe_systray #oe_attendance_sign_in_out_icon { - font-color: white; + color: white; } \ No newline at end of file diff --git a/addons/im_chat/static/src/css/im_chat.css b/addons/im_chat/static/src/css/im_chat.css index ce32d7d4597..6f76ceae193 100644 --- a/addons/im_chat/static/src/css/im_chat.css +++ b/addons/im_chat/static/src/css/im_chat.css @@ -14,7 +14,6 @@ /* button */ .oe_systray #oe_topbar_imbutton_icon { color: white; - margin-right: 10px; } .oe_topbar_item.oe_topbar_imbutton .oe_e { position: relative; diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index acdcc0a95aa..b76bee29a59 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -8,7 +8,6 @@ font-weight: normal; font-style: normal; } - @font-face { font-family: "EntypoRegular"; src: url("/web/static/src/font/entypo-webfont.eot") format("eot"); @@ -19,7 +18,6 @@ font-weight: normal; font-style: normal; } - #oe_main_menu_navbar { min-height: 34px; z-index: 1001; @@ -39,6 +37,39 @@ margin-bottom: 0px; } +.oe_systray { + margin-right: 0px !important; +} + +.oe_notification { + z-index: 1600; +} + +.oe_webclient_timezone_notification a { + color: white; + text-decoration: underline; +} +.oe_webclient_timezone_notification p { + margin-top: 1em; +} +.oe_webclient_timezone_notification dt { + font-weight: bold; +} + +.oe_timezone_systray span { + margin-top: 1px; + background-color: #f6cf3b; +} + +.navbar .oe_topbar_name { + max-width: 150px; + display: inline-block; + height: 15px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + .openerp { padding: 0; margin: 0; @@ -800,23 +831,6 @@ border-bottom-right-radius: 8px; border-bottom-left-radius: 8px; } -.openerp .oe_notification { - z-index: 1500; -} -.openerp .oe_webclient_timezone_notification a { - color: white; - text-decoration: underline; -} -.openerp .oe_webclient_timezone_notification p { - margin-top: 1em; -} -.openerp .oe_webclient_timezone_notification dt { - font-weight: bold; -} -.openerp .oe_timezone_systray span { - margin-top: 1px; - background-color: #f6cf3b; -} .openerp .oe_dialog_warning { width: 100%; } @@ -847,133 +861,6 @@ .openerp .oe_content_full_screen .oe_topbar, .openerp .oe_content_full_screen .oe_leftbar { display: none; } -.openerp .navbar .oe_topbar_anonymous_login { - background-color: #dc5f59; - color: #eeeeee; - background-color: #be4343; - background-image: -webkit-gradient(linear, left top, left bottom, from(#fc8787), to(maroon)); - background-image: -webkit-linear-gradient(top, #fc8787, maroon); - background-image: -moz-linear-gradient(top, #fc8787, maroon); - background-image: -ms-linear-gradient(top, #fc8787, maroon); - background-image: -o-linear-gradient(top, #fc8787, maroon); - background-image: linear-gradient(to bottom, #fc8787, #800000); -} -.openerp .navbar .oe_topbar_anonymous_login a { - display: block; - padding: 5px 10px 7px; - line-height: 20px; - height: 30px; - text-decoration: none; - color: white; - background: transparent; - -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 .navbar .oe_topbar_anonymous_login a:hover { - background: rgba(0, 0, 0, 0.1); - color: white; - text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2); - -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 .navbar .oe_topbar_item { - display: block; - padding: 5px 10px 26px; - 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 .navbar .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 .navbar .oe_topbar_avatar { - width: 24px; - height: 24px; - margin: -2px 2px 0 0; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} -.openerp .navbar .oe_topbar_avatar { - vertical-align: top; -} -.openerp .navbar .oe_dropdown_arrow:after { - border-top: 4px solid white; -} -.openerp .navbar .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 2px 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 .navbar .dropdown_menu li { - float: none; - padding: 3px 12px; -} -.openerp .navbar .dropdown_menu li a { - color: #eeeeee; -} -.openerp .navbar .dropdown_menu li:hover { - background-color: #212121; - 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 .navbar .oe_topbar_name { - max-width: 150px; - display: inline-block; - height: 15px; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.openerp .nav li a { - padding: 6px 8px 4px 8px; -} -.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_leftbar { display: none; width: 220px; @@ -3114,7 +3001,6 @@ top: 0px; } } - .kitten-mode-activated { background-size: cover; background-attachment: fixed; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index b806c32ffc2..f1f948170e5 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -158,6 +158,37 @@ $sheet-padding: 16px #oe_main_menu_navbar.navbar margin-bottom: 0px +.oe_systray + margin-right: 0px !important + +// Notifications {{{ +.oe_notification + z-index: 1600 + +.oe_webclient_timezone_notification + a + color: white + text-decoration: underline + p + margin-top: 1em + dt + font-weight: bold +.oe_timezone_systray + span + margin-top: 1px + background-color: #f6cf3b +// }}} +// Top Menu {{{ +.navbar + .oe_topbar_name + max-width: 150px + display: inline-block + height: 15px // Customize to manage caret when topbar_name is over sized. + text-overflow: ellipsis + white-space: nowrap + overflow: hidden // Customize to bring ellipsis when topbar_name is over sized. +// }}} + .openerp // Global style {{{ padding: 0 @@ -690,23 +721,6 @@ $sheet-padding: 16px border-bottom-right-radius: 8px border-bottom-left-radius: 8px // }}} - // Notifications {{{ - .oe_notification - z-index: 1500 - - .oe_webclient_timezone_notification - a - color: white - text-decoration: underline - p - margin-top: 1em - dt - font-weight: bold - .oe_timezone_systray - span - margin-top: 1px - background-color: #f6cf3b - // }}} // CrashManager {{{ .oe_dialog_warning width: 100% @@ -738,95 +752,6 @@ $sheet-padding: 16px .oe_topbar, .oe_leftbar display: none // }}} - // Top Menu {{{ - .navbar - .oe_topbar_anonymous_login - background-color: #dc5f59 - color: #eeeeee - @include vertical-gradient(#FC8787, #800000) - a - display: block - padding: 5px 10px 7px - line-height: 20px - height: 30px - text-decoration: none - color: white - background: transparent - @include transition(all 0.2s ease-out) - a:hover - background: rgba(0,0,0,0.1) - color: white - text-shadow: 0px 0px 3px rgba(0,0,0,0.2) - @include box-shadow(0 1px 2px rgba(0,0,0,0.2) inset) - .oe_topbar_item - display: block - padding: 5px 10px 26px - line-height: 20px - height: 20px - text-decoration: none - color: #eee - vertical-align: top - text-shadow: 0 1px 1px rgba(0,0,0,0.2) - @include transition(all 0.2s ease-out) - &:hover - background: rgba(0,0,0,0.2) - text-shadow: black 0px 0px 3px - color: white - @include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset) - - .oe_topbar_avatar - width: 24px - height: 24px - margin: -2px 2px 0 0 - @include radius(3px) - .oe_topbar_avatar - vertical-align: top - .oe_dropdown_arrow:after - border-top: 4px solid white - .dropdown_menu - top: 32px - background: #333 - background: rgba(37,37,37,0.9) - border-color: #999 - border-color: rgba(0, 0, 0, 0.2) - border-style: solid - border-width: 0 2px 1px - @include radius(0 0 6px 6px) - @include background-clip() - li - float: none - padding: 3px 12px - a - color: #eee - &:hover - @include vertical-gradient(#292929, #191919) - @include box-shadow(none) - .oe_topbar_name - max-width: 150px - display: inline-block - height: 15px // Customize to manage caret when topbar_name is over sized. - text-overflow: ellipsis - white-space: nowrap - overflow: hidden // Customize to bring ellipsis when topbar_name is over sized. - - // oe menu is the list of the buttons on the left side of the bar. - // So why aren't the buttons oe_topbar_items ? This sad state of affairs - // is a leftover from an uncomplete refactoring when the left and top menu - // were merged. You are welcome to refactor and clean this up - .nav li a - padding: 6px 8px 4px 8px - - .oe_user_menu - float: right - padding: 0 - margin: 0 - li - list-style-type: none - float: left - .oe_dropdown_menu - right: -1px - - // }}} // Webclient.leftbar {{{ .oe_leftbar display: none From ccc211fa51ef6cc136e651cfc2f1e649375382d7 Mon Sep 17 00:00:00 2001 From: krnkris Date: Mon, 7 Jul 2014 10:18:58 +0200 Subject: [PATCH 6/8] [I18N] base: fix Hungarian translations (Manual rebase of #956, pending update in Launchpad translations) --- openerp/addons/base/i18n/hu.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/i18n/hu.po b/openerp/addons/base/i18n/hu.po index f4e7144d762..4cf4f5d05f1 100644 --- a/openerp/addons/base/i18n/hu.po +++ b/openerp/addons/base/i18n/hu.po @@ -8,7 +8,7 @@ msgstr "" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" "PO-Revision-Date: 2013-11-24 14:57+0000\n" -"Last-Translator: krnkris \n" +"Last-Translator: krnkris \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -103,7 +103,7 @@ msgstr "Indiai bérszámfejtés" #: help:ir.cron,model:0 msgid "" "Model name on which the method to be called is located, e.g. 'res.partner'." -msgstr "Modell név ahogyan az megnevezve megtalálható, p.l. 'res.partner'." +msgstr "Modell név elnevezése szerint megtalálható, p.l. 'res.partner'." #. module: base #: view:ir.module.module:0 @@ -4000,7 +4000,7 @@ msgstr "Időszakos értékelések, Felbecsülések, Felmérések" #: model:ir.actions.act_window,name:base.ir_property_form #: model:ir.ui.menu,name:base.menu_ir_property_form_all msgid "Configuration Parameters" -msgstr "Konfiguráció Paraméterek" +msgstr "Beállítási Paaraméterek" #. module: base #: constraint:ir.cron:0 @@ -4171,9 +4171,9 @@ msgid "" "separated list of valid field names (optionally followed by asc/desc for the " "direction)" msgstr "" -"Invalid \"order\" specified. A valid \"order\" specification is a comma-" -"separated list of valid field names (optionally followed by asc/desc for the " -"direction)" +"Érvénytelen \"megrendelés\" meghatározás. Az érvénnyes \"megrendelés\" egy vesszővel" +"elválasztott lista érvényes mező nevekkel (választhatóan növekvő/csökkenő sorrendbe " +"állítva)" #. module: base #: model:ir.model,name:base.model_ir_module_module_dependency @@ -4217,7 +4217,7 @@ msgstr "" #. module: base #: model:res.groups,name:base.group_survey_user msgid "Survey / User" -msgstr "Felmérés / felhasználó" +msgstr "Felmérés / Felhasználó" #. module: base #: view:ir.module.module:0 From 47dd44be4305efe08f2f287e8228c5f892fad4c8 Mon Sep 17 00:00:00 2001 From: jkei Date: Mon, 7 Jul 2014 14:24:05 +0200 Subject: [PATCH 7/8] [FIX] account: typo in get_fiscal_position() Fixes #971: File "/Users/keje/src/odoo/addons/account/partner.py", line 107, in get_fiscal_position return part.property_account_position.id NameError: global name 'part' is not defined --- addons/account/partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/partner.py b/addons/account/partner.py index afbd9114c10..8c47967b44c 100644 --- a/addons/account/partner.py +++ b/addons/account/partner.py @@ -104,7 +104,7 @@ class account_fiscal_position(osv.osv): # partner manually set fiscal position always win if partner.property_account_position: - return part.property_account_position.id + return partner.property_account_position.id # if no delivery use invocing if delivery_id: From 139d868c9403b529e4a3d512e480208853e66246 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Mon, 7 Jul 2014 15:25:07 +0200 Subject: [PATCH 8/8] [REL] 8.0 RC1 --- openerp/release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/release.py b/openerp/release.py index 1a9c863660c..8cc3235bfdf 100644 --- a/openerp/release.py +++ b/openerp/release.py @@ -30,7 +30,7 @@ RELEASE_LEVELS_DISPLAY = {ALPHA: ALPHA, # properly comparable using normal operarors, for example: # (6,1,0,'beta',0) < (6,1,0,'candidate',1) < (6,1,0,'candidate',2) # (6,1,0,'candidate',2) < (6,1,0,'final',0) < (6,1,2,'final',0) -version_info = (8, 0, 0, ALPHA, 1) +version_info = (8, 0, 0, RELEASE_CANDIDATE, 1) version = '.'.join(map(str, version_info[:2])) + RELEASE_LEVELS_DISPLAY[version_info[3]] + str(version_info[4] or '') series = serie = major_version = '.'.join(map(str, version_info[:2]))