diff --git a/addons/account/wizard/wizard_tax_adjustments.py b/addons/account/wizard/wizard_tax_adjustments.py index 8c5002347c01f83e4b3f6b0e0d59fbe0ba02c293..22d2235ef04f7f1d3f11465dc6792f745af3ea24 100644 --- a/addons/account/wizard/wizard_tax_adjustments.py +++ b/addons/account/wizard/wizard_tax_adjustments.py @@ -18,24 +18,26 @@ class TaxAdjustments(models.TransientModel): debit_account_id = fields.Many2one('account.account', string='Debit account', required=True, domain=[('deprecated', '=', False)]) credit_account_id = fields.Many2one('account.account', string='Credit account', required=True, domain=[('deprecated', '=', False)]) amount = fields.Monetary(currency_field='company_currency_id', required=True) + adjustment_type = fields.Selection([('debit', 'Adjustment in favor of the Estate'), ('credit', 'Adjustment in your favor')], string="Adjustment Type", store=False, required=True) company_currency_id = fields.Many2one('res.currency', readonly=True, default=lambda self: self.env.user.company_id.currency_id) tax_id = fields.Many2one('account.tax', string='Adjustment Tax', ondelete='restrict', domain=[('type_tax_use', '=', 'none'), ('tax_adjustment', '=', True)], required=True) @api.multi def _create_move(self): + adjustment_type = self.env.context.get('adjustment_type', (self.amount > 0.0 and 'debit' or 'credit')) debit_vals = { 'name': self.reason, - 'debit': self.amount, + 'debit': abs(self.amount), 'credit': 0.0, 'account_id': self.debit_account_id.id, - 'tax_line_id': self.tax_id.id, + 'tax_line_id': adjustment_type == 'debit' and self.tax_id.id or False, } credit_vals = { 'name': self.reason, 'debit': 0.0, - 'credit': self.amount, + 'credit': abs(self.amount), 'account_id': self.credit_account_id.id, - 'tax_line_id': self.tax_id.id, + 'tax_line_id': adjustment_type == 'credit' and self.tax_id.id or False, } vals = { 'journal_id': self.journal_id.id, @@ -48,6 +50,13 @@ class TaxAdjustments(models.TransientModel): return move.id @api.multi + def create_move_debit(self): + return self.with_context(adjustment_type='debit').create_move() + + @api.multi + def create_move_credit(self): + return self.with_context(adjustment_type='credit').create_move() + def create_move(self): #create the adjustment move move_id = self._create_move() diff --git a/addons/account/wizard/wizard_tax_adjustments_view.xml b/addons/account/wizard/wizard_tax_adjustments_view.xml index 3d4ed0a9e9a6a0bb6671b4a1dbe5132f18555e7c..dba164388b90e3c39802d9a59890f998f8f34d1f 100644 --- a/addons/account/wizard/wizard_tax_adjustments_view.xml +++ b/addons/account/wizard/wizard_tax_adjustments_view.xml @@ -12,6 +12,7 @@ <group> <group> <field name="amount"/> + <field name="adjustment_type"/> </group> <group> <field name="tax_id" widget="selection"/> @@ -26,8 +27,14 @@ </group> </group> <footer> - <button name="create_move" string="Create and post move" type="object" default_focus="1" class="oe_highlight"/> + <div attrs="{'invisible': [('adjustment_type', '=', 'credit')]}"> + <button name="create_move_debit" string="Create and post move" type="object" default_focus="1" class="oe_highlight"/> <button string="Cancel" class="btn btn-default" special="cancel" /> + </div> + <div attrs="{'invisible': [('adjustment_type', '!=', 'credit')]}"> + <button name="create_move_credit" string="Create and post move" type="object" default_focus="1" class="oe_highlight"/> + <button string="Cancel" class="btn btn-default" special="cancel" /> + </div> </footer> </form> </field> diff --git a/addons/account_asset/models/account_asset.py b/addons/account_asset/models/account_asset.py index 8d4119659f17b68a9425f37e29e40beb33e59495..75d5467a94d91430c46c3b68c9ccfc0ca7fa113e 100644 --- a/addons/account_asset/models/account_asset.py +++ b/addons/account_asset/models/account_asset.py @@ -416,7 +416,7 @@ class AccountAssetAsset(models.Model): @api.model def create(self, vals): asset = super(AccountAssetAsset, self.with_context(mail_create_nolog=True)).create(vals) - asset.compute_depreciation_board() + asset.sudo().compute_depreciation_board() return asset @api.multi diff --git a/addons/hr_timesheet/report/report_timesheet_templates.xml b/addons/hr_timesheet/report/report_timesheet_templates.xml index e6d0f0905cffa9cbd72d8022b2106bfe605c63cc..fea714a5d7a26ccec303de1d6e7829a6db26ba5a 100644 --- a/addons/hr_timesheet/report/report_timesheet_templates.xml +++ b/addons/hr_timesheet/report/report_timesheet_templates.xml @@ -36,7 +36,7 @@ <span t-field="l.user_id.partner_id.name"/> </td> <td > - <span t-field="l.name"/> + <span t-field="l.name" t-options="{'widget': 'text'}"/> </td> <td t-if="show_task or show_project"> <t t-if="show_project"><span t-field="l.project_id.name"/></t> @@ -72,4 +72,4 @@ name="hr_timesheet.report_timesheet" file="report_timesheet" /> -</odoo> \ No newline at end of file +</odoo> diff --git a/addons/http_routing/geoipresolver.py b/addons/http_routing/geoipresolver.py new file mode 100644 index 0000000000000000000000000000000000000000..1f9b0e2272453753afe131450670ca9d136ec9aa --- /dev/null +++ b/addons/http_routing/geoipresolver.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import os.path + +try: + import GeoIP # Legacy +except ImportError: + GeoIP = None + +try: + import geoip2 + import geoip2.database +except ImportError: + geoip2 = None + +class GeoIPResolver(object): + def __init__(self, fname): + self.fname = fname + try: + self._db = geoip2.database.Reader(fname) + self.version = 2 + except Exception: + try: + self._db = GeoIP.open(fname, GeoIP.GEOIP_STANDARD) + self.version = 1 + assert self._db.database_info is not None + except Exception: + raise ValueError('Invalid GeoIP database: %r' % fname) + + def __del__(self): + if self.version == 2: + self._db.close() + + @classmethod + def open(cls, fname): + if not GeoIP and not geoip2: + return None + if not os.path.exists(fname): + return None + return GeoIPResolver(fname) + + def resolve(self, ip): + if self.version == 1: + return self._db.record_by_addr(ip) or {} + elif self.version == 2: + try: + r = self._db.city(ip) + except (ValueError, geoip2.errors.AddressNotFoundError): + return {} + return { + 'city': r.city.name, + 'country_code': r.country.iso_code, + 'country_name': r.country.name, + 'region': r.subdivisions[0].iso_code if r.subdivisions else None, + 'time_zone': r.location.time_zone, + } + + # compat + def record_by_addr(self, addr): + return self.resolve(addr) diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index 344b3b525672d80e6c8e511bd810ff939a865718..0129bc90e6d2c10b061b3ee35247f691bebd1783 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -18,6 +18,8 @@ from odoo.addons.base.ir.ir_http import RequestUID, ModelConverter from odoo.http import request from odoo.tools import config, ustr, pycompat +from ..geoipresolver import GeoIPResolver + _logger = logging.getLogger(__name__) # global resolver (GeoIP API is thread-safe, for multithreaded workers) @@ -265,25 +267,18 @@ class IrHttp(models.AbstractModel): # Lazy init of GeoIP resolver if odoo._geoip_resolver is not None: return + geofile = config.get('geoip_database') try: - import GeoIP - # updated database can be downloaded on MaxMind website - # http://dev.maxmind.com/geoip/legacy/install/city/ - geofile = config.get('geoip_database') - if os.path.exists(geofile): - odoo._geoip_resolver = GeoIP.open(geofile, GeoIP.GEOIP_STANDARD) - else: - odoo._geoip_resolver = False - _logger.warning('GeoIP database file %r does not exists, apt-get install geoip-database-contrib or download it from http://dev.maxmind.com/geoip/legacy/install/city/', geofile) - except ImportError: - odoo._geoip_resolver = False + odoo._geoip_resolver = GeoIPResolver.open(geofile) or False + except Exception as e: + _logger.warning('Cannot load GeoIP: %s', ustr(e)) @classmethod def _geoip_resolve(cls): if 'geoip' not in request.session: record = {} if odoo._geoip_resolver and request.httprequest.remote_addr: - record = odoo._geoip_resolver.record_by_addr(request.httprequest.remote_addr) or {} + record = odoo._geoip_resolver.resolve(request.httprequest.remote_addr) or {} request.session['geoip'] = record @classmethod diff --git a/addons/payment_stripe/models/payment.py b/addons/payment_stripe/models/payment.py index 2d3cec0c312a775b3721ee19bf8ae723fe92493e..1adebf763b6e69b15f25f2ed66a14d6ce12e31c0 100644 --- a/addons/payment_stripe/models/payment.py +++ b/addons/payment_stripe/models/payment.py @@ -126,7 +126,7 @@ class PaymentTransactionStripe(models.Model): @api.multi def stripe_s2s_do_transaction(self, **kwargs): self.ensure_one() - result = self._create_stripe_charge(acquirer_ref=self.payment_token_id.acquirer_ref) + result = self._create_stripe_charge(acquirer_ref=self.payment_token_id.acquirer_ref, email=self.partner_email) return self._stripe_s2s_validate_tree(result) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index fb6e271a7d1f06796e7acd7adf41901edc19e176..24443942ba56a4b6a31a987e4eb4e18303bde13c 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -1385,7 +1385,8 @@ exports.Orderline = Backbone.Model.extend({ if (unit.rounding) { this.quantity = round_pr(quant, unit.rounding); var decimals = this.pos.dp['Product Unit of Measure']; - this.quantityStr = field_utils.format.float(round_di(this.quantity, decimals), {digits: [69, decimals]}); + this.quantity = round_di(this.quantity, decimals) + this.quantityStr = field_utils.format.float(this.quantity, {digits: [69, decimals]}); } else { this.quantity = round_pr(quant, 1); this.quantityStr = this.quantity.toFixed(0); diff --git a/addons/pos_mercury/data/pos_mercury_demo.xml b/addons/pos_mercury/data/pos_mercury_demo.xml index 5ff1a0d70e434deb43e1a36035ec673a43397bfc..b242868f8df89ba78cdd062513e2eb05a0dbbef9 100644 --- a/addons/pos_mercury/data/pos_mercury_demo.xml +++ b/addons/pos_mercury/data/pos_mercury_demo.xml @@ -5,8 +5,8 @@ <!-- This is a test account for testing with test cards and cannot be used in a live environment --> <record id="pos_mercury_configuration" model="pos_mercury.configuration"> <field name="name">Mercury Demo</field> - <field name="merchant_id">334160</field> - <field name="merchant_pwd">81303DUR</field> + <field name="merchant_id">755847002</field> + <field name="merchant_pwd">xyz</field> </record> </data> </odoo> diff --git a/addons/pos_mercury/models/pos_mercury.py b/addons/pos_mercury/models/pos_mercury.py index 0a329634e5e9dac732e8503a76fa04c1b0426290..0c48502ee764674c8d54d499271f6134c1487aa6 100644 --- a/addons/pos_mercury/models/pos_mercury.py +++ b/addons/pos_mercury/models/pos_mercury.py @@ -4,6 +4,7 @@ import logging from odoo import models, fields, api, _ +from odoo.tools.float_utils import float_compare _logger = logging.getLogger(__name__) @@ -71,8 +72,9 @@ class PosOrder(models.Model): statement_id = super(PosOrder, self).add_payment(data) statement_lines = self.env['account.bank.statement.line'].search([('statement_id', '=', statement_id), ('pos_statement_id', '=', self.id), - ('journal_id', '=', data['journal']), - ('amount', '=', data['amount'])]) + ('journal_id', '=', data['journal'])]) + statement_lines = statement_lines.filtered(lambda line: float_compare(line.amount, data['amount'], + precision_rounding=line.journal_currency_id.rounding) == 0) # we can get multiple statement_lines when there are >1 credit # card payments with the same amount. In that case it doesn't diff --git a/addons/pos_mercury/models/pos_mercury_transaction.py b/addons/pos_mercury/models/pos_mercury_transaction.py index ade1f15c7290a2f41a3300accb49e8954a8b7667..72faef7f2079373a4431bf49f5def09786af2686 100644 --- a/addons/pos_mercury/models/pos_mercury_transaction.py +++ b/addons/pos_mercury/models/pos_mercury_transaction.py @@ -61,11 +61,15 @@ class MercuryTransaction(models.Model): 'SOAPAction': 'http://www.mercurypay.com/CreditTransaction', } + url = 'https://w1.mercurypay.com/ws/ws.asmx' + if self.env['ir.config_parameter'].sudo().get_param('pos_mercury.enable_test_env'): + url = 'https://w1.mercurycert.net/ws/ws.asmx' + try: - r = requests.post('https://w1.mercurypay.com/ws/ws.asmx', data=xml_transaction, headers=headers, timeout=65) + r = requests.post(url, data=xml_transaction, headers=headers, timeout=65) r.raise_for_status() response = werkzeug.utils.unescape(r.content.decode()) - except: + except Exception: response = "timeout" return response diff --git a/addons/sale/models/account_invoice.py b/addons/sale/models/account_invoice.py index a03df305b166308ff5d9e249372ed005521aed7d..0a2406a096847bf3e22aa6e59fd9d7c76ed5a2aa 100644 --- a/addons/sale/models/account_invoice.py +++ b/addons/sale/models/account_invoice.py @@ -39,6 +39,9 @@ class AccountInvoice(models.Model): def _onchange_delivery_address(self): addr = self.partner_id.address_get(['delivery']) self.partner_shipping_id = addr and addr.get('delivery') + if self.env.context.get('type', 'out_invoice') == 'out_invoice': + company = self.company_id or self.env.user.company_id + self.comment = company.with_context(lang=self.partner_id.lang).sale_note @api.multi def action_invoice_paid(self): diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index 089a898f67a604b9a03a6943c0348db4e469a4b1..97ef9c726f924fa42fa8c9ff84942c820b3e9820 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -65,7 +65,7 @@ class SaleAdvancePaymentInv(models.TransientModel): account_id = False if self.product_id.id: - account_id = self.product_id.property_account_income_id.id + account_id = self.product_id.property_account_income_id.id or self.product_id.categ_id.property_account_income_categ_id.id if not account_id: inc_acc = ir_property_obj.get('property_account_income_categ_id', 'product.category') account_id = order.fiscal_position_id.map_account(inc_acc).id if inc_acc else False diff --git a/addons/stock/report/report_location_barcode.xml b/addons/stock/report/report_location_barcode.xml index 93aee57f27b3669d7ed72e631659c18337714618..426f7037e285d03199890d2fb55dba9b9bbbfcbd 100644 --- a/addons/stock/report/report_location_barcode.xml +++ b/addons/stock/report/report_location_barcode.xml @@ -9,8 +9,8 @@ </template> <template id="report_location_barcode"> - <t t-call="web.basic_layout"> - <div t-foreach="[docs[x:x+4] for x in xrange(0, len(docs), 4)]" t-as="page_docs" class="page page_stock_location_barcodes"> + <t t-call="web.html_container"> + <div t-foreach="[docs[x:x+4] for x in xrange(0, len(docs), 4)]" t-as="page_docs" class="page article page_stock_location_barcodes"> <t t-foreach="page_docs" t-as="o"> <t t-if="o.barcode"><t t-set="content" t-value="o.barcode"/></t> <t t-if="not o.barcode"><t t-set="content" t-value="o.name"/></t> diff --git a/addons/stock_landed_costs/models/stock_landed_cost.py b/addons/stock_landed_costs/models/stock_landed_cost.py index 7522b46b6f88ad70226c2146212798722718ae25..af58b84a0e77bd9bd962d89b08b9ff35dec6f014 100644 --- a/addons/stock_landed_costs/models/stock_landed_cost.py +++ b/addons/stock_landed_costs/models/stock_landed_cost.py @@ -91,11 +91,13 @@ class LandedCost(models.Model): raise UserError(_('Cost and adjustments lines do not match. You should maybe recompute the landed costs.')) for cost in self: - move = self.env['account.move'].create({ + move = self.env['account.move'] + move_vals = { 'journal_id': cost.account_journal_id.id, 'date': cost.date, - 'ref': cost.name - }) + 'ref': cost.name, + 'line_ids': [], + } for line in cost.valuation_adjustment_lines.filtered(lambda line: line.move_id): # Prorate the value at what's still in stock cost_to_add = (line.move_id.remaining_qty / line.move_id.product_qty) * line.additional_landed_cost @@ -114,9 +116,9 @@ class LandedCost(models.Model): qty_out = line.move_id.product_qty - line.move_id.remaining_qty elif line.move_id._is_out(): qty_out = line.move_id.product_qty - line._create_accounting_entries(move, qty_out) - - move.assert_balanced() + move_vals['line_ids'] += line._create_accounting_entries(move, qty_out) + + move = move.create(move_vals) cost.write({'state': 'done', 'account_move_id': move.id}) move.post() return True @@ -316,11 +318,10 @@ class AdjustmentLines(models.Model): Generate the account.move.line values to track the landed cost. Afterwards, for the goods that are already out of stock, we should create the out moves """ - AccountMoveLine = self.env['account.move.line'].with_context(check_move_validity=False, recompute=False) + AccountMoveLine = [] base_line = { 'name': self.name, - 'move_id': move.id, 'product_id': self.product_id.id, 'quantity': 0, } @@ -334,8 +335,8 @@ class AdjustmentLines(models.Model): # negative cost, reverse the entry debit_line['credit'] = -diff credit_line['debit'] = -diff - AccountMoveLine.create(debit_line) - AccountMoveLine.create(credit_line) + AccountMoveLine.append([0, 0, debit_line]) + AccountMoveLine.append([0, 0, credit_line]) # Create account move lines for quants already out of stock if qty_out > 0: @@ -355,8 +356,8 @@ class AdjustmentLines(models.Model): # negative cost, reverse the entry debit_line['credit'] = -diff credit_line['debit'] = -diff - AccountMoveLine.create(debit_line) - AccountMoveLine.create(credit_line) + AccountMoveLine.append([0, 0, debit_line]) + AccountMoveLine.append([0, 0, credit_line]) # TDE FIXME: oh dear if self.env.user.company_id.anglo_saxon_accounting: @@ -376,7 +377,7 @@ class AdjustmentLines(models.Model): # negative cost, reverse the entry debit_line['credit'] = -diff credit_line['debit'] = -diff - AccountMoveLine.create(debit_line) - AccountMoveLine.create(credit_line) + AccountMoveLine.append([0, 0, debit_line]) + AccountMoveLine.append([0, 0, credit_line]) - return True + return AccountMoveLine diff --git a/addons/web_editor/static/src/js/editor/summernote.js b/addons/web_editor/static/src/js/editor/summernote.js index 58710987a518e3eecef61a20858e5aeccfaaf260..dc97da3736562679e73efd748209d145580d260f 100644 --- a/addons/web_editor/static/src/js/editor/summernote.js +++ b/addons/web_editor/static/src/js/editor/summernote.js @@ -1800,12 +1800,17 @@ $.summernote.pluginEvents.indent = function (event, editor, layoutInfo, outdent) var $dom = $(ancestor); if (!dom.isList(ancestor)) { + // to indent a selection, we indent the child nodes of the common + // ancestor that contains this selection $dom = $(dom.node(ancestor)).children(); } - if (!$dom.length) { - $dom = $(dom.ancestor(r.sc, dom.isList) || dom.ancestor(r.sc, dom.isCell)); + if (!$dom.not('br').length) { + // if selection is inside a list, we indent its list items + $dom = $(dom.ancestor(r.sc, dom.isList)); if (!$dom.length) { - $dom = $(r.sc).closest(options.styleTags.join(',')); + // if the selection is contained in a single HTML node, we indent + // the first ancestor 'content block' (P, H1, PRE, ...) or TD + $dom = $(r.sc).closest(options.styleTags.join(',')+',td'); } } diff --git a/addons/website_event_sale/static/src/js/website.tour.event_sale.js b/addons/website_event_sale/static/src/js/website.tour.event_sale.js index cae695c899a3d03f348db7ceba8d2acda88d2c2b..c67ff6b60e16249c5066a0375400d46a2bbc7b92 100644 --- a/addons/website_event_sale/static/src/js/website.tour.event_sale.js +++ b/addons/website_event_sale/static/src/js/website.tour.event_sale.js @@ -92,6 +92,7 @@ tour.register('event_buy_tickets', { { content: "Last step", trigger: '.oe_website_sale:contains("Thank you for your order")', + timeout: 30000, } ] ); diff --git a/addons/website_form/static/src/js/website_form.js b/addons/website_form/static/src/js/website_form.js index 5318a84067dd03c7648b4a17d1696b61dc38ddc6..512c7a0269c1081eb2788df60b15edb9d6ec674d 100644 --- a/addons/website_form/static/src/js/website_form.js +++ b/addons/website_form/static/src/js/website_form.js @@ -20,7 +20,11 @@ odoo.define('website_form.animation', function (require) { return $.when(this._super.apply(this, arguments), def); }, - start: function () { + start: function (editable_mode) { + if (editable_mode) { + this.stop(); + return; + } var self = this; this.templates_loaded = ajax.loadXML('/website_form/static/src/xml/website_form.xml', qweb); this.$target.find('.o_website_form_send').on('click',function (e) {self.send(e);}); diff --git a/addons/website_sale/static/src/js/website_sale_tour_buy.js b/addons/website_sale/static/src/js/website_sale_tour_buy.js index ade80828c12188faaee9ab87ad5c94128303229b..3c9144b02c21641fc78f4158fb638033e4d20638 100644 --- a/addons/website_sale/static/src/js/website_sale_tour_buy.js +++ b/addons/website_sale/static/src/js/website_sale_tour_buy.js @@ -82,6 +82,7 @@ tour.register('shop_buy_product', { { content: "finish", trigger: '.oe_website_sale:contains("Thank you for your order")', + timeout: 30000, } ] ); diff --git a/odoo/addons/base/module/module.py b/odoo/addons/base/module/module.py index 073eedfb53569b894b7303a3f8ff647abbb0cd03..a330b7d3dd3d0733ec0141bca4cb7f23d9e3da24 100644 --- a/odoo/addons/base/module/module.py +++ b/odoo/addons/base/module/module.py @@ -676,7 +676,7 @@ class Module(models.Model): res = [0, 0] # [update, add] default_version = modules.adapt_version('1.0') - known_mods = self.search([]) + known_mods = self.with_context(lang=None).search([]) known_mods_names = {mod.name: mod for mod in known_mods} # iterate through detected modules and update/create them in db diff --git a/odoo/addons/base/res/res_country_data.xml b/odoo/addons/base/res/res_country_data.xml index 01b85e0e401070b168612e3109cef82a90b951c6..298fdeca61de324f6eb9a77126fccca02428d2e6 100644 --- a/odoo/addons/base/res/res_country_data.xml +++ b/odoo/addons/base/res/res_country_data.xml @@ -1399,7 +1399,7 @@ <field name="name">Sudan</field> <field name="code">sd</field> <field file="base/static/img/country_flags/sd.png" name="image" type="base64" /> - <field name="currency_id" ref="SDD" /> + <field name="currency_id" ref="SDG" /> <field eval="249" name="phone_code" /> </record> <record id="se" model="res.country"> diff --git a/odoo/addons/base/res/res_currency_data.xml b/odoo/addons/base/res/res_currency_data.xml index 6e2d8cf5dc8ef4c64f719a7c5c9deb297a06638f..d9c56dfe558bec0642a1ea9ed53eca63af41e746 100644 --- a/odoo/addons/base/res/res_currency_data.xml +++ b/odoo/addons/base/res/res_currency_data.xml @@ -1292,6 +1292,7 @@ <field name="currency_subunit_label">Cents</field> </record> + <!-- no longer in use since 2007 --> <record id="SDD" model="res.currency"> <field name="name">SDD</field> <field name="symbol">£Sd</field> @@ -1301,6 +1302,13 @@ <field name="currency_subunit_label">Fils</field> </record> + <record id="SDG" model="res.currency"> + <field name="name">SDG</field> + <field name="symbol">ج.س.</field> + <field name="rounding">0.01</field> + <field name="active" eval="False"/> + </record> + <record id="LKR" model="res.currency"> <field name="name">LKR</field> <field name="symbol">Rs</field> diff --git a/odoo/addons/base/res/res_currency_demo.xml b/odoo/addons/base/res/res_currency_demo.xml index 220e78496685bd76a643de34c057519c68759359..99fcdcf05f702c545e5e627ef6f1ee7483356648 100644 --- a/odoo/addons/base/res/res_currency_demo.xml +++ b/odoo/addons/base/res/res_currency_demo.xml @@ -871,6 +871,12 @@ <field name="rate">544.44</field> </record> + <record forcecreate="0" id="rateSDG" model="res.currency.rate"> + <field name="currency_id" ref="SDG" /> + <field name="name">2010-01-01</field> + <field name="rate">3.1999</field> + </record> + <record forcecreate="0" id="rateLKR" model="res.currency.rate"> <field name="currency_id" ref="LKR" /> <field name="name">2010-01-01</field> diff --git a/odoo/tools/config.py b/odoo/tools/config.py index 64666235499bef5907c28ea7364a6ffdb1db233e..57b66b50f6a8b79a93f32db843bda0e6ee790e09 100644 --- a/odoo/tools/config.py +++ b/odoo/tools/config.py @@ -274,7 +274,7 @@ class configmanager(object): type="int") group.add_option("--unaccent", dest="unaccent", my_default=False, action="store_true", help="Use the unaccent function provided by the database when available.") - group.add_option("--geoip-db", dest="geoip_database", my_default='/usr/share/GeoIP/GeoLiteCity.dat', + group.add_option("--geoip-db", dest="geoip_database", my_default='/usr/share/GeoIP/GeoLite2-City.mmdb', help="Absolute path to the GeoIP database file.") parser.add_option_group(group)