squashed commit

This commit is contained in:
hoangvv
2026-09-18 13:55:25 +07:00
commit 039c98d4d0
45882 changed files with 24235585 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
# -*- coding: utf-8 -*-
# ruff: noqa: E402, F401
# Part of Odoo. See LICENSE file for full copyright and licensing details.
""" OpenERP core library."""
# ----------------------------------------------------------
# odoo must be a namespace package for odoo.addons to become one too
# https://packaging.python.org/guides/packaging-namespace-packages/
# ----------------------------------------------------------
import pkgutil
import os.path
__path__ = [
os.path.abspath(path)
for path in pkgutil.extend_path(__path__, __name__)
]
import sys
MIN_PY_VERSION = (3, 10)
MAX_PY_VERSION = (3, 13)
assert sys.version_info > MIN_PY_VERSION, f"Outdated python version detected, Odoo requires Python >= {'.'.join(map(str, MIN_PY_VERSION))} to run."
# ----------------------------------------------------------
# Shortcuts
# ----------------------------------------------------------
# The hard-coded super-user id (a.k.a. administrator, or root user).
SUPERUSER_ID = 1
def registry(database_name=None):
"""
Return the model registry for the given database, or the database mentioned
on the current thread. If the registry does not exist yet, it is created on
the fly.
"""
import warnings # noqa: PLC0415
warnings.warn("Use directly odoo.modules.registry.Registry", DeprecationWarning, 2)
if database_name is None:
import threading
database_name = threading.current_thread().dbname
return modules.registry.Registry(database_name)
# ----------------------------------------------------------
# Import tools to patch code and libraries
# required to do as early as possible for evented and timezone
# ----------------------------------------------------------
from . import _monkeypatches
_monkeypatches.patch_all()
# ----------------------------------------------------------
# Imports
# ----------------------------------------------------------
from . import upgrade # this namespace must be imported first
from . import addons
from . import conf
from . import loglevels
from . import modules
from . import netsvc
from . import osv
from . import release
from . import service
from . import sql_db
from . import tools
# ----------------------------------------------------------
# Model classes, fields, api decorators, and translations
# ----------------------------------------------------------
from . import models
from . import fields
from . import api
from odoo.tools.translate import _, _lt
from odoo.fields import Command
# ----------------------------------------------------------
# Other imports, which may require stuff from above
# ----------------------------------------------------------
from . import cli
from . import http
+3
View File
@@ -0,0 +1,3 @@
from .cli.command import main
main()
+42
View File
@@ -0,0 +1,42 @@
# ruff: noqa: F401, PLC0415
# ignore import not at top of the file
import os
import time
from .evented import patch_evented
def set_timezone_utc():
os.environ['TZ'] = 'UTC' # Set the timezone
if hasattr(time, 'tzset'):
time.tzset()
def patch_all():
patch_evented()
set_timezone_utc()
from .codecs import patch_codecs
patch_codecs()
from .email import patch_email
patch_email()
from .mimetypes import patch_mimetypes
patch_mimetypes()
from .pytz import patch_pytz
patch_pytz()
from .literal_eval import patch_literal_eval
patch_literal_eval()
from .lxml import patch_lxml
patch_lxml()
from .num2words import patch_num2words
patch_num2words()
from .stdnum import patch_stdnum
patch_stdnum()
from .urllib3 import patch_urllib3
patch_urllib3()
from .werkzeug_urls import patch_werkzeug
patch_werkzeug()
from .zeep import patch_zeep
patch_zeep()
from .requests_blocker import patch_requests, patch_urllib3_requests
patch_requests()
patch_urllib3_requests()
+26
View File
@@ -0,0 +1,26 @@
import codecs
import encodings.aliases
import re
import babel.core
def patch_codecs():
# ---------------------------------------------------------
# some charset are known by Python under a different name
# ---------------------------------------------------------
encodings.aliases.aliases['874'] = 'cp874'
encodings.aliases.aliases['windows_874'] = 'cp874'
# ---------------------------------------------------------
# alias hebrew iso-8859-8-i and iso-8859-8-e on iso-8859-8
# https://bugs.python.org/issue18624
# ---------------------------------------------------------
iso8859_8 = codecs.lookup('iso8859_8')
iso8859_8ie_re = re.compile(r'iso[-_]?8859[-_]8[-_]?[ei]', re.IGNORECASE)
codecs.register(lambda charset: iso8859_8 if iso8859_8ie_re.match(charset) else None)
# To remove when corrected in Babel
babel.core.LOCALE_ALIASES['nb'] = 'nb_NO'
+12
View File
@@ -0,0 +1,12 @@
from email._policybase import _PolicyBase
def patch_email():
def policy_clone(self, **kwargs):
for arg in kwargs:
if arg.startswith("_") or "__" in arg:
raise AttributeError(f"{self.__class__.__name__!r} object has no attribute {arg!r}")
return orig_policy_clone(self, **kwargs)
orig_policy_clone = _PolicyBase.clone
_PolicyBase.clone = policy_clone
+39
View File
@@ -0,0 +1,39 @@
"""
Running mode flags (gevent, prefork)
This should be imported as early as possible.
It will initialize the `odoo.evented` variable.
"""
import odoo
import sys
odoo.evented = False
def patch_evented():
if odoo.evented or not (len(sys.argv) > 1 and sys.argv[1] == 'gevent'):
return
sys.argv.remove('gevent')
import gevent.monkey # noqa: PLC0415
import psycopg2 # noqa: PLC0415
from gevent.socket import wait_read, wait_write # noqa: PLC0415
gevent.monkey.patch_all()
def gevent_wait_callback(conn, timeout=None):
"""A wait callback useful to allow gevent to work with Psycopg."""
# Copyright (C) 2010-2012 Daniele Varrazzo <daniele.varrazzo@gmail.com>
# This function is borrowed from psycogreen module which is licensed
# under the BSD license (see in odoo/debian/copyright)
while 1:
state = conn.poll()
if state == psycopg2.extensions.POLL_OK:
break
elif state == psycopg2.extensions.POLL_READ:
wait_read(conn.fileno(), timeout=timeout)
elif state == psycopg2.extensions.POLL_WRITE:
wait_write(conn.fileno(), timeout=timeout)
else:
raise psycopg2.OperationalError(
"Bad result from poll: %r" % state)
psycopg2.extensions.set_wait_callback(gevent_wait_callback)
odoo.evented = True
+32
View File
@@ -0,0 +1,32 @@
# ruff: noqa: E402, PLC0415
# ignore import not at top of the file
import ast
import logging
import os
_logger = logging.getLogger(__name__)
orig_literal_eval = ast.literal_eval
def literal_eval(expr):
# limit the size of the expression to avoid segmentation faults
# the default limit is set to 100KiB
# can be overridden by setting the ODOO_LIMIT_LITEVAL_BUFFER buffer_size_environment variable
buffer_size = 102400
buffer_size_env = os.getenv("ODOO_LIMIT_LITEVAL_BUFFER")
if buffer_size_env:
if buffer_size_env.isdigit():
buffer_size = int(buffer_size_env)
else:
_logger.error("ODOO_LIMIT_LITEVAL_BUFFER has to be an integer, defaulting to 100KiB")
if isinstance(expr, str) and len(expr) > buffer_size:
raise ValueError("expression can't exceed buffer limit")
return orig_literal_eval(expr)
def patch_literal_eval():
ast.literal_eval = literal_eval
+13
View File
@@ -0,0 +1,13 @@
import lxml.html.clean
import re
from importlib.metadata import version
from odoo.tools import parse_version
def patch_lxml():
# between these versions having a couple data urls in a style attribute
# or style node removes the attribute or node erroneously
if parse_version("4.6.0") <= parse_version(version('lxml')) < parse_version("5.2.0"):
lxml.html.clean._find_image_dataurls = re.compile(r'data:image/(.+?);base64,').findall
+15
View File
@@ -0,0 +1,15 @@
import mimetypes
def patch_mimetypes():
# if extension is already knows, the new definition will remplace the existing one
# Add potentially missing (older ubuntu) font mime types
mimetypes.add_type('application/font-woff', '.woff')
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
mimetypes.add_type('application/x-font-ttf', '.ttf')
mimetypes.add_type('image/webp', '.webp')
# Add potentially wrong (detected on windows) svg mime types
mimetypes.add_type('image/svg+xml', '.svg')
# this one can be present on windows with the value 'text/plain' which
# breaks loading js files from an addon's static folder
mimetypes.add_type('text/javascript', '.js')
+984
View File
@@ -0,0 +1,984 @@
import decimal
import logging
import math
import re
from collections import OrderedDict
from decimal import ROUND_HALF_UP, Decimal
from math import floor
from odoo import MIN_PY_VERSION
# The following section of the code is used to monkey patch
# the Arabic class of num2words package as there are some problems
# upgrading the package to the newer version that fixed the bugs
# so a temporary fix was to patch the old version with the code
# from the new version manually.
# The code is taken from num2words package: https://github.com/savoirfairelinux/num2words
CURRENCY_SR = [("ريال", "ريالان", "ريالات", "ريالاً"),
("هللة", "هللتان", "هللات", "هللة")]
CURRENCY_EGP = [("جنيه", "جنيهان", "جنيهات", "جنيهاً"),
("قرش", "قرشان", "قروش", "قرش")]
CURRENCY_KWD = [("دينار", "ديناران", "دينارات", "ديناراً"),
("فلس", "فلسان", "فلس", "فلس")]
ARABIC_ONES = [
"", "واحد", "اثنان", "ثلاثة", "أربعة", "خمسة", "ستة", "سبعة", "ثمانية",
"تسعة",
"عشرة", "أحد عشر", "اثنا عشر", "ثلاثة عشر", "أربعة عشر", "خمسة عشر",
"ستة عشر", "سبعة عشر", "ثمانية عشر",
"تسعة عشر"
]
class Num2Word_Base:
CURRENCY_FORMS = {}
CURRENCY_ADJECTIVES = {}
def __init__(self):
self.is_title = False
self.precision = 2
self.exclude_title = []
self.negword = "(-) "
self.pointword = "(.)"
self.errmsg_nonnum = "type: %s not in [long, int, float]"
self.errmsg_floatord = "Cannot treat float %s as ordinal."
self.errmsg_negord = "Cannot treat negative num %s as ordinal."
self.errmsg_toobig = "abs(%s) must be less than %s."
self.setup()
# uses cards
if any(hasattr(self, field) for field in
['high_numwords', 'mid_numwords', 'low_numwords']):
self.cards = OrderedDict()
self.set_numwords()
self.MAXVAL = 1000 * next(iter(self.cards.keys()))
def set_numwords(self):
self.set_high_numwords(self.high_numwords)
self.set_mid_numwords(self.mid_numwords)
self.set_low_numwords(self.low_numwords)
def set_high_numwords(self, *args):
raise NotImplementedError
def set_mid_numwords(self, mid):
for key, val in mid:
self.cards[key] = val
def set_low_numwords(self, numwords):
for word, n in zip(numwords, range(len(numwords) - 1, -1, -1)):
self.cards[n] = word
def splitnum(self, value):
for elem in self.cards:
if elem > value:
continue
out = []
if value == 0:
div, mod = 1, 0
else:
div, mod = divmod(value, elem)
if div == 1:
out.append((self.cards[1], 1))
else:
if div == value: # The system tallies, eg Roman Numerals
return [(div * self.cards[elem], div * elem)]
out.append(self.splitnum(div))
out.append((self.cards[elem], elem))
if mod:
out.append(self.splitnum(mod))
return out
def parse_minus(self, num_str):
"""Detach minus and return it as symbol with new num_str."""
if num_str.startswith('-'):
# Extra spacing to compensate if there is no minus.
return '%s ' % self.negword.strip(), num_str[1:]
return '', num_str
def str_to_number(self, value):
return Decimal(value)
def to_cardinal(self, value):
try:
assert int(value) == value
except (ValueError, TypeError, AssertionError):
return self.to_cardinal_float(value)
out = ""
if value < 0:
value = abs(value)
out = "%s " % self.negword.strip()
if value >= self.MAXVAL:
raise OverflowError(self.errmsg_toobig % (value, self.MAXVAL))
val = self.splitnum(value)
words, _ = self.clean(val)
return self.title(out + words)
def float2tuple(self, value):
pre = int(value)
# Simple way of finding decimal places to update the precision
self.precision = abs(Decimal(str(value)).as_tuple().exponent)
post = abs(value - pre) * 10**self.precision
if abs(round(post) - post) < 0.01:
# We generally floor all values beyond our precision (rather than
# rounding), but in cases where we have something like 1.239999999,
# which is probably due to python's handling of floats, we actually
# want to consider it as 1.24 instead of 1.23
post = int(round(post))
else:
post = int(math.floor(post))
return pre, post
def to_cardinal_float(self, value):
try:
float(value) == value
except (ValueError, TypeError, AssertionError, AttributeError):
raise TypeError(self.errmsg_nonnum % value)
pre, post = self.float2tuple(float(value))
post = str(post)
post = '0' * (self.precision - len(post)) + post
out = [self.to_cardinal(pre)]
if self.precision:
out.append(self.title(self.pointword))
for i in range(self.precision):
curr = int(post[i])
out.append(to_s(self.to_cardinal(curr)))
return " ".join(out)
def merge(self, left, right):
raise NotImplementedError
def clean(self, val):
out = val
while len(val) != 1:
out = []
left, right = val[:2]
if isinstance(left, tuple) and isinstance(right, tuple):
out.append(self.merge(left, right))
if val[2:]:
out.append(val[2:])
else:
for elem in val:
if isinstance(elem, list):
if len(elem) == 1:
out.append(elem[0])
else:
out.append(self.clean(elem))
else:
out.append(elem)
val = out
return out[0]
def title(self, value):
if self.is_title:
out = []
value = value.split()
for word in value:
if word in self.exclude_title:
out.append(word)
else:
out.append(word[0].upper() + word[1:])
value = " ".join(out)
return value
def verify_ordinal(self, value):
if not value == int(value):
raise TypeError(self.errmsg_floatord % value)
if not abs(value) == value:
raise TypeError(self.errmsg_negord % value)
def to_ordinal(self, value):
return self.to_cardinal(value)
def to_ordinal_num(self, value):
return value
# Trivial version
def inflect(self, value, text):
text = text.split("/")
if value == 1:
return text[0]
return "".join(text)
# //CHECK: generalise? Any others like pounds/shillings/pence?
def to_splitnum(self, val, hightxt="", lowtxt="", jointxt="",
divisor=100, longval=True, cents=True):
out = []
if isinstance(val, float):
high, low = self.float2tuple(val)
else:
try:
high, low = val
except TypeError:
high, low = divmod(val, divisor)
if high:
hightxt = self.title(self.inflect(high, hightxt))
out.append(self.to_cardinal(high))
if low:
if longval:
if hightxt:
out.append(hightxt)
if jointxt:
out.append(self.title(jointxt))
elif hightxt:
out.append(hightxt)
if low:
if cents:
out.append(self.to_cardinal(low))
else:
out.append("%02d" % low)
if lowtxt and longval:
out.append(self.title(self.inflect(low, lowtxt)))
return " ".join(out)
def to_year(self, value, **kwargs):
return self.to_cardinal(value)
def pluralize(self, n, forms):
"""
Should resolve gettext form:
http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html
"""
raise NotImplementedError
def _money_verbose(self, number, currency):
return self.to_cardinal(number)
def _cents_verbose(self, number, currency):
return self.to_cardinal(number)
def _cents_terse(self, number, currency):
return "%02d" % number
def to_currency(self, val, currency='EUR', cents=True, separator=',',
adjective=False):
"""
Args:
val: Numeric value
currency (str): Currency code
cents (bool): Verbose cents
separator (str): Cent separator
adjective (bool): Prefix currency name with adjective
Returns:
str: Formatted string
"""
left, right, is_negative = parse_currency_parts(val)
try:
cr1, cr2 = self.CURRENCY_FORMS[currency]
except KeyError:
raise NotImplementedError(
'Currency code "%s" not implemented for "%s"' %
(currency, self.__class__.__name__))
if adjective and currency in self.CURRENCY_ADJECTIVES:
cr1 = prefix_currency(self.CURRENCY_ADJECTIVES[currency], cr1)
minus_str = "%s " % self.negword.strip() if is_negative else ""
money_str = self._money_verbose(left, currency)
cents_str = self._cents_verbose(right, currency) \
if cents else self._cents_terse(right, currency)
return '%s%s %s%s %s %s' % (
minus_str,
money_str,
self.pluralize(left, cr1),
separator,
cents_str,
self.pluralize(right, cr2)
)
def setup(self):
pass
class Num2Word_AR_Fixed(Num2Word_Base):
errmsg_toobig = "abs(%s) must be less than %s."
MAXVAL = 10**51
def __init__(self):
super().__init__()
self.number = 0
self.arabicPrefixText = ""
self.arabicSuffixText = ""
self.integer_value = 0
self._decimalValue = ""
self.partPrecision = 2
self.currency_unit = CURRENCY_SR[0]
self.currency_subunit = CURRENCY_SR[1]
self.isCurrencyPartNameFeminine = True
self.isCurrencyNameFeminine = False
self.separator = 'و'
self.arabicOnes = ARABIC_ONES
self.arabicFeminineOnes = [
"", "إحدى", "اثنتان", "ثلاث", "أربع", "خمس", "ست", "سبع", "ثمان",
"تسع",
"عشر", "إحدى عشرة", "اثنتا عشرة", "ثلاث عشرة", "أربع عشرة",
"خمس عشرة", "ست عشرة", "سبع عشرة", "ثماني عشرة",
"تسع عشرة"
]
self.arabicOrdinal = [
"", "اول", "ثاني", "ثالث", "رابع", "خامس", "سادس", "سابع", "ثامن",
"تاسع", "عاشر", "حادي عشر", "ثاني عشر", "ثالث عشر", "رابع عشر",
"خامس عشر", "سادس عشر", "سابع عشر", "ثامن عشر", "تاسع عشر"
]
self.arabicTens = [
"عشرون", "ثلاثون", "أربعون", "خمسون", "ستون", "سبعون", "ثمانون",
"تسعون"
]
self.arabicHundreds = [
"", "مائة", "مئتان", "ثلاثمائة", "أربعمائة", "خمسمائة", "ستمائة",
"سبعمائة", "ثمانمائة", "تسعمائة"
]
self.arabicAppendedTwos = [
"مئتا", "ألفا", "مليونا", "مليارا", "تريليونا", "كوادريليونا",
"كوينتليونا", "سكستيليونا", "سبتيليونا", "أوكتيليونا ",
"نونيليونا", "ديسيليونا", "أندسيليونا", "دوديسيليونا",
"تريديسيليونا", "كوادريسيليونا", "كوينتينيليونا"
]
self.arabicTwos = [
"مئتان", "ألفان", "مليونان", "ملياران", "تريليونان",
"كوادريليونان", "كوينتليونان", "سكستيليونان", "سبتيليونان",
"أوكتيليونان ", "نونيليونان ", "ديسيليونان", "أندسيليونان",
"دوديسيليونان", "تريديسيليونان", "كوادريسيليونان", "كوينتينيليونان"
]
self.arabicGroup = [
"مائة", "ألف", "مليون", "مليار", "تريليون", "كوادريليون",
"كوينتليون", "سكستيليون", "سبتيليون", "أوكتيليون", "نونيليون",
"ديسيليون", "أندسيليون", "دوديسيليون", "تريديسيليون",
"كوادريسيليون", "كوينتينيليون"
]
self.arabicAppendedGroup = [
"", "ألفاً", "مليوناً", "ملياراً", "تريليوناً", "كوادريليوناً",
"كوينتليوناً", "سكستيليوناً", "سبتيليوناً", "أوكتيليوناً",
"نونيليوناً", "ديسيليوناً", "أندسيليوناً", "دوديسيليوناً",
"تريديسيليوناً", "كوادريسيليوناً", "كوينتينيليوناً"
]
self.arabicPluralGroups = [
"", "آلاف", "ملايين", "مليارات", "تريليونات", "كوادريليونات",
"كوينتليونات", "سكستيليونات", "سبتيليونات", "أوكتيليونات",
"نونيليونات", "ديسيليونات", "أندسيليونات", "دوديسيليونات",
"تريديسيليونات", "كوادريسيليونات", "كوينتينيليونات"
]
assert len(self.arabicAppendedGroup) == len(self.arabicGroup)
assert len(self.arabicPluralGroups) == len(self.arabicGroup)
assert len(self.arabicAppendedTwos) == len(self.arabicTwos)
def number_to_arabic(self, arabic_prefix_text, arabic_suffix_text):
self.arabicPrefixText = arabic_prefix_text
self.arabicSuffixText = arabic_suffix_text
self.extract_integer_and_decimal_parts()
def extract_integer_and_decimal_parts(self):
splits = re.split('\\.', str(self.number))
self.integer_value = int(splits[0])
if len(splits) > 1:
self._decimalValue = int(self.decimal_value(splits[1]))
else:
self._decimalValue = 0
def decimal_value(self, decimal_part):
if self.partPrecision is not len(decimal_part):
decimal_part_length = len(decimal_part)
decimal_part_builder = decimal_part
for _ in range(0, self.partPrecision - decimal_part_length):
decimal_part_builder += '0'
decimal_part = decimal_part_builder
if len(decimal_part) <= self.partPrecision:
dec = len(decimal_part)
else:
dec = self.partPrecision
result = decimal_part[0: dec]
else:
result = decimal_part
# The following is useless (never happens)
# for i in range(len(result), self.partPrecision):
# result += '0'
return result
def digit_feminine_status(self, digit, group_level):
if group_level == -1:
if self.isCurrencyPartNameFeminine:
return self.arabicFeminineOnes[int(digit)]
else:
# Note: this never happens
return self.arabicOnes[int(digit)]
elif group_level == 0:
if self.isCurrencyNameFeminine:
return self.arabicFeminineOnes[int(digit)]
else:
return self.arabicOnes[int(digit)]
else:
return self.arabicOnes[int(digit)]
def process_arabic_group(self, group_number, group_level,
remaining_number):
tens = Decimal(group_number) % Decimal(100)
hundreds = Decimal(group_number) / Decimal(100)
ret_val = ""
if int(hundreds) > 0:
if tens == 0 and int(hundreds) == 2:
ret_val = f"{self.arabicAppendedTwos[0]}"
else:
ret_val = f"{self.arabicHundreds[int(hundreds)]}"
if ret_val and tens != 0:
ret_val += " و "
if tens > 0:
if tens < 20:
# if int(group_level) >= len(self.arabicTwos):
# raise OverflowError(self.errmsg_toobig %
# (self.number, self.MAXVAL))
assert int(group_level) < len(self.arabicTwos)
if tens == 2 and int(hundreds) == 0 and group_level > 0:
power = int(math.log10(self.integer_value))
if self.integer_value > 10 and power % 3 == 0 and \
self.integer_value == 2 * (10 ** power):
ret_val = f"{self.arabicAppendedTwos[int(group_level)]}"
else:
ret_val = f"{self.arabicTwos[int(group_level)]}"
else:
if tens == 1 and group_level > 0 and hundreds == 0:
# Note: this never happens
# (hundreds == 0 only if group_number is 0)
ret_val += ""
elif (tens == 1 or tens == 2) and (
group_level == 0 or group_level == -1) and \
hundreds == 0 and remaining_number == 0:
# Note: this never happens (idem)
ret_val += ""
elif tens == 1 and group_level > 0:
ret_val += self.arabicGroup[int(group_level)]
else:
ret_val += self.digit_feminine_status(int(tens),
group_level)
else:
ones = tens % 10
tens = (tens / 10) - 2
if ones > 0:
ret_val += self.digit_feminine_status(ones, group_level)
if ret_val and ones != 0:
ret_val += " و "
ret_val += self.arabicTens[int(tens)]
return ret_val
# We use this instead of built-in `abs` function,
# because `abs` suffers from loss of precision for big numbers
def absolute(self, number):
return number if number >= 0 else -number
# We use this instead of `"{:09d}".format(number)`,
# because the string conversion suffers from loss of
# precision for big numbers
def to_str(self, number):
integer = int(number)
if integer == number:
return str(integer)
decimal = round((number - integer) * 10**9)
return f"{integer}.{decimal:09d}"
def convert(self, value):
self.number = self.to_str(value)
self.number_to_arabic(self.arabicPrefixText, self.arabicSuffixText)
return self.convert_to_arabic()
def convert_to_arabic(self):
temp_number = Decimal(self.number)
if temp_number == Decimal(0):
return "صفر"
decimal_string = self.process_arabic_group(self._decimalValue,
-1,
Decimal(0))
ret_val = ""
group = 0
while temp_number > Decimal(0):
temp_number_dec = Decimal(str(temp_number))
try:
number_to_process = int(temp_number_dec % Decimal(str(1000)))
except decimal.InvalidOperation:
decimal.getcontext().prec = len(
temp_number_dec.as_tuple().digits
)
number_to_process = int(temp_number_dec % Decimal(str(1000)))
temp_number = int(temp_number_dec / Decimal(1000))
group_description = \
self.process_arabic_group(number_to_process,
group,
Decimal(floor(temp_number)))
if group_description:
if group > 0:
if ret_val:
ret_val = f"و {ret_val}"
if number_to_process != 2 and number_to_process != 1:
# if group >= len(self.arabicGroup):
# raise OverflowError(self.errmsg_toobig %
# (self.number, self.MAXVAL)
# )
assert group < len(self.arabicGroup)
if number_to_process % 100 != 1:
if 3 <= number_to_process <= 10:
ret_val = f"{self.arabicPluralGroups[group]} {ret_val}"
else:
if ret_val:
ret_val = f"{self.arabicAppendedGroup[group]} {ret_val}"
else:
ret_val = f"{self.arabicGroup[group]} {ret_val}"
else:
ret_val = f"{self.arabicGroup[group]} {ret_val}"
ret_val = f"{group_description} {ret_val}"
group += 1
formatted_number = ""
if self.arabicPrefixText:
formatted_number += f"{self.arabicPrefixText} "
formatted_number += ret_val
if self.integer_value != 0:
remaining100 = int(self.integer_value % 100)
if remaining100 == 0 or remaining100 == 1:
formatted_number += self.currency_unit[0]
elif remaining100 == 2:
if self.integer_value == 2:
formatted_number += self.currency_unit[1]
else:
formatted_number += self.currency_unit[0]
elif 3 <= remaining100 <= 10:
formatted_number += self.currency_unit[2]
elif 11 <= remaining100 <= 99:
formatted_number += self.currency_unit[3]
if self._decimalValue != 0:
formatted_number += f" {self.separator} "
formatted_number += decimal_string
if self._decimalValue != 0:
formatted_number += " "
remaining100 = int(self._decimalValue % 100)
if remaining100 == 0 or remaining100 == 1:
formatted_number += self.currency_subunit[0]
elif remaining100 == 2:
formatted_number += self.currency_subunit[1]
elif 3 <= remaining100 <= 10:
formatted_number += self.currency_subunit[2]
elif 11 <= remaining100 <= 99:
formatted_number += self.currency_subunit[3]
if self.arabicSuffixText:
formatted_number += f" {self.arabicSuffixText}"
return formatted_number
def validate_number(self, number):
if number >= self.MAXVAL:
raise OverflowError(self.errmsg_toobig % (number, self.MAXVAL))
return number
def set_currency_prefer(self, currency):
if currency == 'EGP':
self.currency_unit = CURRENCY_EGP[0]
self.currency_subunit = CURRENCY_EGP[1]
elif currency == 'KWD':
self.currency_unit = CURRENCY_KWD[0]
self.currency_subunit = CURRENCY_KWD[1]
else:
self.currency_unit = CURRENCY_SR[0]
self.currency_subunit = CURRENCY_SR[1]
def to_currency(self, value, currency='SR', prefix='', suffix=''):
self.set_currency_prefer(currency)
self.isCurrencyNameFeminine = False
self.separator = "و"
self.arabicOnes = ARABIC_ONES
self.arabicPrefixText = prefix
self.arabicSuffixText = suffix
return self.convert(value=value)
def to_ordinal(self, number, prefix=''):
if number <= 19:
return f"{self.arabicOrdinal[number]}"
if number < 100:
self.isCurrencyNameFeminine = True
else:
self.isCurrencyNameFeminine = False
self.currency_subunit = ('', '', '', '')
self.currency_unit = ('', '', '', '')
self.arabicPrefixText = prefix
self.arabicSuffixText = ""
return f"{self.convert(self.absolute(number)).strip()}"
def to_year(self, value):
value = self.validate_number(value)
return self.to_cardinal(value)
def to_ordinal_num(self, value):
return self.to_ordinal(value).strip()
def to_cardinal(self, number):
self.isCurrencyNameFeminine = False
number = self.validate_number(number)
minus = ''
if number < 0:
minus = 'سالب '
self.separator = ','
self.currency_subunit = ('', '', '', '')
self.currency_unit = ('', '', '', '')
self.arabicPrefixText = ""
self.arabicSuffixText = ""
self.arabicOnes = ARABIC_ONES
return minus + self.convert(value=self.absolute(number)).strip()
def parse_currency_parts(value, is_int_with_cents=True):
if isinstance(value, int):
if is_int_with_cents:
# assume cents if value is integer
negative = value < 0
value = abs(value)
integer, cents = divmod(value, 100)
else:
negative = value < 0
integer, cents = abs(value), 0
else:
value = Decimal(value)
value = value.quantize(
Decimal('.01'),
rounding=ROUND_HALF_UP
)
negative = value < 0
value = abs(value)
integer, fraction = divmod(value, 1)
integer = int(integer)
cents = int(fraction * 100)
return integer, cents, negative
def prefix_currency(prefix, base):
return tuple("%s %s" % (prefix, i) for i in base)
try:
strtype = basestring
except NameError:
strtype = str
def to_s(val):
try:
return unicode(val)
except NameError:
return str(val)
# Derived from num2cyrillic licensed under LGPL-3.0-only
# Copyright 2018 ClaimCompass, Inc (num2cyrillic authored by Velizar Shulev) https://github.com/ClaimCompass/num2cyrillic
# Copyright 1997 The PHP Group (PEAR::Numbers_Words, authored by Kouber Saparev) https://github.com/pear/Numbers_Words/blob/master/Numbers/Words/Locale/bg.php
class NumberToWords_BG(Num2Word_Base):
locale = 'bg'
lang = 'Bulgarian'
lang_native = 'Български'
_misc_strings = {
'deset': 'десет',
'edinadeset': 'единадесет',
'na': 'на',
'sto': 'сто',
'sta': 'ста',
'stotin': 'стотин',
'hiliadi': 'хиляди',
}
_digits = {
0: [None, 'едно', 'две', 'три', 'четири', 'пет', 'шест', 'седем', 'осем', 'девет'],
}
_digits[1] = [None, 'един', 'два'] + _digits[0][3:]
_digits[-1] = [None, 'една'] + _digits[0][2:]
_last_and = False
_zero = 'нула'
_infinity = 'безкрайност'
_and = 'и'
_sep = ' '
_minus = 'минус'
_plural = 'а'
_exponent = {
0: '',
3: 'хиляда',
6: 'милион',
9: 'милиард',
12: 'трилион',
15: 'квадрилион',
18: 'квинтилион',
21: 'секстилион',
24: 'септилион',
27: 'октилион',
30: 'ноналион',
33: 'декалион',
36: 'ундекалион',
39: 'дуодекалион',
42: 'тредекалион',
45: 'кватордекалион',
48: 'квинтдекалион',
51: 'сексдекалион',
54: 'септдекалион',
57: 'октодекалион',
60: 'новемдекалион',
63: 'вигинтилион',
66: 'унвигинтилион',
69: 'дуовигинтилион',
72: 'тревигинтилион',
75: 'кваторвигинтилион',
78: 'квинвигинтилион',
81: 'сексвигинтилион',
84: 'септенвигинтилион',
87: 'октовигинтилион',
90: 'новемвигинтилион',
93: 'тригинтилион',
96: 'унтригинтилион',
99: 'дуотригинтилион',
102: 'третригинтилион',
105: 'кватортригинтилион',
108: 'квинтригинтилион',
111: 'секстригинтилион',
114: 'септентригинтилион',
117: 'октотригинтилион',
120: 'новемтригинтилион',
123: 'квадрагинтилион',
126: 'унквадрагинтилион',
129: 'дуоквадрагинтилион',
132: 'треквадрагинтилион',
135: 'кваторквадрагинтилион',
138: 'квинквадрагинтилион',
141: 'сексквадрагинтилион',
144: 'септенквадрагинтилион',
147: 'октоквадрагинтилион',
150: 'новемквадрагинтилион',
153: 'квинквагинтилион',
156: 'унквинкагинтилион',
159: 'дуоквинкагинтилион',
162: 'треквинкагинтилион',
165: 'кваторквинкагинтилион',
168: 'квинквинкагинтилион',
171: 'сексквинкагинтилион',
174: 'септенквинкагинтилион',
177: 'октоквинкагинтилион',
180: 'новемквинкагинтилион',
183: 'сексагинтилион',
186: 'унсексагинтилион',
189: 'дуосексагинтилион',
192: 'тресексагинтилион',
195: 'кваторсексагинтилион',
198: 'квинсексагинтилион',
201: 'секссексагинтилион',
204: 'септенсексагинтилион',
207: 'октосексагинтилион',
210: 'новемсексагинтилион',
213: 'септагинтилион',
216: 'унсептагинтилион',
219: 'дуосептагинтилион',
222: 'тресептагинтилион',
225: 'кваторсептагинтилион',
228: 'квинсептагинтилион',
231: 'секссептагинтилион',
234: 'септенсептагинтилион',
237: 'октосептагинтилион',
240: 'новемсептагинтилион',
243: 'октогинтилион',
246: 'уноктогинтилион',
249: 'дуооктогинтилион',
252: 'треоктогинтилион',
255: 'кватороктогинтилион',
258: 'квиноктогинтилион',
261: 'сексоктогинтилион',
264: 'септоктогинтилион',
267: 'октооктогинтилион',
270: 'новемоктогинтилион',
273: 'нонагинтилион',
276: 'уннонагинтилион',
279: 'дуононагинтилион',
282: 'тренонагинтилион',
285: 'кваторнонагинтилион',
288: 'квиннонагинтилион',
291: 'секснонагинтилион',
294: 'септеннонагинтилион',
297: 'октононагинтилион',
300: 'новемнонагинтилион',
303: 'центилион',
}
def to_cardinal(self, value):
return '' if value is None else self._to_words(value).strip()
def to_ordinal(self, _):
raise NotImplementedError
def to_ordinal_num(self, _):
raise NotImplementedError
def to_year(self, _):
raise NotImplementedError
def to_currency(self, _):
raise NotImplementedError
def _split_number(self, num):
if isinstance(num, int):
num = str(num)
first = []
if len(num) % 3 != 0:
if len(num[1:]) % 3 == 0:
first = [num[0:1]]
num = num[1:]
elif len(num[2:]) % 3 == 0:
first = [num[0:2]]
num = num[2:]
ret = [num[i:i + 3] for i in range(0, len(num), 3)]
return first + ret
def _discard_empties(self, ls):
return list(filter(lambda x: x is not None, ls))
def _show_digits_group(self, num, gender=0, last=False):
num = int(num)
e = int(num % 10) # ones
d = int((num - e) % 100 / 10) # tens
s = int((num - d * 10 - e) % 1000 / 100) # hundreds
ret = [None] * 6
if s:
if s == 1:
ret[1] = self._misc_strings['sto']
elif s == 2 or s == 3:
ret[1] = self._digits[0][s] + self._misc_strings['sta']
else:
ret[1] = self._digits[0][s] + self._misc_strings['stotin']
if d:
if d == 1:
if not e:
ret[3] = self._misc_strings['deset']
else:
if e == 1:
ret[3] = self._misc_strings['edinadeset']
else:
ret[3] = self._digits[1][e] + self._misc_strings['na'] + self._misc_strings['deset']
e = 0
else:
ret[3] = self._digits[1][d] + self._misc_strings['deset']
if e:
ret[5] = self._digits[gender][e]
if len(self._discard_empties(ret)) > 1:
if e:
ret[4] = self._and
else:
ret[2] = self._and
if last:
if not s or len(self._discard_empties(ret)) == 1:
ret[0] = self._and
self._last_and = True
return self._sep.join(self._discard_empties(ret))
def _to_words(self, num=0):
num_groups = self._split_number(num)
sizeof_num_groups = len(num_groups)
ret = [None] * (sizeof_num_groups + 1)
ret_minus = ''
if num < 0:
ret_minus = self._minus + self._sep
elif num == 0:
return self._zero
i = sizeof_num_groups - 1
j = 1
while i >= 0:
if ret[j] is None:
ret[j] = ''
_pow = sizeof_num_groups - i
if num_groups[i] != '000':
if int(num_groups[i]) > 1:
if _pow == 1:
ret[j] += self._show_digits_group(num_groups[i], 0, not self._last_and and i) + self._sep
ret[j] += self._exponent[(_pow - 1) * 3]
elif _pow == 2:
ret[j] += self._show_digits_group(num_groups[i], -1, not self._last_and and i) + self._sep
ret[j] += self._misc_strings['hiliadi'] + self._sep
else:
ret[j] += self._show_digits_group(num_groups[i], 1, not self._last_and and i) + self._sep
ret[j] += self._exponent[(_pow - 1) * 3] + self._plural + self._sep
else:
if _pow == 1:
ret[j] += self._show_digits_group(num_groups[i], 0, not self._last_and and i) + self._sep
elif _pow == 2:
ret[j] += self._exponent[(_pow - 1) * 3] + self._sep
else:
ret[j] += self._digits[1][1] + self._sep + self._exponent[(_pow - 1) * 3] + self._sep
i -= 1
j += 1
ret = self._discard_empties(ret)
ret.reverse()
return ret_minus + ''.join(ret)
def patch_num2words():
try:
import num2words # noqa: PLC0415
except ImportError:
_logger = logging.getLogger(__name__)
_logger.warning("num2words is not available, Arabic number to words conversion will not work")
return
if MIN_PY_VERSION >= (3, 12):
raise RuntimeError("The num2words monkey patch is obsolete. Bump the version of the library to the latest available in the official package repository, if it hasn't already been done, and remove the patch.")
num2words.CONVERTER_CLASSES["ar"] = Num2Word_AR_Fixed()
num2words.CONVERTER_CLASSES["bg"] = NumberToWords_BG()
+131
View File
@@ -0,0 +1,131 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
"""
In ubuntu noble, some timezone where removed leading to errors when trying to assign/access them.
This was partially fixed in the code by removing all references to old timezones but one issue remains:
if a database contains timezones that are not defined in the os, the resolution will fail and break
at runtime.
This patches proposes to alter timezone to fallback on the new canonical timezone if the timezone was removed.
This list was generated by checking all symlink in /usr/share/zoneinfo in ubuntu 22.04 that disapeared in ubuntu 24.04
This solutions will work when moving a database from one server to another, even without migration.
This list could be improved for other purposes.
"""
import pytz
_tz_mapping = {
"Africa/Asmera": "Africa/Nairobi",
"America/Argentina/ComodRivadavia": "America/Argentina/Catamarca",
"America/Buenos_Aires": "America/Argentina/Buenos_Aires",
"America/Cordoba": "America/Argentina/Cordoba",
"America/Fort_Wayne": "America/Indiana/Indianapolis",
"America/Indianapolis": "America/Indiana/Indianapolis",
"America/Jujuy": "America/Argentina/Jujuy",
"America/Knox_IN": "America/Indiana/Knox",
"America/Louisville": "America/Kentucky/Louisville",
"America/Mendoza": "America/Argentina/Mendoza",
"America/Rosario": "America/Argentina/Cordoba",
"Antarctica/South_Pole": "Pacific/Auckland",
"Asia/Ashkhabad": "Asia/Ashgabat",
"Asia/Calcutta": "Asia/Kolkata",
"Asia/Chungking": "Asia/Shanghai",
"Asia/Dacca": "Asia/Dhaka",
"Asia/Katmandu": "Asia/Kathmandu",
"Asia/Macao": "Asia/Macau",
"Asia/Rangoon": "Asia/Yangon",
"Asia/Saigon": "Asia/Ho_Chi_Minh",
"Asia/Thimbu": "Asia/Thimphu",
"Asia/Ujung_Pandang": "Asia/Makassar",
"Asia/Ulan_Bator": "Asia/Ulaanbaatar",
"Atlantic/Faeroe": "Atlantic/Faroe",
"Australia/ACT": "Australia/Sydney",
"Australia/LHI": "Australia/Lord_Howe",
"Australia/North": "Australia/Darwin",
"Australia/NSW": "Australia/Sydney",
"Australia/Queensland": "Australia/Brisbane",
"Australia/South": "Australia/Adelaide",
"Australia/Tasmania": "Australia/Hobart",
"Australia/Victoria": "Australia/Melbourne",
"Australia/West": "Australia/Perth",
"Brazil/Acre": "America/Rio_Branco",
"Brazil/DeNoronha": "America/Noronha",
"Brazil/East": "America/Sao_Paulo",
"Brazil/West": "America/Manaus",
"Canada/Atlantic": "America/Halifax",
"Canada/Central": "America/Winnipeg",
"Canada/Eastern": "America/Toronto",
"Canada/Mountain": "America/Edmonton",
"Canada/Newfoundland": "America/St_Johns",
"Canada/Pacific": "America/Vancouver",
"Canada/Saskatchewan": "America/Regina",
"Canada/Yukon": "America/Whitehorse",
"Chile/Continental": "America/Santiago",
"Chile/EasterIsland": "Pacific/Easter",
"Cuba": "America/Havana",
"Egypt": "Africa/Cairo",
"Eire": "Europe/Dublin",
"Europe/Kiev": "Europe/Kyiv",
"Europe/Uzhgorod": "Europe/Kyiv",
"Europe/Zaporozhye": "Europe/Kyiv",
"GB": "Europe/London",
"GB-Eire": "Europe/London",
"GMT+0": "Etc/GMT",
"GMT-0": "Etc/GMT",
"GMT0": "Etc/GMT",
"Greenwich": "Etc/GMT",
"Hongkong": "Asia/Hong_Kong",
"Iceland": "Africa/Abidjan",
"Iran": "Asia/Tehran",
"Israel": "Asia/Jerusalem",
"Jamaica": "America/Jamaica",
"Japan": "Asia/Tokyo",
"Kwajalein": "Pacific/Kwajalein",
"Libya": "Africa/Tripoli",
"Mexico/BajaNorte": "America/Tijuana",
"Mexico/BajaSur": "America/Mazatlan",
"Mexico/General": "America/Mexico_City",
"Navajo": "America/Denver",
"NZ": "Pacific/Auckland",
"NZ-CHAT": "Pacific/Chatham",
"Pacific/Enderbury": "Pacific/Kanton",
"Pacific/Ponape": "Pacific/Guadalcanal",
"Pacific/Truk": "Pacific/Port_Moresby",
"Poland": "Europe/Warsaw",
"Portugal": "Europe/Lisbon",
"PRC": "Asia/Shanghai",
"ROC": "Asia/Taipei",
"ROK": "Asia/Seoul",
"Singapore": "Asia/Singapore",
"Türkiye": "Europe/Istanbul",
"UCT": "Etc/UTC",
"Universal": "Etc/UTC",
"US/Alaska": "America/Anchorage",
"US/Aleutian": "America/Adak",
"US/Arizona": "America/Phoenix",
"US/Central": "America/Chicago",
"US/Eastern": "America/New_York",
"US/East-Indiana": "America/Indiana/Indianapolis",
"US/Hawaii": "Pacific/Honolulu",
"US/Indiana-Starke": "America/Indiana/Knox",
"US/Michigan": "America/Detroit",
"US/Mountain": "America/Denver",
"US/Pacific": "America/Los_Angeles",
"US/Samoa": "Pacific/Pago_Pago",
"W-SU": "Europe/Moscow",
"Zulu": "Etc/UTC",
}
original_pytz_timezone = pytz.timezone
def patch_pytz():
def timezone(name):
if name not in pytz.all_timezones_set and name in _tz_mapping:
name = _tz_mapping[name]
return original_pytz_timezone(name)
pytz.timezone = timezone
+159
View File
@@ -0,0 +1,159 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
"""
Monkeypatch to block all HTTP requests to odoo.com domains.
This prevents any telemetry or data transmission to Odoo servers.
"""
import logging
from urllib.parse import urlparse
_logger = logging.getLogger(__name__)
# List of blocked domains
BLOCKED_DOMAINS = [
'odoo.com',
'www.odoo.com',
'services.odoo.com',
'iot-proxy.odoo.com',
'accounts.odoo.com',
'partner-autocomplete.odoo.com',
'iap.odoo.com',
'iap-services.odoo.com',
'sms.api.odoo.com',
'media-api.odoo.com',
'olg.api.odoo.com',
'iap-snailmail.odoo.com',
'l10n-in-edi.api.odoo.com',
'l10n-in-edi-demo.api.odoo.com',
'nightly.odoo.com',
'apps.odoo.com',
# 'website.api.odoo.com',
]
# Also block any subdomain of odoo.com
def is_blocked_domain(url):
"""Check if a URL belongs to a blocked domain."""
try:
parsed = urlparse(url)
hostname = parsed.hostname or ''
hostname_lower = hostname.lower()
# Check exact matches
if hostname_lower in BLOCKED_DOMAINS:
return True
# Check if it's a subdomain of odoo.com
# if hostname_lower.endswith('.odoo.com'):
# return True
return False
except Exception:
return False
def patch_requests():
"""Monkeypatch requests library to block requests to odoo.com domains."""
try:
import requests
# Store original methods
_original_post = requests.post
_original_get = requests.get
_original_put = requests.put
_original_patch = requests.patch
_original_delete = requests.delete
_original_request = requests.request
_original_session_request = requests.Session.request if hasattr(requests.Session, 'request') else None
def blocked_request(method, url, *args, **kwargs):
"""Block requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked request to Odoo server: %s %s", method, url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_request(method, url, *args, **kwargs)
def blocked_post(url, *args, **kwargs):
"""Block POST requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked POST request to Odoo server: %s", url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_post(url, *args, **kwargs)
def blocked_get(url, *args, **kwargs):
"""Block GET requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked GET request to Odoo server: %s", url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_get(url, *args, **kwargs)
def blocked_put(url, *args, **kwargs):
"""Block PUT requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked PUT request to Odoo server: %s", url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_put(url, *args, **kwargs)
def blocked_patch(url, *args, **kwargs):
"""Block PATCH requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked PATCH request to Odoo server: %s", url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_patch(url, *args, **kwargs)
def blocked_delete(url, *args, **kwargs):
"""Block DELETE requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked DELETE request to Odoo server: %s", url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_delete(url, *args, **kwargs)
# Patch requests module
requests.post = blocked_post
requests.get = blocked_get
requests.put = blocked_put
requests.patch = blocked_patch
requests.delete = blocked_delete
requests.request = blocked_request
# Patch Session class
if _original_session_request:
def blocked_session_request(self, method, url, *args, **kwargs):
"""Block Session requests to odoo.com domains."""
if is_blocked_domain(url):
_logger.warning("Blocked Session request to Odoo server: %s %s", method, url)
raise ConnectionError(f"Request to Odoo server blocked: {url}")
return _original_session_request(self, method, url, *args, **kwargs)
requests.Session.request = blocked_session_request
_logger.info("Requests library patched to block Odoo server connections")
except ImportError:
_logger.warning("requests library not available, skipping patch")
except Exception as e:
_logger.error("Failed to patch requests library: %s", e)
def patch_urllib3_requests():
"""Monkeypatch urllib3 to block requests to odoo.com domains."""
try:
import urllib3
_original_urlopen = urllib3.poolmanager.PoolManager.urlopen if hasattr(urllib3.poolmanager.PoolManager, 'urlopen') else None
if _original_urlopen:
def blocked_urlopen(self, method, url, *args, **kwargs):
"""Block urllib3 requests to odoo.com domains."""
url_str = str(url) if not isinstance(url, str) else url
if is_blocked_domain(url_str):
_logger.warning("Blocked urllib3 request to Odoo server: %s %s", method, url_str)
raise ConnectionError(f"Request to Odoo server blocked: {url_str}")
return _original_urlopen(self, method, url, *args, **kwargs)
urllib3.poolmanager.PoolManager.urlopen = blocked_urlopen
_logger.info("urllib3 PoolManager patched to block Odoo server connections")
except ImportError:
_logger.warning("urllib3 library not available, skipping patch")
except Exception as e:
_logger.error("Failed to patch urllib3 library: %s", e)
+57
View File
@@ -0,0 +1,57 @@
# ruff: noqa: PLC0415
_soap_clients = {}
def new_get_soap_client(wsdlurl, timeout=30):
# stdnum library does not set the timeout for the zeep Transport class correctly
# (timeout is to fetch the wsdl and operation_timeout is to perform the call),
# requiring us to monkey patch the get_soap_client function.
# Can be removed when https://github.com/arthurdejong/python-stdnum/issues/444 is
# resolved and the version of the dependency is updated.
# The code is a copy of the original apart for the line related to the Transport class.
# This was done to keep the code as similar to the original and to reduce the possibility
# of introducing import errors, even though some imports are not in the requirements.
# See https://github.com/odoo/odoo/pull/173359 for a more thorough explanation.
if (wsdlurl, timeout) not in _soap_clients:
try:
from zeep.transports import Transport
transport = Transport(operation_timeout=timeout, timeout=timeout) # operational_timeout added here
from zeep import CachingClient
client = CachingClient(wsdlurl, transport=transport).service
except ImportError:
# fall back to non-caching zeep client
try:
from zeep import Client
client = Client(wsdlurl, transport=transport).service
except ImportError:
# other implementations require passing the proxy config
try:
from urllib import getproxies
except ImportError:
from urllib.request import getproxies
# fall back to suds
try:
from suds.client import Client
client = Client(
wsdlurl, proxy=getproxies(), timeout=timeout).service
except ImportError:
# use pysimplesoap as last resort
try:
from pysimplesoap.client import SoapClient
client = SoapClient(
wsdl=wsdlurl, proxy=getproxies(), timeout=timeout)
except ImportError:
raise ImportError(
'No SOAP library (such as zeep) found')
_soap_clients[(wsdlurl, timeout)] = client
return _soap_clients[(wsdlurl, timeout)]
def patch_stdnum():
try:
from stdnum import util
except ImportError:
return # nothing to patch
util.get_soap_client = new_get_soap_client
+12
View File
@@ -0,0 +1,12 @@
from urllib3 import PoolManager
orig_pool_init = PoolManager.__init__
def pool_init(self, *args, **kwargs):
orig_pool_init(self, *args, **kwargs)
self.pool_classes_by_scheme = {**self.pool_classes_by_scheme}
def patch_urllib3():
PoolManager.__init__ = pool_init
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
from zeep.xsd import visitor
from zeep.xsd.const import xsd_ns
def patch_zeep():
# see https://github.com/mvantellingen/python-zeep/issues/1185
if visitor.tags.notation.localname != 'notation':
visitor.tags.notation = xsd_ns('notation')
visitor.SchemaVisitor.visitors[visitor.tags.notation] = visitor.SchemaVisitor.visit_notation
+25
View File
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
""" Addons module.
This module serves to contain all Odoo addons, across all configured addons
paths. For the code to manage those addons, see odoo.modules.
Addons are made available under `odoo.addons` after
odoo.tools.config.parse_config() is called (so that the addons paths are
known).
This module also conveniently reexports some symbols from odoo.modules.
Importing them from here is deprecated.
"""
# make odoo.addons a namespace package, while keeping this __init__.py
# present, for python 2 compatibility
# https://packaging.python.org/guides/packaging-namespace-packages/
import pkgutil
import os.path
__path__ = [
os.path.abspath(path)
for path in pkgutil.extend_path(__path__, __name__)
]
+12
View File
@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import controllers
from . import models
from . import report
from . import wizard
def post_init(env):
"""Rewrite ICP's to force groups"""
env['ir.config_parameter'].init(force=True)
+95
View File
@@ -0,0 +1,95 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Base',
'version': '1.3',
'category': 'Hidden',
'description': """
The kernel of Odoo, needed for all installation.
===================================================
""",
'data': [
'data/res_bank.xml',
'data/res.lang.csv',
'data/res_lang_data.xml',
'data/res_partner_data.xml',
'data/res_currency_data.xml',
'data/res_company_data.xml',
'data/res_users_data.xml',
'data/report_paperformat_data.xml',
'data/res_country_data.xml',
'data/ir_demo_data.xml',
'security/base_groups.xml',
'security/base_security.xml',
'views/base_menus.xml',
'views/decimal_precision_views.xml',
'views/res_config_views.xml',
'data/res.country.state.csv',
'views/ir_actions_views.xml',
'views/ir_asset_views.xml',
'views/ir_config_parameter_views.xml',
'views/ir_cron_views.xml',
'views/ir_cron_trigger_views.xml',
'views/ir_filters_views.xml',
'views/ir_mail_server_views.xml',
'views/ir_model_views.xml',
'views/ir_attachment_views.xml',
'views/ir_rule_views.xml',
'views/ir_sequence_views.xml',
'views/ir_ui_menu_views.xml',
'views/ir_ui_view_views.xml',
'views/ir_default_views.xml',
'data/ir_config_parameter_data.xml',
'data/ir_cron_data.xml',
'report/ir_model_report.xml',
'report/ir_model_templates.xml',
'views/ir_logging_views.xml',
'views/ir_qweb_widget_templates.xml',
'views/ir_module_views.xml',
'data/ir_module_category_data.xml',
'data/ir_module_module.xml',
'report/ir_module_reports.xml',
'report/ir_module_report_templates.xml',
'wizard/base_module_update_views.xml',
'wizard/base_language_install_views.xml',
'wizard/base_import_language_views.xml',
'wizard/base_module_upgrade_views.xml',
'wizard/base_module_uninstall_views.xml',
'wizard/base_export_language_views.xml',
'wizard/base_partner_merge_views.xml',
'data/ir_demo_failure_data.xml',
'views/ir_profile_views.xml',
'views/res_company_views.xml',
'views/res_lang_views.xml',
'views/res_partner_views.xml',
'views/res_bank_views.xml',
'views/res_country_views.xml',
'views/res_currency_views.xml',
'views/res_users_views.xml',
'views/res_device_views.xml',
'views/res_users_identitycheck_views.xml',
'views/res_config_settings_views.xml',
'views/report_paperformat_views.xml',
'security/ir.model.access.csv',
],
'demo': [
'data/res_users_demo.xml',
'data/res_partner_bank_demo.xml',
'data/res_currency_demo.xml',
'data/res_currency_rate_demo.xml',
'data/res_bank_demo.xml',
'data/res_partner_demo.xml',
'data/res_partner_image_demo.xml',
],
'assets': {
'web.assets_tests': [
'base/static/tests/**/*',
],
},
'installable': True,
'auto_install': True,
'post_init_hook': 'post_init',
'license': 'LGPL-3',
}
+1
View File
@@ -0,0 +1 @@
from . import rpc
+178
View File
@@ -0,0 +1,178 @@
import re
import sys
import traceback
import xmlrpc.client
from datetime import date, datetime
from collections import defaultdict
from markupsafe import Markup
import odoo
from odoo.http import Controller, route, dispatch_rpc, request, Response
from odoo.fields import Date, Datetime, Command
from odoo.tools import lazy
from odoo.tools.misc import frozendict
# ==========================================================
# XML-RPC helpers
# ==========================================================
# XML-RPC fault codes. Some care must be taken when changing these: the
# constants are also defined client-side and must remain in sync.
# User code must use the exceptions defined in ``odoo.exceptions`` (not
# create directly ``xmlrpc.client.Fault`` objects).
RPC_FAULT_CODE_CLIENT_ERROR = 1 # indistinguishable from app. error.
RPC_FAULT_CODE_APPLICATION_ERROR = 1
RPC_FAULT_CODE_WARNING = 2
RPC_FAULT_CODE_ACCESS_DENIED = 3
RPC_FAULT_CODE_ACCESS_ERROR = 4
# 0 to 31, excluding tab, newline, and carriage return
CONTROL_CHARACTERS = dict.fromkeys(set(range(32)) - {9, 10, 13})
def xmlrpc_handle_exception_int(e):
if isinstance(e, odoo.exceptions.RedirectWarning):
fault = xmlrpc.client.Fault(RPC_FAULT_CODE_WARNING, str(e))
elif isinstance(e, odoo.exceptions.AccessError):
fault = xmlrpc.client.Fault(RPC_FAULT_CODE_ACCESS_ERROR, str(e))
elif isinstance(e, odoo.exceptions.AccessDenied):
fault = xmlrpc.client.Fault(RPC_FAULT_CODE_ACCESS_DENIED, str(e))
elif isinstance(e, odoo.exceptions.UserError):
fault = xmlrpc.client.Fault(RPC_FAULT_CODE_WARNING, str(e))
else:
info = sys.exc_info()
formatted_info = "".join(traceback.format_exception(*info))
fault = xmlrpc.client.Fault(RPC_FAULT_CODE_APPLICATION_ERROR, formatted_info)
return dumps(fault)
def xmlrpc_handle_exception_string(e):
if isinstance(e, odoo.exceptions.RedirectWarning):
fault = xmlrpc.client.Fault('warning -- Warning\n\n' + str(e), '')
elif isinstance(e, odoo.exceptions.MissingError):
fault = xmlrpc.client.Fault('warning -- MissingError\n\n' + str(e), '')
elif isinstance(e, odoo.exceptions.AccessError):
fault = xmlrpc.client.Fault('warning -- AccessError\n\n' + str(e), '')
elif isinstance(e, odoo.exceptions.AccessDenied):
fault = xmlrpc.client.Fault('AccessDenied', str(e))
elif isinstance(e, odoo.exceptions.UserError):
fault = xmlrpc.client.Fault('warning -- UserError\n\n' + str(e), '')
#InternalError
else:
info = sys.exc_info()
formatted_info = "".join(traceback.format_exception(*info))
fault = xmlrpc.client.Fault(odoo.tools.exception_to_unicode(e), formatted_info)
return dumps(fault)
class OdooMarshaller(xmlrpc.client.Marshaller):
dispatch = dict(xmlrpc.client.Marshaller.dispatch)
def dump_frozen_dict(self, value, write):
value = dict(value)
self.dump_struct(value, write)
# By default, in xmlrpc, bytes are converted to xmlrpc.client.Binary object.
# Historically, odoo is sending binary as base64 string.
# In python 3, base64.b64{de,en}code() methods now works on bytes.
def dump_bytes(self, value, write):
self.dump_unicode(value.decode(), write)
def dump_datetime(self, value, write):
# override to marshall as a string for backwards compatibility
value = Datetime.to_string(value)
self.dump_unicode(value, write)
# convert date objects to strings in iso8061 format.
def dump_date(self, value, write):
value = Date.to_string(value)
self.dump_unicode(value, write)
def dump_lazy(self, value, write):
v = value._value
return self.dispatch[type(v)](self, v, write)
def dump_unicode(self, value, write):
# XML 1.0 disallows control characters, remove them otherwise they break clients
return super().dump_unicode(value.translate(CONTROL_CHARACTERS), write)
dispatch[frozendict] = dump_frozen_dict
dispatch[bytes] = dump_bytes
dispatch[datetime] = dump_datetime
dispatch[date] = dump_date
dispatch[lazy] = dump_lazy
dispatch[str] = dump_unicode
dispatch[Command] = dispatch[int]
dispatch[defaultdict] = dispatch[dict]
dispatch[Markup] = lambda self, value, write: self.dispatch[str](self, str(value), write)
def dumps(params: list | tuple | xmlrpc.client.Fault) -> str:
response = OdooMarshaller(allow_none=False).dumps(params)
return f"""\
<?xml version="1.0"?>
<methodResponse>
{response}
</methodResponse>
"""
# ==========================================================
# RPC Controller
# ==========================================================
def _check_request():
if request.db:
request.env.cr.close()
class RPC(Controller):
"""Handle RPC connections."""
def _xmlrpc(self, service):
"""Common method to handle an XML-RPC request."""
_check_request()
data = request.httprequest.get_data()
params, method = xmlrpc.client.loads(data, use_datetime=True)
result = dispatch_rpc(service, method, params)
return dumps((result,))
@route("/xmlrpc/<service>", auth="none", methods=["POST"], csrf=False, save_session=False)
def xmlrpc_1(self, service):
"""XML-RPC service that returns faultCode as strings.
This entrypoint is historical and non-compliant, but kept for
backwards-compatibility.
"""
_check_request()
try:
response = self._xmlrpc(service)
except Exception as error:
error.error_response = Response(
response=xmlrpc_handle_exception_string(error),
mimetype='text/xml',
)
raise
return Response(response=response, mimetype='text/xml')
@route("/xmlrpc/2/<service>", auth="none", methods=["POST"], csrf=False, save_session=False)
def xmlrpc_2(self, service):
"""XML-RPC service that returns faultCode as int."""
_check_request()
try:
response = self._xmlrpc(service)
except Exception as error:
error.error_response = Response(
response=xmlrpc_handle_exception_int(error),
mimetype='text/xml',
)
raise
return Response(response=response, mimetype='text/xml')
@route('/jsonrpc', type='json', auth="none", save_session=False)
def jsonrpc(self, service, method, args):
""" Method used by client APIs to contact OpenERP. """
_check_request()
return dispatch_rpc(service, method, args)
+140
View File
@@ -0,0 +1,140 @@
-------------------------------------------------------------------------
-- Pure SQL
-------------------------------------------------------------------------
CREATE TABLE ir_actions (
id serial,
primary key(id)
);
CREATE TABLE ir_act_window (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_report_xml (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_url (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_server (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_client (primary key(id)) INHERITS (ir_actions);
CREATE TABLE res_users (
id serial NOT NULL,
-- No FK references below, will be added later by ORM
-- (when the destination rows exist)
company_id integer, -- references res_company,
partner_id integer, -- references res_partner,
active boolean default True,
create_date timestamp without time zone,
login varchar(64) NOT NULL UNIQUE,
password varchar default null,
primary key(id)
);
CREATE TABLE res_groups (
id serial NOT NULL,
name jsonb NOT NULL,
primary key(id)
);
CREATE TABLE ir_module_category (
id serial NOT NULL,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer, -- references res_users on delete set null,
parent_id integer REFERENCES ir_module_category ON DELETE SET NULL,
name jsonb NOT NULL,
primary key(id)
);
CREATE TABLE ir_module_module (
id serial NOT NULL,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer, -- references res_users on delete set null,
website character varying,
summary jsonb,
name character varying NOT NULL,
author character varying,
icon varchar,
state character varying(16),
latest_version character varying,
shortdesc jsonb,
category_id integer REFERENCES ir_module_category ON DELETE SET NULL,
description jsonb,
application boolean default False,
demo boolean default False,
web boolean DEFAULT FALSE,
license character varying(32),
sequence integer DEFAULT 100,
auto_install boolean default False,
to_buy boolean default False,
primary key(id)
);
CREATE TABLE ir_module_module_dependency (
id serial NOT NULL,
name character varying,
module_id integer REFERENCES ir_module_module ON DELETE cascade,
auto_install_required boolean DEFAULT true,
primary key(id)
);
CREATE TABLE ir_model_data (
id serial NOT NULL,
create_uid integer,
create_date timestamp without time zone DEFAULT (now() at time zone 'UTC'),
write_date timestamp without time zone DEFAULT (now() at time zone 'UTC'),
write_uid integer,
res_id integer,
noupdate boolean DEFAULT False,
name varchar NOT NULL,
module varchar NOT NULL,
model varchar NOT NULL,
primary key(id)
);
CREATE TABLE res_currency (
id serial,
name varchar NOT NULL,
symbol varchar NOT NULL,
primary key(id)
);
CREATE TABLE res_company (
id serial,
name varchar NOT NULL,
partner_id integer,
currency_id integer,
sequence integer,
create_date timestamp without time zone,
primary key(id)
);
CREATE TABLE res_partner (
id serial,
company_id integer,
create_date timestamp without time zone,
name varchar,
primary key(id)
);
---------------------------------
-- Default data
---------------------------------
insert into res_currency (id, name, symbol) VALUES (1, 'USD', '$');
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('USD', 'base', 'res.currency', true, 1);
select setval('res_currency_id_seq', 1);
insert into res_company (id, name, partner_id, currency_id, create_date) VALUES (1, 'My Company', 1, 1, now() at time zone 'UTC');
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('main_company', 'base', 'res.company', true, 1);
select setval('res_company_id_seq', 1);
insert into res_partner (id, name, company_id, create_date) VALUES (1, 'My Company', 1, now() at time zone 'UTC');
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('main_partner', 'base', 'res.partner', true, 1);
select setval('res_partner_id_seq', 1);
insert into res_users (id, login, password, active, partner_id, company_id, create_date) VALUES (1, '__system__', NULL, false, 1, 1, now() at time zone 'UTC');
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('user_root', 'base', 'res.users', true, 1);
select setval('res_users_id_seq', 1);
insert into res_groups (id, name) VALUES (1, '{"en_US": "Employee"}');
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('group_user', 'base', 'res.groups', true, 1);
select setval('res_groups_id_seq', 1);
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="default_max_email_size" model="ir.config_parameter">
<field name="key">base.default_max_email_size</field>
<field name="value">10</field>
</record>
</data>
</odoo>
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="autovacuum_job" model="ir.cron">
<field name="name">Base: Auto-vacuum internal data</field>
<field name="model_id" ref="model_ir_autovacuum"/>
<field name="state">code</field>
<field name="code">model._run_vacuum_cleaner()</field>
<field name='interval_number'>1</field>
<field name='interval_type'>days</field>
<field name="priority">3</field>
</record>
<record id="ir_cron_res_users_deletion" model="ir.cron">
<field name="name">Base: Portal Users Deletion</field>
<field name="model_id" ref="base.model_res_users_deletion"/>
<field name="state">code</field>
<field name="code">model._gc_portal_users(batch_size=50)</field>
<field name='interval_number'>1</field>
<field name='interval_type'>days</field>
<field name="priority">8</field>
</record>
</odoo>
+37
View File
@@ -0,0 +1,37 @@
<odoo>
<record model="ir.actions.act_window" id="demo_force_install_action">
<field name="name">Load demo data</field>
<field name="res_model">ir.demo</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="demo_force_install_form">
<field name="name">ir.demo.form</field>
<field name="model">ir.demo</field>
<field name="arch" type="xml">
<form>
<div class="row container">
<div class="col-12 text-center">
<div class="card text-white bg-danger mb-3 w-75 ml64">
<div class="card-header">
<span class="fa fa-2x fa-warning" t-translation="off">&amp;nbsp;</span>
<span class="text-white text-uppercase">Danger Zone</span>
</div>
<div class="card-body bg-transparent text-center">
<p>Demo data should only be used on test databases!
Once they are loaded, they cannot be removed!</p>
<p>Please confirm that you want to <b>irreversibly</b> make this database a demo database.</p>
</div>
</div>
</div>
</div>
<footer>
<button special="cancel" data-hotkey="x" string="Oops, no!" class="btn-primary"/>
<button name="install_demo" string="Yes, I understand the risks" type="object" class="btn-secondary" data-hotkey="q"/>
</footer>
</form>
</field>
</record>
</odoo>
@@ -0,0 +1,71 @@
<odoo>
<record model="ir.actions.server" id="demo_failure_action">
<field name="name">Failed to install demo data for some modules, demo disabled</field>
<field name="model_id" ref="base.model_ir_demo_failure_wizard"/>
<field name="state">code</field>
<field name="code">
failures = env['ir.demo_failure'].search([
('wizard_id', '=', False),
])
record = model.create({
'failure_ids': [Command.set(failures.ids)],
})
action = {
'type': 'ir.actions.act_window',
'res_id': record.id,
'res_model': 'ir.demo_failure.wizard',
'target': 'new',
'views': [(env.ref('base.demo_failures_dialog').id, 'form')],
}
</field>
</record>
<record model="ir.ui.view" id="demo_failures_dialog">
<field name="name">Demo Failure Dialog</field>
<field name="model">ir.demo_failure.wizard</field>
<field name="arch" type="xml">
<form>
<h3>
The demonstration data of <field name="failures_count"/>
module(s) failed to install and were disabled
</h3>
<field name="failure_ids">
<list>
<field name="module_id"/>
<field name="error"/>
</list>
</field>
<footer>
<button string="Ok" class="oe_highlight" type="object" name="done" data-hotkey="q"/>
</footer>
</form>
</field>
</record>
<record model="ir.ui.view" id="demo_wizard_form_view">
<field name="name">Demo Failure Form</field>
<field name="model">ir.demo_failure</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="module_id"/>
<field name="wizard_id"/>
</group>
<group>
<field name="error"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.actions.todo" id="demo_failure_todo">
<field name="name">Demo Failure Notification</field>
<field name="sequence">1</field>
<field name="state">done</field>
<field name="action_id" ref="base.demo_failure_action"/>
</record>
</odoo>
@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.module.category" id="module_category_hidden">
<field name="name">Technical</field>
<field name="sequence">60</field>
<field name="visible" eval="0" />
</record>
<record model="ir.module.category" id="module_category_accounting">
<field name="name">Accounting</field>
<field name="sequence">15</field>
</record>
<record model="ir.module.category" id="module_category_accounting_localizations">
<field name="name">Localization</field>
<field name="sequence">65</field>
<field name="visible" eval="0" />
<field name="parent_id" ref="module_category_accounting"/>
</record>
<record model="ir.module.category" id="module_category_payroll_localization">
<field name="name">Payroll Localization</field>
<field name="visible" eval="0" />
</record>
<record model="ir.module.category" id="module_category_accounting_localizations_account_charts">
<field name="parent_id" ref="module_category_accounting_localizations" />
<field name="name">Account Charts</field>
<field name="visible" eval="0" />
</record>
<record model="ir.module.category" id="module_category_user_type">
<field name="name">User types</field>
<field name="description">Helps you manage users.</field>
<field name="sequence">9</field>
</record>
<record model="ir.module.category" id="module_category_accounting_accounting">
<field name="name">Invoicing</field>
<field name="sequence">4</field>
</record>
<record model="ir.module.category" id="module_category_sales">
<field name="name">Sales</field>
<field name="sequence">5</field>
</record>
<record model="ir.module.category" id="module_category_human_resources">
<field name="name">Human Resources</field>
<field name="sequence">45</field>
</record>
<record model="ir.module.category" id="module_category_marketing">
<field name="name">Marketing</field>
<field name="sequence">40</field>
</record>
<record model="ir.module.category" id="module_category_manufacturing">
<field name="name">Manufacturing</field>
<field name="sequence">30</field>
</record>
<record model="ir.module.category" id="module_category_website">
<field name="name">Website</field>
<field name="sequence">35</field>
</record>
<record model="ir.module.category" id="module_category_theme">
<field name="name">Theme</field>
<field name="exclusive" eval="0"/>
<field name="sequence">50</field>
</record>
<record model="ir.module.category" id="module_category_administration">
<field name="name">Administration</field>
<field name="sequence">100</field>
<field name="parent_id" eval="False"/>
</record>
<record model="ir.module.category" id="module_category_human_resources_appraisals">
<field name="name">Appraisals</field>
<field name="description">A user without any rights on Appraisals will be able to see the application, create and manage appraisals for himself and the people he's manager of.</field>
<field name="sequence">15</field>
</record>
<record model="ir.module.category" id="module_category_sales_sign">
<field name="name">Sign</field>
<field name="description">Helps you sign and complete your documents easily.</field>
<field name="sequence">25</field>
</record>
<record model="ir.module.category" id="module_category_services">
<field name="name">Services</field>
<field name="sequence">10</field>
</record>
<record model="ir.module.category" id="module_category_services_helpdesk">
<field name="name">Helpdesk</field>
<field name="description" />
<field name="sequence">14</field>
</record>
<record model="ir.module.category" id="module_category_services_appointment">
<field name="name">Appointment</field>
<field name="parent_id" ref="module_category_services"/>
</record>
<record model="ir.module.category" id="module_category_services_field_service">
<field name="name">Field Service</field>
<field name="parent_id" ref="module_category_services"/>
</record>
<record model="ir.module.category" id="module_category_inventory">
<field name="name">Inventory</field>
<field name="sequence">25</field>
</record>
<record model="ir.module.category" id="module_category_productivity">
<field name="name">Productivity</field>
<field name="sequence">50</field>
</record>
<record model="ir.module.category" id="module_category_customizations">
<field name="name">Customizations</field>
<field name="sequence">55</field>
</record>
<record model="ir.module.category" id="module_category_administration_administration">
<field name="name">Administration</field>
<field name="parent_id" ref="module_category_administration"/>
</record>
<record model="ir.module.category" id="module_category_usability">
<field name="name">Extra Rights</field>
<field name="sequence">101</field>
</record>
<record model="ir.module.category" id="module_category_extra">
<field name="name">Other Extra Rights</field>
<field name="sequence">102</field>
</record>
<!-- add applications to base groups -->
<record model="res.groups" id="group_erp_manager">
<field name="category_id" ref="module_category_administration_administration"/>
</record>
<record model="res.groups" id="group_system">
<field name="category_id" ref="module_category_administration_administration"/>
</record>
<record model="res.groups" id="group_user">
<field name="category_id" ref="module_category_user_type"/>
</record>
<record model="res.groups" id="group_multi_company">
<field name="category_id" ref="module_category_usability"/>
</record>
<record model="res.groups" id="group_multi_currency">
<field name="category_id" ref="module_category_usability"/>
</record>
<record model="res.groups" id="group_no_one">
<field name="category_id" ref="module_category_usability"/>
</record>
<record id="group_portal" model="res.groups">
<field name="category_id" ref="module_category_user_type"/>
</record>
<record id="group_public" model="res.groups">
<field name="category_id" ref="module_category_user_type"/>
</record>
<record id="group_partner_manager" model="res.groups">
<field name="category_id" ref="module_category_usability"/>
</record>
</data>
</odoo>
+296
View File
@@ -0,0 +1,296 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.module.module" id="base.module_web_studio">
<field name="name">web_studio</field>
<field name="shortdesc">Studio</field>
<field name="sequence">75</field>
<field name="category_id" ref="base.module_category_administration_administration"/>
<field name="application" eval="True"/>
<field name="summary">Create and Customize Applications</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/web_studio.png</field>
<field name="website">https://odoo.com/app/studio?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_timesheet_grid">
<field name="name">timesheet_grid</field>
<field name="shortdesc">Timesheets</field>
<field name="sequence">65</field>
<field name="category_id" ref="base.module_category_services_timesheets"/>
<field name="application" eval="True"/>
<field name="summary">Track time &amp; costs</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/timesheet_grid.png</field>
<field name="website">https://www.odoo.com/app/timesheet?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_accountant">
<field name="name">accountant</field>
<field name="sequence">30</field>
<field name="shortdesc">Accounting</field>
<field name="category_id" ref="base.module_category_accounting_accounting"/>
<field name="application" eval="True"/>
<field name="summary">Accounting, Taxes, Budgets, Assets...</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/account_accountant.png</field>
<field name="website">https://www.odoo.com/app/accounting?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_knowledge">
<field name="name">knowledge</field>
<field name="sequence">30</field>
<field name="shortdesc">Knowledge</field>
<field name="category_id" ref="base.module_category_productivity"/>
<field name="application" eval="True"/>
<field name="summary">Centralize, manage, share and grow your knowledge library</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/knowledge.png</field>
<field name="website">https://www.odoo.com/app/knowledge?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_industry_fsm">
<field name="name">industry_fsm</field>
<field name="shortdesc">Field Service</field>
<field name="sequence">90</field>
<field name="category_id" ref="base.module_category_services_field_service"/>
<field name="application" eval="True"/>
<field name="summary">Schedule and track onsite operations, time and material</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/industry_fsm.png</field>
<field name="website">https://www.odoo.com/app/field-service?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_helpdesk">
<field name="name">helpdesk</field>
<field name="shortdesc">Helpdesk</field>
<field name="sequence">110</field>
<field name="category_id" ref="base.module_category_services_helpdesk"/>
<field name="application" eval="True"/>
<field name="summary">Track support tickets</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/helpdesk.png</field>
<field name="website">https://www.odoo.com/app/helpdesk?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_hr_appraisal">
<field name="name">hr_appraisal</field>
<field name="shortdesc">Appraisal</field>
<field name="sequence">180</field>
<field name="category_id" ref="base.module_category_human_resources_appraisals"/>
<field name="application" eval="True"/>
<field name="summary">Assess your employees</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/hr_appraisal.png</field>
<field name="website">https://www.odoo.com/app/appraisals?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_marketing_automation">
<field name="name">marketing_automation</field>
<field name="shortdesc">Marketing Automation</field>
<field name="sequence">195</field>
<field name="category_id" ref="base.module_category_marketing_email_marketing"/>
<field name="application" eval="True"/>
<field name="summary">Build automated mailing campaigns</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/marketing_automation.png</field>
<field name="website">https://www.odoo.com/app/marketing-automation?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_mrp_plm">
<field name="name">mrp_plm</field>
<field name="shortdesc">Product Lifecycle Management (PLM)</field>
<field name="category_id" ref="base.module_category_manufacturing_manufacturing"/>
<field name="sequence">155</field>
<field name="application" eval="True"/>
<field name="summary">PLM, ECOs, Versions</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/mrp_plm.png</field>
<field name="website">https://www.odoo.com/app/plm?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_quality_control">
<field name="name">quality_control</field>
<field name="shortdesc">Quality</field>
<field name="sequence">120</field>
<field name="category_id" ref="base.module_category_manufacturing_manufacturing"/>
<field name="application" eval="True"/>
<field name="summary">Quality Alerts, Control Points</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/quality_control.png</field>
<field name="website">https://www.odoo.com/app/quality?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_sale_amazon">
<field name="name">sale_amazon</field>
<field name="shortdesc">Amazon Connector</field>
<field name="sequence">320</field>
<field name="category_id" ref="base.module_category_sales_sales"/>
<field name="application" eval="True"/>
<field name="summary">Import Amazon orders and sync deliveries</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/sale_amazon.png</field>
<field name="website">https://www.odoo.com/app/amazon-connector?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_planning">
<field name="name">planning</field>
<field name="shortdesc">Planning</field>
<field name="sequence">130</field>
<field name="category_id" ref="base.module_category_services_project"/>
<field name="application" eval="True"/>
<field name="summary">Manage your employees' schedule</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/planning.png</field>
<field name="website">https://www.odoo.com/app/planning?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_sale_subscription">
<field name="name">sale_subscription</field>
<field name="shortdesc">Subscriptions</field>
<field name="sequence">115</field>
<field name="category_id" ref="base.module_category_sales_sales"/>
<field name="application" eval="True"/>
<field name="summary">MRR, Churn, Recurring payments</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/sale_subscription.png</field>
<field name="website">https://www.odoo.com/app/subscriptions?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_sign">
<field name="name">sign</field>
<field name="shortdesc">Sign</field>
<field name="sequence">105</field>
<field name="category_id" ref="base.module_category_sales_sign"/>
<field name="application" eval="True"/>
<field name="summary">Send documents to sign online</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/sign.png</field>
<field name="website">https://www.odoo.com/app/sign?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_stock_barcode">
<field name="name">stock_barcode</field>
<field name="shortdesc">Barcode</field>
<field name="sequence">255</field>
<field name="category_id" ref="base.module_category_inventory_inventory"/>
<field name="application" eval="True"/>
<field name="summary">Barcode scanner for warehouses</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/stock_barcode.png</field>
<field name="website">https://www.odoo.com/app/inventory?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_voip">
<field name="name">voip</field>
<field name="shortdesc">VoIP</field>
<field name="sequence">280</field>
<field name="category_id" ref="base.module_category_sales_sales"/>
<field name="application" eval="True"/>
<field name="summary">Call using VoIP</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/voip.png</field>
<field name="website">https://www.odoo.com/app/crm?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_appointment">
<field name="name">appointment</field>
<field name="shortdesc">Appointments</field>
<field name="sequence">215</field>
<field name="category_id" ref="base.module_category_marketing"/>
<field name="application" eval="True"/>
<field name="summary">Online appointments scheduler</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/appointment.png</field>
<field name="website">https://www.odoo.com/app/appointments?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_social">
<field name="name">social</field>
<field name="shortdesc">Social Marketing</field>
<field name="sequence">175</field>
<field name="category_id" ref="base.module_category_marketing"/>
<field name="application" eval="True"/>
<field name="summary">Manage your social media and website visitors</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/social.png</field>
<field name="website">https://www.odoo.com/app/social-marketing</field>
</record>
<record model="ir.module.module" id="base.module_mrp_workorder">
<field name="name">mrp_workorder</field>
<field name="sequence">16</field>
<field name="shortdesc">MRP II</field>
<field name="category_id" ref="base.module_category_manufacturing_manufacturing"/>
<field name="application" eval="True"/>
<field name="summary">Work Orders, Planning, Routing</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/mrp_workorder.png</field>
<field name="website">https://www.odoo.com/page/manufacturing?utm_source=db&amp;utm_medium=module</field>
</record>
<record model="ir.module.module" id="base.module_web_mobile">
<field name="name">web_mobile</field>
<field name="sequence">220</field>
<field name="shortdesc">Android &amp; iPhone</field>
<field name="category_id" ref="base.module_category_administration_administration"/>
<field name="application" eval="True"/>
<field name="summary">Support for Android &amp; iOS Apps</field>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/web_mobile.png</field>
<field name="website">https://play.google.com/store/apps/details?id=com.odoo.mobile</field>
</record>
<record model="ir.module.module" id="base.module_payment_sepa_direct_debit">
<field name="name">payment_sepa_direct_debit</field>
<field name="shortdesc">Sepa Direct Debit Payment Provider</field>
<field name="summary">Checkout with SEPA Direct Debit</field>
<field name="category_id" ref="base.module_category_accounting_accounting"/>
<field name="license">OEEL-1</field>
<field name="author">Odoo S.A.</field>
<field name="to_buy" eval="True"/>
<field name="icon">/base/static/img/icons/payment_sepa_direct_debit.png</field>
</record>
</data>
</odoo>
+29
View File
@@ -0,0 +1,29 @@
-- deactivate mail servers
UPDATE ir_mail_server
SET active = false;
-- insert dummy mail server to prevent using fallback servers specified using command line
INSERT INTO ir_mail_server(name, smtp_port, smtp_host, smtp_encryption, active, smtp_authentication)
VALUES ('neutralization - disable emails', 1025, 'invalid', 'none', true, 'login');
-- deactivate crons
UPDATE ir_cron
SET active = false
WHERE id NOT IN (
SELECT res_id
FROM ir_model_data
WHERE model = 'ir.cron'
AND name = 'autovacuum_job'
AND module = 'base'
);
-- neutralization flag for the database
INSERT INTO ir_config_parameter (key, value)
VALUES ('database.is_neutralized', true)
ON CONFLICT (key) DO
UPDATE SET value = true;
-- deactivate webhooks
UPDATE ir_act_server
SET webhook_url = 'neutralization - disable webhook'
WHERE state = 'webhook';
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="paperformat_euro" model="report.paperformat">
<field name="name">A4</field>
<field name="default" eval="True" />
<field name="format">A4</field>
<field name="page_height">0</field>
<field name="page_width">0</field>
<field name="orientation">Portrait</field>
<field name="margin_top">52</field>
<field name="margin_bottom">32</field>
<field name="margin_left">0</field>
<field name="margin_right">0</field>
<field name="header_line" eval="False" />
<field name="header_spacing">52</field>
<field name="dpi">90</field>
<field name="css_margins" eval="True" />
</record>
<record id="paperformat_us" model="report.paperformat">
<field name="name">US Letter</field>
<field name="default" eval="True" />
<field name="format">Letter</field>
<field name="page_height">0</field>
<field name="page_width">0</field>
<field name="orientation">Portrait</field>
<field name="margin_top">52</field>
<field name="margin_bottom">32</field>
<field name="margin_left">0</field>
<field name="margin_right">0</field>
<field name="header_line" eval="False" />
<field name="header_spacing">52</field>
<field name="dpi">90</field>
<field name="css_margins" eval="True" />
</record>
<record id="paperformat_batch_deposit" model="report.paperformat">
<field name="name">US Batch Deposit</field>
<field name="default" eval="False" />
<field name="format">Letter</field>
<field name="page_height">0</field>
<field name="page_width">0</field>
<field name="orientation">Portrait</field>
<field name="margin_top">15</field>
<field name="margin_bottom">30</field>
<field name="margin_left">10</field>
<field name="margin_right">10</field>
<field name="header_line" eval="False" />
<field name="header_spacing">15</field>
<field name="dpi">90</field>
</record>
</data>
</odoo>
File diff suppressed because it is too large Load Diff
+93
View File
@@ -0,0 +1,93 @@
"id","name","code","iso_code","direction","grouping","decimal_point","thousands_sep","date_format","time_format","short_time_format","week_start"
"base.lang_en","English (US)","en_US","en","Left-to-Right","[3,0]",".",",","%m/%d/%Y","%H:%M:%S","%H:%M","7"
"base.lang_am_ET","Amharic / አምሃርኛ","am_ET","am_ET","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%I:%M:%S","%I:%M","7"
"base.lang_ar","Arabic / الْعَرَبيّة","ar_001","ar","Right-to-Left","[3,0]",".",",","%d %b, %Y","%I:%M:%S %p","%I:%M","6"
"base.lang_ar_SY","Arabic (Syria) / الْعَرَبيّة","ar_SY","ar_SY","Right-to-Left","[3,0]",".",",","%d %b, %Y","%I:%M:%S %p","%I:%M","6"
"base.lang_az","Azerbaijani / Azərbaycanca","az_AZ","az","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_eu_ES","Basque / Euskara","eu_ES","eu_ES","Left-to-Right","[]",",",,"%a, %Y.eko %bren %da","%H:%M:%S","%H:%M","1"
"base.lang_be","Belarusian / Беларуская мова","be_BY","be","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_bn_IN","Bengali / বাংলা","bn_IN","bn_IN","Left-to-Right","[]",",",,"%A %d %b %Y","%I:%M:%S","%I:%M","1"
"base.lang_bs_BA","Bosnian / bosanski jezik","bs_BA","bs","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_bg","Bulgarian / български език","bg_BG","bg","Left-to-Right","[3,0]",",",,"%d.%m.%Y","%H,%M,%S","%H,%M","1"
"base.lang_ca_ES","Catalan / Català","ca_ES","ca_ES","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_zh_CN","Chinese (Simplified) / 简体中文","zh_CN","zh_CN","Left-to-Right","[3,0]",".",",","%Y年%m月%d日","%H时%M分%S秒","%H时%M分","7"
"base.lang_zh_HK","Chinese (HK)","zh_HK","zh_HK","Left-to-Right","[3,0]",".",",","%Y年%m月%d日 %A","%I時%M分%S秒","%I時%M分","7"
"base.lang_zh_TW","Chinese (Traditional) / 繁體中文","zh_TW","zh_TW","Left-to-Right","[3,0]",".",",","%Y年%m月%d日","%H時%M分%S秒","%H時%M分","7"
"base.lang_hr","Croatian / hrvatski jezik","hr_HR","hr","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_cs_CZ","Czech / Čeština","cs_CZ","cs_CZ","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_da_DK","Danish / Dansk","da_DK","da_DK","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","%H:%M","1"
"base.lang_nl_BE","Dutch (BE) / Nederlands (BE)","nl_BE","nl_BE","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","%H:%M","1"
"base.lang_nl","Dutch / Nederlands","nl_NL","nl","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","%H:%M","1"
"base.lang_en_AU","English (AU)","en_AU","en_AU","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_en_CA","English (CA)","en_CA","en_CA","Left-to-Right","[3,0]",".",",","%Y-%m-%d","%H:%M:%S","%H:%M","7"
"base.lang_en_GB","English (UK)","en_GB","en_GB","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_en_IN","English (IN)","en_IN","en_IN","Left-to-Right","[3,2,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_en_NZ","English (NZ)","en_NZ","en_NZ","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_et_EE","Estonian / Eesti keel","et_EE","et","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_fi","Finnish / Suomi","fi_FI","fi","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H.%M.%S","%H.%M","1"
"base.lang_fr_BE","French (BE) / Français (BE)","fr_BE","fr_BE","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_fr_CA","French (CA) / Français (CA)","fr_CA","fr_CA","Left-to-Right","[3,0]",","," ","%Y-%m-%d","%H:%M:%S","%H:%M","7"
"base.lang_fr_CH","French (CH) / Français (CH)","fr_CH","fr_CH","Left-to-Right","[3,0]",".","'","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_fr","French / Français","fr_FR","fr","Left-to-Right","[3,0]",","," ","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_gl_ES","Galician / Galego","gl_ES","gl","Left-to-Right","[]",",",,"%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_ka_GE","Georgian / ქართული ენა","ka_GE","ka","Left-to-Right","[3,0]",",",".","%m/%d/%Y","%H:%M:%S","%H:%M","1"
"base.lang_de","German / Deutsch","de_DE","de","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_de_CH","German (CH) / Deutsch (CH)","de_CH","de_CH","Left-to-Right","[3,0]",".","'","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_el_GR","Greek / Ελληνικά","el_GR","el_GR","Left-to-Right","[]",",",".","%d/%m/%Y","%I:%M:%S %p","%I:%M %p","1"
"base.lang_gu_IN","Gujarati / ગુજરાતી","gu_IN","gu","Left-to-Right","[]",".",",","%A %d %b %Y","%I:%M:%S","%I:%M","7"
"base.lang_he_IL","Hebrew / עברית","he_IL","he","Right-to-Left","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_hi_IN","Hindi / हिंदी","hi_IN","hi","Left-to-Right","[]",".",",","%A %d %b %Y","%I:%M:%S","%I:%M","7"
"base.lang_hu","Hungarian / Magyar","hu_HU","hu","Left-to-Right","[3,0]",",",".","%Y-%m-%d","%H:%M:%S","%H:%M","1"
"base.lang_id","Indonesian / Bahasa Indonesia","id_ID","id","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_it","Italian / Italiano","it_IT","it","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_ja_JP","Japanese / 日本語","ja_JP","ja","Left-to-Right","[3,0]",".",",","%Y年%m月%d日","%H時%M分%S秒","%H時%M分","7"
"base.lang_kab_DZ","Kabyle / Taqbaylit","kab_DZ","kab","Left-to-Right","[]",".",",","%m/%d/%Y","%I:%M:%S %p","%I:%M %p","6"
"base.lang_km","Khmer / ភាសាខ្មែរ","km_KH","km","Left-to-Right","[3,0]",".",",","%d %B %Y","%H:%M:%S","%H:%M","7"
"base.lang_ko_KP","Korean (KP) / 한국어 (KP)","ko_KP","ko_KP","Left-to-Right","[3,0]",".",",","%m/%d/%Y","%I:%M:%S %p","%I:%M %p","1"
"base.lang_ko_KR","Korean (KR) / 한국어 (KR)","ko_KR","ko_KR","Left-to-Right","[3,0]",".",",","%Y년 %m월 %d일","%H시 %M분 %S초","%H시 %M분","7"
"base.lang_lo_LA","Lao / ພາສາລາວ","lo_LA","lo","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_lv","Latvian / latviešu valoda","lv_LV","lv","Left-to-Right","[3,0]",","," ","%Y.%m.%d.","%H:%M:%S","%H:%M","1"
"base.lang_lt","Lithuanian / Lietuvių kalba","lt_LT","lt","Left-to-Right","[3,0]",",",".","%Y-%m-%d","%H:%M:%S","%H:%M","1"
"base.lang_lb","Luxembourgish","lb_LU","lb","Left-to-Right","[3,0]",","," ","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_mk","Macedonian / македонски јазик","mk_MK","mk","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_ml","Malayalam / മലയാളം","ml_IN","ml","Left-to-Right","[3,0]",","," ","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_mn","Mongolian / монгол","mn_MN","mn","Left-to-Right","[3,0]",".","'","%Y-%m-%d","%H:%M:%S","%H:%M","7"
"base.lang_ms","Malay / Bahasa Melayu","ms_MY","ms","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","1"
base.lang_my,"Burmese / ဗမာစာ",my_MM,my,"Left-to-Right","[3,3]",".",",","%Y %b %d %A","%I:%M:%S %p","%I:%M %p","7"
"base.lang_nb_NO","Norwegian Bokmål / Norsk bokmål","nb_NO","nb_NO","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_fa_IR","Persian / فارسی","fa_IR","fa","Right-to-Left","[3,0]",".",",","%Y/%m/%d","%H:%M:%S","%H:%M","6"
"base.lang_pl","Polish / Język polski","pl_PL","pl","Left-to-Right","[]",",",,"%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_pt_AO","Portuguese (AO) / Português (AO)","pt_AO","pt_AO","Left-to-Right","[]",",",,"%d-%m-%Y","%H:%M:%S","%H:%M","1"
"base.lang_pt_BR","Portuguese (BR) / Português (BR)","pt_BR","pt_BR","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_pt","Portuguese / Português","pt_PT","pt","Left-to-Right","[]",",",,"%d-%m-%Y","%H:%M:%S","%H:%M","1"
"base.lang_ro","Romanian / română","ro_RO","ro","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_ru","Russian / русский язык","ru_RU","ru","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_sr@Cyrl","Serbian (Cyrillic) / српски","sr@Cyrl","sr@Cyrl","Left-to-Right","[]",",",,"%d.%m.%Y.","%H:%M:%S","%H:%M","7"
"base.lang_sr@latin","Serbian (Latin) / srpski","sr@latin","sr@latin","Left-to-Right","[]",".",",","%m/%d/%Y","%I:%M:%S %p","%I:%M %p","7"
"base.lang_sk","Slovak / Slovenský jazyk","sk_SK","sk","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_sl_SI","Slovenian / slovenščina","sl_SI","sl","Left-to-Right","[]",","," ","%d. %m. %Y","%H:%M:%S","%H:%M","1"
"base.lang_es_419","Spanish (Latin America) / Español (América Latina)","es_419","es_419","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_es_AR","Spanish (AR) / Español (AR)","es_AR","es_AR","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_BO","Spanish (BO) / Español (BO)","es_BO","es_BO","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_es_CL","Spanish (CL) / Español (CL)","es_CL","es_CL","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_es_CO","Spanish (CO) / Español (CO)","es_CO","es_CO","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_CR","Spanish (CR) / Español (CR)","es_CR","es_CR","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_es_DO","Spanish (DO) / Español (DO)","es_DO","es_DO","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%I:%M:%S %p","%I:%M %p","1"
"base.lang_es_EC","Spanish (EC) / Español (EC)","es_EC","es_EC","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_es_GT","Spanish (GT) / Español (GT)","es_GT","es_GT","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_MX","Spanish (MX) / Español (MX)","es_MX","es_MX","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_PA","Spanish (PA) / Español (PA)","es_PA","es_PA","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_PE","Spanish (PE) / Español (PE)","es_PE","es_PE","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_PY","Spanish (PY) / Español (PY)","es_PY","es_PY","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es_UY","Spanish (UY) / Español (UY)","es_UY","es_UY","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_es_VE","Spanish (VE) / Español (VE)","es_VE","es_VE","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_es","Spanish / Español","es_ES","es","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_sw","Swahili / Kiswahili","sw","sw","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_sv_SE","Swedish / Svenska","sv_SE","sv","Left-to-Right","[3,0]",","," ","%Y-%m-%d","%H:%M:%S","%H:%M","1"
"base.lang_th","Thai / ภาษาไทย","th_TH","th","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","%H:%M","7"
"base.lang_tl","Tagalog / Filipino","tl_PH","tl","Left-to-Right","[3,0]",".",",","%m/%d/%y","%H:%M:%S","%H:%M","1"
"base.lang_tr","Turkish / Türkçe","tr_TR","tr","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","%H:%M","1"
"base.lang_uk_UA","Ukrainian / українська","uk_UA","uk","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","%H:%M","1"
"base.lang_vi_VN","Vietnamese / Tiếng Việt","vi_VN","vi","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","%H:%M","1"
"base.lang_sq_AL","Albanian / Shqip","sq_AL","sq","Left-to-Right","[3,0]",",",".","%Y-%b-%d","%I.%M.%S.","%I.%M.","1"
"base.lang_te_IN","Telugu / తెలుగు","te_IN","te","Left-to-Right","[]",".",",","%B %d %A %Y","%p%I.%M.%S","%p%I.%M","7"
1 id name code iso_code direction grouping decimal_point thousands_sep date_format time_format short_time_format week_start
2 base.lang_en English (US) en_US en Left-to-Right [3,0] . , %m/%d/%Y %H:%M:%S %H:%M 7
3 base.lang_am_ET Amharic / አምሃርኛ am_ET am_ET Left-to-Right [3,0] . , %d/%m/%Y %I:%M:%S %I:%M 7
4 base.lang_ar Arabic / الْعَرَبيّة ar_001 ar Right-to-Left [3,0] . , %d %b, %Y %I:%M:%S %p %I:%M 6
5 base.lang_ar_SY Arabic (Syria) / الْعَرَبيّة ar_SY ar_SY Right-to-Left [3,0] . , %d %b, %Y %I:%M:%S %p %I:%M 6
6 base.lang_az Azerbaijani / Azərbaycanca az_AZ az Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
7 base.lang_eu_ES Basque / Euskara eu_ES eu_ES Left-to-Right [] , %a, %Y.eko %bren %da %H:%M:%S %H:%M 1
8 base.lang_be Belarusian / Беларуская мова be_BY be Left-to-Right [3,0] , %d.%m.%Y %H:%M:%S %H:%M 1
9 base.lang_bn_IN Bengali / বাংলা bn_IN bn_IN Left-to-Right [] , %A %d %b %Y %I:%M:%S %I:%M 1
10 base.lang_bs_BA Bosnian / bosanski jezik bs_BA bs Left-to-Right [3,0] , . %d.%m.%Y %H:%M:%S %H:%M 1
11 base.lang_bg Bulgarian / български език bg_BG bg Left-to-Right [3,0] , %d.%m.%Y %H,%M,%S %H,%M 1
12 base.lang_ca_ES Catalan / Català ca_ES ca_ES Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
13 base.lang_zh_CN Chinese (Simplified) / 简体中文 zh_CN zh_CN Left-to-Right [3,0] . , %Y年%m月%d日 %H时%M分%S秒 %H时%M分 7
14 base.lang_zh_HK Chinese (HK) zh_HK zh_HK Left-to-Right [3,0] . , %Y年%m月%d日 %A %I時%M分%S秒 %I時%M分 7
15 base.lang_zh_TW Chinese (Traditional) / 繁體中文 zh_TW zh_TW Left-to-Right [3,0] . , %Y年%m月%d日 %H時%M分%S秒 %H時%M分 7
16 base.lang_hr Croatian / hrvatski jezik hr_HR hr Left-to-Right [3,0] , . %d.%m.%Y %H:%M:%S %H:%M 1
17 base.lang_cs_CZ Czech / Čeština cs_CZ cs_CZ Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
18 base.lang_da_DK Danish / Dansk da_DK da_DK Left-to-Right [3,0] , . %d-%m-%Y %H:%M:%S %H:%M 1
19 base.lang_nl_BE Dutch (BE) / Nederlands (BE) nl_BE nl_BE Left-to-Right [3,0] , . %d-%m-%Y %H:%M:%S %H:%M 1
20 base.lang_nl Dutch / Nederlands nl_NL nl Left-to-Right [3,0] , . %d-%m-%Y %H:%M:%S %H:%M 1
21 base.lang_en_AU English (AU) en_AU en_AU Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
22 base.lang_en_CA English (CA) en_CA en_CA Left-to-Right [3,0] . , %Y-%m-%d %H:%M:%S %H:%M 7
23 base.lang_en_GB English (UK) en_GB en_GB Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 1
24 base.lang_en_IN English (IN) en_IN en_IN Left-to-Right [3,2,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
25 base.lang_en_NZ English (NZ) en_NZ en_NZ Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
26 base.lang_et_EE Estonian / Eesti keel et_EE et Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
27 base.lang_fi Finnish / Suomi fi_FI fi Left-to-Right [3,0] ,   %d.%m.%Y %H.%M.%S %H.%M 1
28 base.lang_fr_BE French (BE) / Français (BE) fr_BE fr_BE Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
29 base.lang_fr_CA French (CA) / Français (CA) fr_CA fr_CA Left-to-Right [3,0] ,   %Y-%m-%d %H:%M:%S %H:%M 7
30 base.lang_fr_CH French (CH) / Français (CH) fr_CH fr_CH Left-to-Right [3,0] . ' %d.%m.%Y %H:%M:%S %H:%M 1
31 base.lang_fr French / Français fr_FR fr Left-to-Right [3,0] ,   %d/%m/%Y %H:%M:%S %H:%M 1
32 base.lang_gl_ES Galician / Galego gl_ES gl Left-to-Right [] , %d/%m/%Y %H:%M:%S %H:%M 1
33 base.lang_ka_GE Georgian / ქართული ენა ka_GE ka Left-to-Right [3,0] , . %m/%d/%Y %H:%M:%S %H:%M 1
34 base.lang_de German / Deutsch de_DE de Left-to-Right [3,0] , . %d.%m.%Y %H:%M:%S %H:%M 1
35 base.lang_de_CH German (CH) / Deutsch (CH) de_CH de_CH Left-to-Right [3,0] . ' %d.%m.%Y %H:%M:%S %H:%M 1
36 base.lang_el_GR Greek / Ελληνικά el_GR el_GR Left-to-Right [] , . %d/%m/%Y %I:%M:%S %p %I:%M %p 1
37 base.lang_gu_IN Gujarati / ગુજરાતી gu_IN gu Left-to-Right [] . , %A %d %b %Y %I:%M:%S %I:%M 7
38 base.lang_he_IL Hebrew / עברית he_IL he Right-to-Left [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
39 base.lang_hi_IN Hindi / हिंदी hi_IN hi Left-to-Right [] . , %A %d %b %Y %I:%M:%S %I:%M 7
40 base.lang_hu Hungarian / Magyar hu_HU hu Left-to-Right [3,0] , . %Y-%m-%d %H:%M:%S %H:%M 1
41 base.lang_id Indonesian / Bahasa Indonesia id_ID id Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 7
42 base.lang_it Italian / Italiano it_IT it Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
43 base.lang_ja_JP Japanese / 日本語 ja_JP ja Left-to-Right [3,0] . , %Y年%m月%d日 %H時%M分%S秒 %H時%M分 7
44 base.lang_kab_DZ Kabyle / Taqbaylit kab_DZ kab Left-to-Right [] . , %m/%d/%Y %I:%M:%S %p %I:%M %p 6
45 base.lang_km Khmer / ភាសាខ្មែរ km_KH km Left-to-Right [3,0] . , %d %B %Y %H:%M:%S %H:%M 7
46 base.lang_ko_KP Korean (KP) / 한국어 (KP) ko_KP ko_KP Left-to-Right [3,0] . , %m/%d/%Y %I:%M:%S %p %I:%M %p 1
47 base.lang_ko_KR Korean (KR) / 한국어 (KR) ko_KR ko_KR Left-to-Right [3,0] . , %Y년 %m월 %d일 %H시 %M분 %S초 %H시 %M분 7
48 base.lang_lo_LA Lao / ພາສາລາວ lo_LA lo Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
49 base.lang_lv Latvian / latviešu valoda lv_LV lv Left-to-Right [3,0] ,   %Y.%m.%d. %H:%M:%S %H:%M 1
50 base.lang_lt Lithuanian / Lietuvių kalba lt_LT lt Left-to-Right [3,0] , . %Y-%m-%d %H:%M:%S %H:%M 1
51 base.lang_lb Luxembourgish lb_LU lb Left-to-Right [3,0] ,   %d/%m/%Y %H:%M:%S %H:%M 1
52 base.lang_mk Macedonian / македонски јазик mk_MK mk Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
53 base.lang_ml Malayalam / മലയാളം ml_IN ml Left-to-Right [3,0] ,   %d/%m/%Y %H:%M:%S %H:%M 1
54 base.lang_mn Mongolian / монгол mn_MN mn Left-to-Right [3,0] . ' %Y-%m-%d %H:%M:%S %H:%M 7
55 base.lang_ms Malay / Bahasa Melayu ms_MY ms Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 1
56 base.lang_my Burmese / ဗမာစာ my_MM my Left-to-Right [3,3] . , %Y %b %d %A %I:%M:%S %p %I:%M %p 7
57 base.lang_nb_NO Norwegian Bokmål / Norsk bokmål nb_NO nb_NO Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
58 base.lang_fa_IR Persian / فارسی fa_IR fa Right-to-Left [3,0] . , %Y/%m/%d %H:%M:%S %H:%M 6
59 base.lang_pl Polish / Język polski pl_PL pl Left-to-Right [] , %d.%m.%Y %H:%M:%S %H:%M 1
60 base.lang_pt_AO Portuguese (AO) / Português (AO) pt_AO pt_AO Left-to-Right [] , %d-%m-%Y %H:%M:%S %H:%M 1
61 base.lang_pt_BR Portuguese (BR) / Português (BR) pt_BR pt_BR Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 7
62 base.lang_pt Portuguese / Português pt_PT pt Left-to-Right [] , %d-%m-%Y %H:%M:%S %H:%M 1
63 base.lang_ro Romanian / română ro_RO ro Left-to-Right [3,0] , . %d.%m.%Y %H:%M:%S %H:%M 1
64 base.lang_ru Russian / русский язык ru_RU ru Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
65 base.lang_sr@Cyrl Serbian (Cyrillic) / српски sr@Cyrl sr@Cyrl Left-to-Right [] , %d.%m.%Y. %H:%M:%S %H:%M 7
66 base.lang_sr@latin Serbian (Latin) / srpski sr@latin sr@latin Left-to-Right [] . , %m/%d/%Y %I:%M:%S %p %I:%M %p 7
67 base.lang_sk Slovak / Slovenský jazyk sk_SK sk Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
68 base.lang_sl_SI Slovenian / slovenščina sl_SI sl Left-to-Right [] ,   %d. %m. %Y %H:%M:%S %H:%M 1
69 base.lang_es_419 Spanish (Latin America) / Español (América Latina) es_419 es_419 Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
70 base.lang_es_AR Spanish (AR) / Español (AR) es_AR es_AR Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 7
71 base.lang_es_BO Spanish (BO) / Español (BO) es_BO es_BO Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
72 base.lang_es_CL Spanish (CL) / Español (CL) es_CL es_CL Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
73 base.lang_es_CO Spanish (CO) / Español (CO) es_CO es_CO Left-to-Right [3,0] , . %d-%m-%Y %H:%M:%S %H:%M 7
74 base.lang_es_CR Spanish (CR) / Español (CR) es_CR es_CR Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 1
75 base.lang_es_DO Spanish (DO) / Español (DO) es_DO es_DO Left-to-Right [3,0] . , %d/%m/%Y %I:%M:%S %p %I:%M %p 1
76 base.lang_es_EC Spanish (EC) / Español (EC) es_EC es_EC Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
77 base.lang_es_GT Spanish (GT) / Español (GT) es_GT es_GT Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
78 base.lang_es_MX Spanish (MX) / Español (MX) es_MX es_MX Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
79 base.lang_es_PA Spanish (PA) / Español (PA) es_PA es_PA Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
80 base.lang_es_PE Spanish (PE) / Español (PE) es_PE es_PE Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
81 base.lang_es_PY Spanish (PY) / Español (PY) es_PY es_PY Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 7
82 base.lang_es_UY Spanish (UY) / Español (UY) es_UY es_UY Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
83 base.lang_es_VE Spanish (VE) / Español (VE) es_VE es_VE Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 7
84 base.lang_es Spanish / Español es_ES es Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
85 base.lang_sw Swahili / Kiswahili sw sw Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 1
86 base.lang_sv_SE Swedish / Svenska sv_SE sv Left-to-Right [3,0] ,   %Y-%m-%d %H:%M:%S %H:%M 1
87 base.lang_th Thai / ภาษาไทย th_TH th Left-to-Right [3,0] . , %d/%m/%Y %H:%M:%S %H:%M 7
88 base.lang_tl Tagalog / Filipino tl_PH tl Left-to-Right [3,0] . , %m/%d/%y %H:%M:%S %H:%M 1
89 base.lang_tr Turkish / Türkçe tr_TR tr Left-to-Right [3,0] , . %d-%m-%Y %H:%M:%S %H:%M 1
90 base.lang_uk_UA Ukrainian / українська uk_UA uk Left-to-Right [3,0] ,   %d.%m.%Y %H:%M:%S %H:%M 1
91 base.lang_vi_VN Vietnamese / Tiếng Việt vi_VN vi Left-to-Right [3,0] , . %d/%m/%Y %H:%M:%S %H:%M 1
92 base.lang_sq_AL Albanian / Shqip sq_AL sq Left-to-Right [3,0] , . %Y-%b-%d %I.%M.%S. %I.%M. 1
93 base.lang_te_IN Telugu / తెలుగు te_IN te Left-to-Right [] . , %B %d %A %Y %p%I.%M.%S %p%I.%M 7
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="res_bank_1" model="res.bank">
<field name="name">Reserve</field>
<field name="active" eval="False"/>
</record>
</data>
</odoo>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record model="res.bank" id="bank_ing">
<field name="name">ING</field>
<field name="bic">BBRUBEBB</field>
</record>
<record model="res.bank" id="bank_bnp">
<field name="name">BNP Paribas</field>
<field name="bic">GEBABEBB</field>
</record>
</data>
</odoo>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="main_company" model="res.company">
<field name="name">My Company</field>
<field name="partner_id" ref="main_partner"/>
<field name="currency_id" ref="base.USD"/>
</record>
</data>
</odoo>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!--
In demo only, enable the USD currency.
The rationale is that, without demo, you shouldn't enable any currency by default,
so you do not land in a multi-currency database by default.
e.g. if USD was enabled by default even without demo, and you install the accounting for Belgium,
installing the Belgian Chart Of Account, it would enable the EUR currency,
therefore leaving you with the USD and EUR currency enabled,
and therefore in a multi-currency environment.
But, with demo, you need to enable the currency used by the company by default,
so the monetary fields display the currency symbol even when invoicing (account) is not installed.
e.g. install a demo database with just CRM, you want the $ to appear next to the expected revenue field.
-->
<record id="USD" model="res.currency">
<field name="active" eval="True"/>
</record>
</data>
</odoo>
@@ -0,0 +1,976 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record forcecreate="0" id="rateUSD" model="res.currency.rate">
<field name="rate">1.0</field>
<field name="currency_id" ref="USD"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateVEF" model="res.currency.rate">
<field name="rate">5.864</field>
<field name="currency_id" ref="VEF"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCAD" model="res.currency.rate">
<field name="rate">1.3388</field>
<field name="currency_id" ref="CAD"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCHF" model="res.currency.rate">
<field name="rate">1.3086</field>
<field name="currency_id" ref="CHF"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateBRL" model="res.currency.rate">
<field name="rate">2.2344</field>
<field name="currency_id" ref="BRL"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCNY" model="res.currency.rate">
<field name="rate">8.7556</field>
<field name="currency_id" ref="CNY"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCOP" model="res.currency.rate">
<field name="rate">2933.8378</field>
<field name="currency_id" ref="COP"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCZK" model="res.currency.rate">
<field name="rate">26.5634</field>
<field name="currency_id" ref="CZK"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateDKK" model="res.currency.rate">
<field name="rate">7.4445</field>
<field name="currency_id" ref="DKK"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateHUF" model="res.currency.rate">
<field name="rate">271.5621</field>
<field name="currency_id" ref="HUF"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateIDR1" model="res.currency.rate">
<field name="rate">14352.00</field>
<field name="currency_id" ref="IDR"/>
<field name="name">2009-01-01</field>
</record>
<record forcecreate="0" id="rateIDR" model="res.currency.rate">
<field name="rate">11796.39</field>
<field name="currency_id" ref="IDR"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateLVL" model="res.currency.rate">
<field name="rate">0.7086</field>
<field name="currency_id" ref="LVL"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateNOK" model="res.currency.rate">
<field name="rate">7.8668</field>
<field name="currency_id" ref="NOK"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateXPF" model="res.currency.rate">
<field name="rate">119.331742</field>
<field name="currency_id" ref="XPF"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="ratePAB" model="res.currency.rate">
<field name="rate">1.2676</field>
<field name="currency_id" ref="PAB"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="ratePLN" model="res.currency.rate">
<field name="rate">4.1005</field>
<field name="currency_id" ref="PLN"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateSEK" model="res.currency.rate">
<field name="rate">10.3004</field>
<field name="currency_id" ref="SEK"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateARS" model="res.currency.rate">
<field name="rate">5.0881</field>
<field name="currency_id" ref="ARS"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateINR" model="res.currency.rate">
<field name="rate">59.9739</field>
<field name="currency_id" ref="INR"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateAUD" model="res.currency.rate">
<field name="rate">1.4070</field>
<field name="currency_id" ref="AUD"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateUAH" model="res.currency.rate">
<field name="rate">10.1969</field>
<field name="currency_id" ref="UAH"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateVND" model="res.currency.rate">
<field name="rate">26330.01</field>
<field name="currency_id" ref="VND"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateHKD" model="res.currency.rate">
<field name="rate">11.1608</field>
<field name="currency_id" ref="HKD"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateJPY" model="res.currency.rate">
<field name="rate">133.62</field>
<field name="currency_id" ref="JPY"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateBGN" model="res.currency.rate">
<field name="rate">1.9558</field>
<field name="currency_id" ref="BGN"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateLTL" model="res.currency.rate">
<field name="rate">3.4528</field>
<field name="currency_id" ref="LTL"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateRON" model="res.currency.rate">
<field name="rate">4.2253</field>
<field name="currency_id" ref="RON"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateHRK" model="res.currency.rate">
<field name="rate">7.2936</field>
<field name="currency_id" ref="HRK"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateRUB" model="res.currency.rate">
<field name="rate">43.16</field>
<field name="currency_id" ref="RUB"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateTRY" model="res.currency.rate">
<field name="rate">2.1411</field>
<field name="currency_id" ref="TRY"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateKRW" model="res.currency.rate">
<field name="rate">1662.37</field>
<field name="currency_id" ref="KRW"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateMXN" model="res.currency.rate">
<field name="rate">18.6664</field>
<field name="currency_id" ref="MXN"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateMYR" model="res.currency.rate">
<field name="rate">4.8887</field>
<field name="currency_id" ref="MYR"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateNZD" model="res.currency.rate">
<field name="rate">1.9764</field>
<field name="currency_id" ref="NZD"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="ratePHP" model="res.currency.rate">
<field name="rate">66.1</field>
<field name="currency_id" ref="PHP"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateSGD" model="res.currency.rate">
<field name="rate">2.0126</field>
<field name="currency_id" ref="SGD"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateZAR" model="res.currency.rate">
<field name="rate">10.5618</field>
<field name="currency_id" ref="ZAR"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCRC" model="res.currency.rate">
<field name="rate">691.3153</field>
<field name="currency_id" ref="CRC"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateMUR" model="res.currency.rate">
<field name="rate">40.28</field>
<field name="currency_id" ref="MUR"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateXOF" model="res.currency.rate">
<field name="rate">655.957</field>
<field name="currency_id" ref="XOF"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateXAF" model="res.currency.rate">
<field name="rate">655.957</field>
<field name="currency_id" ref="XAF"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateUGX" model="res.currency.rate">
<field name="rate">3401.91388</field>
<field name="currency_id" ref="UGX"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateHNL" model="res.currency.rate">
<field name="rate">25</field>
<field name="currency_id" ref="HNL"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateCLP" model="res.currency.rate">
<field name="rate">710</field>
<field name="currency_id" ref="CLP"/>
<field name="name">2010-01-01</field>
</record>
<record forcecreate="0" id="rateUYU" model="res.currency.rate">
<field name="currency_id" ref="UYU" />
<field name="name">2010-01-01</field>
<field name="rate">28.36</field>
</record>
<record forcecreate="0" id="rateUYI" model="res.currency.rate">
<field name="currency_id" ref="UYI"/>
<field name="name">2023-09-13</field>
<field name="rate">5.7778</field>
</record>
<record forcecreate="0" id="rateAFN" model="res.currency.rate">
<field name="currency_id" ref="AFN" />
<field name="name">2010-01-01</field>
<field name="rate">59.33</field>
</record>
<record forcecreate="0" id="rateAOA" model="res.currency.rate">
<field name="currency_id" ref="AOA" />
<field name="name">2010-01-01</field>
<field name="rate">117.080</field>
</record>
<record forcecreate="0" id="rateXCD" model="res.currency.rate">
<field name="currency_id" ref="XCD" />
<field name="name">2010-01-01</field>
<field name="rate">3.32</field>
</record>
<record forcecreate="0" id="rateAMD" model="res.currency.rate">
<field name="currency_id" ref="AMD" />
<field name="name">2010-01-01</field>
<field name="rate">506.02</field>
</record>
<record forcecreate="0" id="rateAWG" model="res.currency.rate">
<field name="currency_id" ref="AWG" />
<field name="name">2010-01-01</field>
<field name="rate">0.45</field>
</record>
<record forcecreate="0" id="rateAZN" model="res.currency.rate">
<field name="currency_id" ref="AZN" />
<field name="name">2010-01-01</field>
<field name="rate">0.96</field>
</record>
<record forcecreate="0" id="rateBSD" model="res.currency.rate">
<field name="currency_id" ref="BSD" />
<field name="name">2010-01-01</field>
<field name="rate">1.23</field>
</record>
<record forcecreate="0" id="rateBHD" model="res.currency.rate">
<field name="currency_id" ref="BHD" />
<field name="name">2010-01-01</field>
<field name="rate">0.46</field>
</record>
<record forcecreate="0" id="rateBDT" model="res.currency.rate">
<field name="currency_id" ref="BDT" />
<field name="name">2010-01-01</field>
<field name="rate">100.59</field>
</record>
<record forcecreate="0" id="rateBBD" model="res.currency.rate">
<field name="currency_id" ref="BBD" />
<field name="name">2010-01-01</field>
<field name="rate">2.46</field>
</record>
<record forcecreate="0" id="rateBYR" model="res.currency.rate">
<field name="currency_id" ref="BYR" />
<field name="name">2010-01-01</field>
<field name="rate">10228.19</field>
</record>
<record forcecreate="0" id="rateBYN" model="res.currency.rate">
<field name="currency_id" ref="BYN" />
<field name="name">2016-07-01</field>
<field name="rate">2.23151</field>
</record>
<record forcecreate="0" id="rateBZD" model="res.currency.rate">
<field name="currency_id" ref="BZD" />
<field name="name">2010-01-01</field>
<field name="rate">2.33</field>
</record>
<record forcecreate="0" id="rateBMD" model="res.currency.rate">
<field name="currency_id" ref="BMD" />
<field name="name">2010-01-01</field>
<field name="rate">1.23</field>
</record>
<record forcecreate="0" id="rateBTN" model="res.currency.rate">
<field name="currency_id" ref="BTN" />
<field name="name">2010-01-01</field>
<field name="rate"> 67.81</field>
</record>
<record forcecreate="0" id="rateBOB" model="res.currency.rate">
<field name="currency_id" ref="BOB" />
<field name="name">2010-01-01</field>
<field name="rate">8.50</field>
</record>
<record forcecreate="0" id="rateBAM" model="res.currency.rate">
<field name="currency_id" ref="BAM" />
<field name="name">2010-01-01</field>
<field name="rate">1.96</field>
</record>
<record forcecreate="0" id="rateBWP" model="res.currency.rate">
<field name="currency_id" ref="BWP" />
<field name="name">2010-01-01</field>
<field name="rate">9.45</field>
</record>
<record forcecreate="0" id="rateBIF" model="res.currency.rate">
<field name="currency_id" ref="BIF" />
<field name="name">2010-01-01</field>
<field name="rate">1736.73</field>
</record>
<record forcecreate="0" id="rateKHR" model="res.currency.rate">
<field name="currency_id" ref="KHR" />
<field name="name">2010-01-01</field>
<field name="rate">5054.53</field>
</record>
<record forcecreate="0" id="rateKYD" model="res.currency.rate">
<field name="currency_id" ref="KYD" />
<field name="name">2010-01-01</field>
<field name="rate">1.007</field>
</record>
<record forcecreate="0" id="rateKMF" model="res.currency.rate">
<field name="currency_id" ref="KMF" />
<field name="name">2010-01-01</field>
<field name="rate">492.23</field>
</record>
<record forcecreate="0" id="rateCDF" model="res.currency.rate">
<field name="currency_id" ref="CDF" />
<field name="name">2010-01-01</field>
<field name="rate">1112.80</field>
</record>
<record forcecreate="0" id="rateCUP" model="res.currency.rate">
<field name="currency_id" ref="CUP" />
<field name="name">2010-01-01</field>
<field name="rate">1.226</field>
</record>
<record forcecreate="0" id="rateANG" model="res.currency.rate">
<field name="currency_id" ref="ANG" />
<field name="name">2010-01-01</field>
<field name="rate">2.11</field>
</record>
<record forcecreate="0" id="rateDJF" model="res.currency.rate">
<field name="currency_id" ref="DJF" />
<field name="name">2010-01-01</field>
<field name="rate">222.22</field>
</record>
<record forcecreate="0" id="rateDOP" model="res.currency.rate">
<field name="currency_id" ref="DOP" />
<field name="name">2010-01-01</field>
<field name="rate">48.09</field>
</record>
<record forcecreate="0" id="rateEGP" model="res.currency.rate">
<field name="currency_id" ref="EGP" />
<field name="name">2010-01-01</field>
<field name="rate">7.46</field>
</record>
<record forcecreate="0" id="rateSVC" model="res.currency.rate">
<field name="currency_id" ref="SVC" />
<field name="name">2010-01-01</field>
<field name="rate">10.74</field>
</record>
<record forcecreate="0" id="rateERN" model="res.currency.rate">
<field name="currency_id" ref="ERN" />
<field name="name">2010-01-01</field>
<field name="rate">18.89</field>
</record>
<record forcecreate="0" id="rateEEB" model="res.currency.rate">
<field name="currency_id" ref="ETB" />
<field name="name">2010-01-01</field>
<field name="rate">21.94</field>
</record>
<record forcecreate="0" id="rateFKP" model="res.currency.rate">
<field name="currency_id" ref="FKP" />
<field name="name">2010-01-01</field>
<field name="rate">0.78</field>
</record>
<record forcecreate="0" id="rateFJD" model="res.currency.rate">
<field name="currency_id" ref="FJD" />
<field name="name">2010-01-01</field>
<field name="rate">2.22</field>
</record>
<record forcecreate="0" id="rateGEL" model="res.currency.rate">
<field name="currency_id" ref="GEL" />
<field name="name">2010-01-01</field>
<field name="rate">2.018</field>
</record>
<record forcecreate="0" id="rateGIP" model="res.currency.rate">
<field name="currency_id" ref="GIP" />
<field name="name">2010-01-01</field>
<field name="rate">0.786</field>
</record>
<record forcecreate="0" id="rateGNF" model="res.currency.rate">
<field name="currency_id" ref="GNF" />
<field name="name">2010-01-01</field>
<field name="rate">8835.85</field>
</record>
<record forcecreate="0" id="rateGYD" model="res.currency.rate">
<field name="currency_id" ref="GYD" />
<field name="name">2010-01-01</field>
<field name="rate">247.31</field>
</record>
<record forcecreate="0" id="rateHTG" model="res.currency.rate">
<field name="currency_id" ref="HTG" />
<field name="name">2010-01-01</field>
<field name="rate">51.69</field>
</record>
<record forcecreate="0" id="rateISK" model="res.currency.rate">
<field name="currency_id" ref="ISK" />
<field name="name">2010-01-01</field>
<field name="rate">158.70</field>
</record>
<record forcecreate="0" id="rateIRR" model="res.currency.rate">
<field name="currency_id" ref="IRR" />
<field name="name">2010-01-01</field>
<field name="rate">15059.97</field>
</record>
<record forcecreate="0" id="rateIQD" model="res.currency.rate">
<field name="currency_id" ref="IQD" />
<field name="name">2010-01-01</field>
<field name="rate">1432.27</field>
</record>
<record forcecreate="0" id="rateILS" model="res.currency.rate">
<field name="currency_id" ref="ILS" />
<field name="name">2010-01-01</field>
<field name="rate">4.89</field>
</record>
<record forcecreate="0" id="rateJMD" model="res.currency.rate">
<field name="currency_id" ref="JMD" />
<field name="name">2010-01-01</field>
<field name="rate">108.94 </field>
</record>
<record forcecreate="0" id="rateJOD" model="res.currency.rate">
<field name="currency_id" ref="JOD" />
<field name="name">2010-01-01</field>
<field name="rate">0.87</field>
</record>
<record forcecreate="0" id="rateKZT" model="res.currency.rate">
<field name="currency_id" ref="KZT" />
<field name="name">2010-01-01</field>
<field name="rate">184.09</field>
</record>
<record forcecreate="0" id="rateKES" model="res.currency.rate">
<field name="currency_id" ref="KES" />
<field name="name">2010-01-01</field>
<field name="rate">103.43</field>
</record>
<record forcecreate="0" id="rateKWD" model="res.currency.rate">
<field name="currency_id" ref="KWD" />
<field name="name">2010-01-01</field>
<field name="rate">0.35</field>
</record>
<record forcecreate="0" id="rateKGS" model="res.currency.rate">
<field name="currency_id" ref="KGS" />
<field name="name">2010-01-01</field>
<field name="rate">57.93</field>
</record>
<record forcecreate="0" id="rateLAK" model="res.currency.rate">
<field name="currency_id" ref="LAK" />
<field name="name">2010-01-01</field>
<field name="rate">9847.72</field>
</record>
<record forcecreate="0" id="rateLBP" model="res.currency.rate">
<field name="currency_id" ref="LBP" />
<field name="name">2010-01-01</field>
<field name="rate">1853.94</field>
</record>
<record forcecreate="0" id="rateLSL" model="res.currency.rate">
<field name="currency_id" ref="LSL" />
<field name="name">2010-01-01</field>
<field name="rate">10.06</field>
</record>
<record forcecreate="0" id="rateLRD" model="res.currency.rate">
<field name="currency_id" ref="LRD" />
<field name="name">2010-01-01</field>
<field name="rate">90.28</field>
</record>
<record forcecreate="0" id="rateLYD" model="res.currency.rate">
<field name="currency_id" ref="LYD" />
<field name="name">2010-01-01</field>
<field name="rate">1.54</field>
</record>
<record forcecreate="0" id="rateMOP" model="res.currency.rate">
<field name="currency_id" ref="MOP" />
<field name="name">2010-01-01</field>
<field name="rate">9.81</field>
</record>
<record forcecreate="0" id="rateMKD" model="res.currency.rate">
<field name="currency_id" ref="MKD" />
<field name="name">2010-01-01</field>
<field name="rate">60.29</field>
</record>
<record forcecreate="0" id="rateMGA" model="res.currency.rate">
<field name="currency_id" ref="MGA" />
<field name="name">2010-01-01</field>
<field name="rate">2775.86</field>
</record>
<record forcecreate="0" id="rateMWK" model="res.currency.rate">
<field name="currency_id" ref="MWK" />
<field name="name">2010-01-01</field>
<field name="rate">329.79</field>
</record>
<record forcecreate="0" id="rateMVR" model="res.currency.rate">
<field name="currency_id" ref="MVR" />
<field name="name">2010-01-01</field>
<field name="rate">18.89</field>
</record>
<record forcecreate="0" id="rateMRO" model="res.currency.rate">
<field name="currency_id" ref="MRO" />
<field name="name">2010-01-01</field>
<field name="rate">362.23</field>
</record>
<record forcecreate="0" id="rateMDL" model="res.currency.rate">
<field name="currency_id" ref="MDL" />
<field name="name">2010-01-01</field>
<field name="rate">15.27</field>
</record>
<record forcecreate="0" id="rateMNT" model="res.currency.rate">
<field name="currency_id" ref="MNT" />
<field name="name">2010-01-01</field>
<field name="rate">1643.57</field>
</record>
<record forcecreate="0" id="rateMAD" model="res.currency.rate">
<field name="currency_id" ref="MAD" />
<field name="name">2010-01-01</field>
<field name="rate">10.9962499</field>
</record>
<record forcecreate="0" id="rateBND" model="res.currency.rate">
<field name="currency_id" ref="BND" />
<field name="name">2010-01-01</field>
<field name="rate">1.54</field>
</record>
<record forcecreate="0" id="rateDZD" model="res.currency.rate">
<field name="currency_id" ref="DZD" />
<field name="name">2010-01-01</field>
<field name="rate">99.65</field>
</record>
<record forcecreate="0" id="rateGHS" model="res.currency.rate">
<field name="currency_id" ref="GHS" />
<field name="name">2010-01-01</field>
<field name="rate">2.39</field>
</record>
<record forcecreate="0" id="rateGMD" model="res.currency.rate">
<field name="currency_id" ref="GMD" />
<field name="name">2010-01-01</field>
<field name="rate">38.89</field>
</record>
<record forcecreate="0" id="rateMZN" model="res.currency.rate">
<field name="currency_id" ref="MZN" />
<field name="name">2010-01-01</field>
<field name="rate">33.65</field>
</record>
<record forcecreate="0" id="rateMMK" model="res.currency.rate">
<field name="currency_id" ref="MMK" />
<field name="name">2010-01-01</field>
<field name="rate">1080.82</field>
</record>
<record forcecreate="0" id="rateNAD" model="res.currency.rate">
<field name="currency_id" ref="NAD" />
<field name="name">2010-01-01</field>
<field name="rate">10.06</field>
</record>
<record forcecreate="0" id="rateNPR" model="res.currency.rate">
<field name="currency_id" ref="NPR" />
<field name="name">2010-01-01</field>
<field name="rate">108.33</field>
</record>
<record forcecreate="0" id="rateALL" model="res.currency.rate">
<field name="currency_id" ref="ALL" />
<field name="name">2010-01-01</field>
<field name="rate">138.00</field>
</record>
<record forcecreate="0" id="rateNIO" model="res.currency.rate">
<field name="currency_id" ref="NIO" />
<field name="name">2010-01-01</field>
<field name="rate">28.97</field>
</record>
<record forcecreate="0" id="rateNGN" model="res.currency.rate">
<field name="currency_id" ref="NGN" />
<field name="name">2010-01-01</field>
<field name="rate">196.77</field>
</record>
<record forcecreate="0" id="rateKPW" model="res.currency.rate">
<field name="currency_id" ref="KPW" />
<field name="name">2010-01-01</field>
<field name="rate">1105.24376765</field>
</record>
<record forcecreate="0" id="rateZIG" model="res.currency.rate">
<field name="currency_id" ref="ZIG" />
<field name="name">2024-04-08</field>
<field name="rate">14.69</field>
</record>
<record forcecreate="0" id="rateZMW" model="res.currency.rate">
<field name="currency_id" ref="ZMW" />
<field name="name">2010-01-01</field>
<field name="rate">11.61</field>
</record>
<record forcecreate="0" id="rateYER" model="res.currency.rate">
<field name="currency_id" ref="YER" />
<field name="name">2010-01-01</field>
<field name="rate">264.784483</field>
</record>
<record forcecreate="0" id="rateEUR" model="res.currency.rate">
<field name="currency_id" ref="EUR" />
<field name="name">2010-01-01</field>
<field name="rate">1.2834</field>
</record>
<record forcecreate="0" id="rateVUV" model="res.currency.rate">
<field name="currency_id" ref="VUV" />
<field name="name">2010-01-01</field>
<field name="rate">114.024315363</field>
</record>
<record forcecreate="0" id="rateUZS" model="res.currency.rate">
<field name="currency_id" ref="UZS" />
<field name="name">2010-01-01</field>
<field name="rate">2331.3093</field>
</record>
<record forcecreate="0" id="rateAED" model="res.currency.rate">
<field name="currency_id" ref="AED" />
<field name="name">2010-01-01</field>
<field name="rate">4.51253195</field>
</record>
<record forcecreate="0" id="rateTMT" model="res.currency.rate">
<field name="currency_id" ref="TMT" />
<field name="name">2010-01-01</field>
<field name="rate">4.31</field>
</record>
<record forcecreate="0" id="rateTND" model="res.currency.rate">
<field name="currency_id" ref="TND" />
<field name="name">2010-01-01</field>
<field name="rate">34.0661408</field>
</record>
<record forcecreate="0" id="rateTTD" model="res.currency.rate">
<field name="currency_id" ref="TTD" />
<field name="name">2010-01-01</field>
<field name="rate">8.61926302</field>
</record>
<record forcecreate="0" id="rateTOP" model="res.currency.rate">
<field name="currency_id" ref="TOP" />
<field name="name">2010-01-01</field>
<field name="rate">31.1217</field>
</record>
<record forcecreate="0" id="rateTHB" model="res.currency.rate">
<field name="currency_id" ref="THB" />
<field name="name">2010-01-01</field>
<field name="rate">38.4070124</field>
</record>
<record forcecreate="0" id="rateTZS" model="res.currency.rate">
<field name="currency_id" ref="TZS" />
<field name="name">2010-01-01</field>
<field name="rate">1947.06815</field>
</record>
<record forcecreate="0" id="rateTJS" model="res.currency.rate">
<field name="currency_id" ref="TJS" />
<field name="name">2010-01-01</field>
<field name="rate">6.15</field>
</record>
<record forcecreate="0" id="rateTWD" model="res.currency.rate">
<field name="currency_id" ref="TWD" />
<field name="name">2010-01-01</field>
<field name="rate">36.8329536</field>
</record>
<record forcecreate="0" id="rateSYP" model="res.currency.rate">
<field name="currency_id" ref="SYP" />
<field name="name">2010-01-01</field>
<field name="rate">78.8338</field>
</record>
<record forcecreate="0" id="rateSZL" model="res.currency.rate">
<field name="currency_id" ref="SZL" />
<field name="name">2010-01-01</field>
<field name="rate">10.07</field>
</record>
<record forcecreate="0" id="rateSRD" model="res.currency.rate">
<field name="currency_id" ref="SRD" />
<field name="name">2010-01-01</field>
<field name="rate">9.17930</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>
<field name="rate">163.552526</field>
</record>
<record forcecreate="0" id="rateSSP" model="res.currency.rate">
<field name="currency_id" ref="SSP" />
<field name="name">2010-01-01</field>
<field name="rate">5.528</field>
</record>
<record forcecreate="0" id="rateGBP" model="res.currency.rate">
<field name="currency_id" ref="GBP" />
<field name="name">2010-01-01</field>
<field name="rate"> 0.784221994</field>
</record>
<record forcecreate="0" id="rateSOS" model="res.currency.rate">
<field name="currency_id" ref="SOS" />
<field name="name">2010-01-01</field>
<field name="rate">1993.71</field>
</record>
<record forcecreate="0" id="rateSBD" model="res.currency.rate">
<field name="currency_id" ref="SBD" />
<field name="name">2010-01-01</field>
<field name="rate">8.6605</field>
</record>
<record forcecreate="0" id="rateSLL" model="res.currency.rate">
<field name="currency_id" ref="SLL" />
<field name="name">2010-01-01</field>
<field name="rate">5320.43478</field>
</record>
<record forcecreate="0" id="rateSLE" model="res.currency.rate">
<field name="currency_id" ref="SLE" />
<field name="name">2023-06-08</field>
<field name="rate">22.5847</field>
</record>
<record forcecreate="0" id="rateSCR" model="res.currency.rate">
<field name="currency_id" ref="SCR" />
<field name="name">2010-01-01</field>
<field name="rate">18.2587287</field>
</record>
<record forcecreate="0" id="rateRSD" model="res.currency.rate">
<field name="currency_id" ref="RSD" />
<field name="name">2010-01-01</field>
<field name="rate">117.381295</field>
</record>
<record forcecreate="0" id="rateSAR" model="res.currency.rate">
<field name="currency_id" ref="SAR" />
<field name="name">2010-01-01</field>
<field name="rate">4.58898972</field>
</record>
<record forcecreate="0" id="rateSTD" model="res.currency.rate">
<field name="currency_id" ref="STD" />
<field name="name">2010-01-01</field>
<field name="rate">24105.86</field>
</record>
<record forcecreate="0" id="rateWST" model="res.currency.rate">
<field name="currency_id" ref="WST" />
<field name="name">2010-01-01</field>
<field name="rate">2.8628</field>
</record>
<record forcecreate="0" id="rateSHP" model="res.currency.rate">
<field name="currency_id" ref="SHP" />
<field name="name">2010-01-01</field>
<field name="rate">0.7856</field>
</record>
<record forcecreate="0" id="rateRWF" model="res.currency.rate">
<field name="currency_id" ref="RWF" />
<field name="name">2010-01-01</field>
<field name="rate">752.57</field>
</record>
<record forcecreate="0" id="rateQAR" model="res.currency.rate">
<field name="currency_id" ref="QAR" />
<field name="name">2010-01-01</field>
<field name="rate">4.45500218</field>
</record>
<record forcecreate="0" id="ratePEN" model="res.currency.rate">
<field name="currency_id" ref="PEN" />
<field name="name">2010-01-01</field>
<field name="rate">3.20731573</field>
</record>
<record forcecreate="0" id="ratePYG" model="res.currency.rate">
<field name="currency_id" ref="PYG" />
<field name="name">2010-01-01</field>
<field name="rate">5343.66812</field>
</record>
<record forcecreate="0" id="ratePGK" model="res.currency.rate">
<field name="currency_id" ref="PGK" />
<field name="name">2010-01-01</field>
<field name="rate">2.5903895</field>
</record>
<record forcecreate="0" id="ratePKR" model="res.currency.rate">
<field name="currency_id" ref="PKR" />
<field name="name">2010-01-01</field>
<field name="rate">115.97432</field>
</record>
<record forcecreate="0" id="rateOMR" model="res.currency.rate">
<field name="currency_id" ref="OMR" />
<field name="name">2010-01-01</field>
<field name="rate">0.472921728</field>
</record>
<record forcecreate="0" id="rateCVE" model="res.currency.rate">
<field name="currency_id" ref="CVE" />
<field name="name">2010-01-01</field>
<field name="rate">0.61</field>
</record>
<record forcecreate="0" id="rateGTQ" model="res.currency.rate">
<field name="rate">11.2020</field>
<field name="currency_id" ref="GTQ"/>
<field name="name">2010-01-01</field>
</record>
</data>
</odoo>
+28
View File
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- es_419 is the new "generic" spanish -->
<record id="base.lang_es" model="res.lang">
<field name="url_code">es_ES</field>
</record>
<record id="base.lang_es_419" model="res.lang">
<field name="url_code">es</field>
</record>
<function name="install_lang" model="res.lang"/>
</data>
<data>
<!-- /my is for the portal -->
<record id="base.lang_my" model="res.lang">
<field name="url_code">mya</field>
</record>
<record id="base.lang_ar" model="res.lang">
<field name="flag_image" type="base64" file="base/static/img/lang_flags/lang_ar.png"/>
</record>
<record id="base.lang_sr@latin" model="res.lang">
<field name="flag_image" type="base64" file="base/static/img/country_flags/rs.png"/>
</record>
<record id="base.lang_ca_ES" model="res.lang">
<field name="flag_image" type="base64" file="base/static/img/lang_flags/lang_ca.png"/>
</record>
</data>
</odoo>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record model="res.partner.bank" id="bank_partner_demo">
<field name="acc_number">60-16-13 31926819</field>
<field name="partner_id" ref="partner_demo"/>
</record>
</data>
</odoo>
+163
View File
@@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="True">
<record id="main_partner" model="res.partner" context="{'default_is_company': True}">
<field name="name">My Company</field>
<field name="company_id" eval="None"/>
<field name="is_company" eval="True"/>
<field name="street"></field>
<field name="city"></field>
<field name="zip"></field>
<field name="phone"></field>
<field name="image_1920" type="base64" file="base/static/img/res_company_logo.png"/>
</record>
<record model="res.partner" id="base.partner_root">
<field name="name">System</field>
<field name="company_id" ref="main_company"/>
<field name="email">odoobot@example.com</field>
<field name="active" eval="False"/>
</record>
<record model="res.partner" id="base.partner_admin">
<field name="name">Administrator</field>
<field name="company_id" ref="main_company"/>
<field name="email">admin@example.com</field>
</record>
<record id="public_partner" model="res.partner">
<field name="name">Public user</field>
<field name="active" eval="False"/>
</record>
<!--
Resource: res.partner.title
-->
<record id="res_partner_title_madam" model="res.partner.title">
<field name="name">Madam</field>
<field name="shortcut">Mrs.</field>
</record>
<record id="res_partner_title_miss" model="res.partner.title">
<field name="name">Miss</field>
<field name="shortcut">Miss</field>
</record>
<record id="res_partner_title_mister" model="res.partner.title">
<field name="name">Mister</field>
<field name="shortcut">Mr.</field>
</record>
<record id="res_partner_title_doctor" model="res.partner.title">
<field name="name">Doctor</field>
<field name="shortcut">Dr.</field>
</record>
<record id="res_partner_title_prof" model="res.partner.title">
<field name="name">Professor</field>
<field name="shortcut">Prof.</field>
</record>
<record id="res_partner_industry_A" model="res.partner.industry">
<field name="name">Agriculture</field>
<field name="full_name">A - AGRICULTURE, FORESTRY AND FISHING</field>
</record>
<record id="res_partner_industry_B" model="res.partner.industry">
<field name="name">Mining</field>
<field name="full_name">B - MINING AND QUARRYING</field>
</record>
<record id="res_partner_industry_C" model="res.partner.industry">
<field name="name">Manufacturing</field>
<field name="full_name">C - MANUFACTURING</field>
</record>
<record id="res_partner_industry_D" model="res.partner.industry">
<field name="name">Energy supply</field>
<field name="full_name">D - ELECTRICITY, GAS, STEAM AND AIR CONDITIONING SUPPLY</field>
</record>
<record id="res_partner_industry_E" model="res.partner.industry">
<field name="name">Water supply</field>
<field name="full_name">E - WATER SUPPLY; SEWERAGE, WASTE MANAGEMENT AND REMEDIATION ACTIVITIES</field>
</record>
<record id="res_partner_industry_F" model="res.partner.industry">
<field name="name">Construction</field>
<field name="full_name">F - CONSTRUCTION</field>
</record>
<record id="res_partner_industry_G" model="res.partner.industry">
<field name="name">Wholesale/Retail</field>
<field name="full_name">G - WHOLESALE AND RETAIL TRADE; REPAIR OF MOTOR VEHICLES AND MOTORCYCLES</field>
</record>
<record id="res_partner_industry_H" model="res.partner.industry">
<field name="name">Transportation/Logistics</field>
<field name="full_name">H - TRANSPORTATION AND STORAGE</field>
</record>
<record id="res_partner_industry_I" model="res.partner.industry">
<field name="name">Food/Hospitality</field>
<field name="full_name">I - ACCOMMODATION AND FOOD SERVICE ACTIVITIES</field>
</record>
<record id="res_partner_industry_J" model="res.partner.industry">
<field name="name">IT/Communication</field>
<field name="full_name">J - INFORMATION AND COMMUNICATION</field>
</record>
<record id="res_partner_industry_K" model="res.partner.industry">
<field name="name">Finance/Insurance</field>
<field name="full_name">K - FINANCIAL AND INSURANCE ACTIVITIES</field>
</record>
<record id="res_partner_industry_L" model="res.partner.industry">
<field name="name">Real Estate</field>
<field name="full_name">L - REAL ESTATE ACTIVITIES</field>
</record>
<record id="res_partner_industry_M" model="res.partner.industry">
<field name="name">Scientific</field>
<field name="full_name">M - PROFESSIONAL, SCIENTIFIC AND TECHNICAL ACTIVITIES</field>
</record>
<record id="res_partner_industry_N" model="res.partner.industry">
<field name="name">Administrative/Utilities</field>
<field name="full_name">N - ADMINISTRATIVE AND SUPPORT SERVICE ACTIVITIES</field>
</record>
<record id="res_partner_industry_O" model="res.partner.industry">
<field name="name">Public Administration</field>
<field name="full_name">O - PUBLIC ADMINISTRATION AND DEFENCE; COMPULSORY SOCIAL SECURITY</field>
</record>
<record id="res_partner_industry_P" model="res.partner.industry">
<field name="name">Education</field>
<field name="full_name">P - EDUCATION</field>
</record>
<record id="res_partner_industry_Q" model="res.partner.industry">
<field name="name">Health/Social</field>
<field name="full_name">Q - HUMAN HEALTH AND SOCIAL WORK ACTIVITIES</field>
</record>
<record id="res_partner_industry_R" model="res.partner.industry">
<field name="name">Entertainment</field>
<field name="full_name">R - ARTS, ENTERTAINMENT AND RECREATION</field>
</record>
<record id="res_partner_industry_S" model="res.partner.industry">
<field name="name">Other Services</field>
<field name="full_name">S - OTHER SERVICE ACTIVITIES</field>
</record>
<record id="res_partner_industry_T" model="res.partner.industry">
<field name="name">Households</field>
<field name="full_name">T - ACTIVITIES OF HOUSEHOLDS AS EMPLOYERS; UNDIFFERENTIATED GOODS- AND SERVICES-PRODUCING ACTIVITIES OF HOUSEHOLDS FOR OWN USE</field>
</record>
<record id="res_partner_industry_U" model="res.partner.industry">
<field name="name">Extraterritorial</field>
<field name="full_name">U - ACTIVITIES OF EXTRATERRITORIAL ORGANISATIONS AND BODIES</field>
</record>
</data>
</odoo>
+339
View File
@@ -0,0 +1,339 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<!--
Resource: res.partner.category
-->
<record id="res_partner_category_0" model="res.partner.category">
<field name="name">Vendor</field>
<field name="color" eval="2"/>
</record>
<record id="res_partner_category_2" model="res.partner.category">
<field name="name">Prospects</field>
<field name="color" eval="3"/>
</record>
<record id="res_partner_category_3" model="res.partner.category">
<field name="name">Employees</field>
<field name="color" eval="4"/>
</record>
<record id="res_partner_category_8" model="res.partner.category">
<field name="name">Consulting Services</field>
<field name="color" eval="5"/>
</record>
<record id="res_partner_category_11" model="res.partner.category">
<field name="name">Services</field>
<field name="color" eval="7"/>
</record>
<record id="res_partner_category_12" model="res.partner.category">
<field name="name">Office Supplies</field>
<field name="parent_id" ref="res_partner_category_0"/>
<field name="color" eval="8"/>
</record>
<record id="res_partner_category_14" model="res.partner.category">
<field name="name">Desk Manufacturers</field>
<field name="color" eval="10"/>
<field name="parent_id" ref="res_partner_category_0"/>
</record>
<!--
Resource: res.partner
-->
<record id="res_partner_1" model="res.partner">
<field name="name">Wood Corner</field>
<field eval="[Command.set([ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">1839 Arbor Way</field>
<field name="city">Turlock</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">95380</field>
<field name="country_id" ref="base.us"/>
<field name="email">wood.corner26@example.com</field>
<field name="phone">(623)-853-7197</field>
<field name="website">http://www.wood-corner.com</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_1-image.png"/>
<field name="vat">US12345672</field>
</record>
<record id="res_partner_2" model="res.partner">
<field name="name">Deco Addict</field>
<field eval="[Command.set([ref('base.res_partner_category_14')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">77 Santa Barbara Rd</field>
<field name="city">Pleasant Hill</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">94523</field>
<field name="country_id" ref="base.us"/>
<field name="email">deco_addict@yourcompany.example.com</field>
<field name="phone">(603)-996-3829</field>
<field name="website">http://www.deco-addict.com</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_2-image.png"/>
<field name="vat">US12345673</field>
</record>
<record id="res_partner_3" model="res.partner">
<field name="name">Gemini Furniture</field>
<field eval="[Command.set([ref('res_partner_category_8'), ref('res_partner_category_14')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">317 Fairchild Dr</field>
<field name="city">Fairfield</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">94535</field>
<field name="country_id" ref="base.us"/>
<field name="email">gemini_furniture@fake.geminifurniture.com</field>
<field name="phone">(941)-284-4875</field>
<field name="website">http://www.gemini-furniture.com/</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_3-image.png"/>
<field name="vat">US12345674</field>
</record>
<record id="res_partner_4" model="res.partner">
<field name="name">Ready Mat</field>
<field eval="[Command.set([ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">7500 W Linne Road</field>
<field name="city">Tracy</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">95304</field>
<field name="country_id" ref="base.us"/>
<field name="email">ready.mat28@example.com</field>
<field name="phone">(803)-873-6126</field>
<field name="website">http://www.ready-mat.com/</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_4-image.png"/>
<field name="vat">US12345675</field>
</record>
<record id="res_partner_5" model="res.partner">
<field name="city">Florenville</field>
<field name="country_id" ref="base.be"/>
<field name="email">wow@example.com</field>
<field name="image_1920" file="base/static/img/partner_open_wood.png" type="base64"/>
<field name="is_company" eval="True"/>
<field name="mobile">+32 987 65 43 21</field>
<field name="name">OpenWood</field>
<field name="phone">+32 987 65 43 21</field>
<field name="street">Orval 1</field>
<field name="website">www.openwood.example.com</field>
<field name="zip">6823</field>
</record>
<record id="res_partner_10" model="res.partner">
<field name="name">The Jackson Group</field>
<field name="is_company">1</field>
<field name="street">1611 Peony Dr</field>
<field name="city">Tracy</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">95377</field>
<field name="country_id" ref="base.us"/>
<field name="email">jackson.group82@example.com</field>
<field name="phone">(334)-502-1024</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_10-image.jpg"/>
<field name="vat">US12345676</field>
</record>
<record id="res_partner_12" model="res.partner">
<field name="name">Azure Interior</field>
<field eval="[Command.set([ref('res_partner_category_11')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">4557 De Silva St</field>
<field name="city">Fremont</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">94538</field>
<field name="phone">(870)-931-0505</field>
<field name="country_id" ref="base.us"/>
<field name="email">azure.Interior24@example.com</field>
<field name="website">http://www.azure-interior.com</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_12-image.png"/>
<field name="vat">US12345677</field>
</record>
<record id="res_partner_18" model="res.partner">
<field name="name">Lumber Inc</field>
<field name="is_company">1</field>
<field name="street">1337 N San Joaquin St</field>
<field name="city">Stockton</field>
<field name="state_id" ref='state_us_5'/>
<field name="zip">95202</field>
<field name="email">lumber-inv92@example.com</field>
<field name="phone">(828)-316-0593</field>
<field name="country_id" ref="base.us"/>
<field name="website">http://www.lumber-inc.com</field>
<field name="image_1920" type="base64" file="base/static/img/res_partner_18-image.png"/>
<field name="vat">US12345678</field>
</record>
<record id="res_partner_address_1" model="res.partner">
<field name="name">Willie Burke</field>
<field name="parent_id" ref="res_partner_1"/>
<field name="function">Service Manager</field>
<field name="email">willie.burke80@example.com</field>
<field name="phone">(846)-523-2111</field>
</record>
<record id="res_partner_address_2" model="res.partner">
<field name="name">Ron Gibson</field>
<field name="parent_id" ref="res_partner_1"/>
<field name="function">Store Manager</field>
<field name="email">ron.gibson76@example.com</field>
<field name="phone">(976)-397-4091</field>
</record>
<record id="res_partner_address_3" model="res.partner">
<field name="name">Douglas Fletcher</field>
<field name="parent_id" ref="res_partner_2"/>
<field name="function">Functional Consultant</field>
<field name="email">douglas.fletcher51@example.com</field>
<field name="phone">(132)-553-7242</field>
</record>
<record id="res_partner_address_4" model="res.partner">
<field name="name">Floyd Steward</field>
<field name="parent_id" ref="res_partner_2"/>
<field name="function">Analyst</field>
<field name="email">floyd.steward34@example.com</field>
<field name="phone">(145)-138-3401</field>
</record>
<record id="res_partner_address_5" model="res.partner">
<field name="name">Edwin Hansen</field>
<field name="parent_id" ref="res_partner_3"/>
<field name="function">Marketing Manager</field>
<field name="email">edwin.hansen58@example.com</field>
<field name="phone">(943)-352-2555</field>
</record>
<record id="res_partner_address_7" model="res.partner">
<field name="name">Billy Fox</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="function">Production Supervisor</field>
<field name="email">billy.fox45@example.com</field>
<field name="phone">(915)-498-5611</field>
</record>
<record id="res_partner_address_10" model="res.partner">
<field name="name">Jesse Brown</field>
<field name="parent_id" ref="res_partner_3"/>
<field name="function">Senior Consultant</field>
<field name="email">jesse.brown74@example.com</field>
<field name="phone">(829)-386-3277</field>
<field name="company_id" ref="base.main_company"/>
</record>
<record id="res_partner_address_11" model="res.partner">
<field name="name">Soham Palmer</field>
<field name="parent_id" ref="res_partner_3"/>
<field name="function">Director</field>
<field name="email">soham.palmer15@example.com</field>
<field name="phone">(379)-167-2040</field>
</record>
<record id="res_partner_address_13" model="res.partner">
<field name="name">Kim Snyder</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="function">Senior Associate</field>
<field name="email">kim.snyder96@example.com</field>
<field name="phone">(215)-379-4865</field>
</record>
<record id="res_partner_address_14" model="res.partner">
<field name="name">Edith Sanchez</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="function">Analyst</field>
<field name="email">edith.sanchez68@example.com</field>
<field name="phone">(938)-175-2048</field>
</record>
<record id="res_partner_address_15" model="res.partner">
<field name="name">Brandon Freeman</field>
<field name="function">Creative Director</field>
<field name="parent_id" ref="res_partner_12"/>
<field name="email">brandon.freeman55@example.com</field>
<field name="phone">(355)-687-3262</field>
</record>
<record id="res_partner_address_16" model="res.partner">
<field name="name">Nicole Ford</field>
<field name="function">Director</field>
<field name="parent_id" ref="res_partner_12"/>
<field name="email">nicole.ford75@example.com</field>
<field name="phone">(946)-638-6034</field>
</record>
<record id="res_partner_address_17" model="res.partner">
<field name="name">Toni Rhodes</field>
<field name="function">Managing Partner</field>
<field name="parent_id" ref="res_partner_10"/>
<field name="email">toni.rhodes11@example.com</field>
<field name="phone">(198)-539-4948</field>
</record>
<record id="res_partner_address_18" model="res.partner">
<field name="name">Gordon Owens</field>
<field name="function">Senior Consultant</field>
<field name="parent_id" ref="res_partner_10"/>
<field name="email">gordon.owens47@example.com</field>
<field name="phone">(336)-723-6569</field>
</record>
<record id="res_partner_address_24" model="res.partner">
<field name="name">Theodore Gardner</field>
<field name="function">System Analyst</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="email">theodore.gardner36@example.com</field>
<field name="phone">(186)-612-6561</field>
</record>
<record id="res_partner_address_25" model="res.partner">
<field name="name">Oscar Morgan</field>
<field name="parent_id" ref="res_partner_3"/>
<field name="function">Order Clerk</field>
<field name="email">oscar.morgan11@example.com</field>
<field name="phone">(561)-239-1744</field>
</record>
<record id="res_partner_address_27" model="res.partner">
<field name="name">Tom Ruiz</field>
<field name="parent_id" ref="res_partner_1"/>
<field name="function">Software Developer</field>
<field name="email">tom.ruiz89@example.com</field>
<field name="phone">(102)-834-1602</field>
</record>
<record id="res_partner_address_28" model="res.partner">
<field name="name">Colleen Diaz</field>
<field name="function">Business Executive</field>
<field name="parent_id" ref="res_partner_12"/>
<field name="email">colleen.diaz83@example.com</field>
<field name="phone">(255)-595-8393</field>
</record>
<record id="res_partner_address_30" model="res.partner">
<field name="name">Lorraine Douglas</field>
<field name="function">Functional Consultant</field>
<field name="parent_id" ref="res_partner_18"/>
<field name="email">lorraine.douglas35@example.com</field>
<field name="phone">(443)-648-9155</field>
</record>
<record id="res_partner_address_31" model="res.partner">
<field name="name">Addison Olson</field>
<field name="parent_id" ref="res_partner_2"/>
<field name="function">Sales Representative</field>
<field name="email">addison.olson28@example.com</field>
<field name="phone">(223)-399-7637</field>
</record>
<record id="res_partner_address_32" model="res.partner">
<field name="name">Sandra Neal</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="function">Sales Manager</field>
<field name="email">sandra.neal80@example.com</field>
<field name="phone">(430)-371-7293</field>
</record>
<record id="res_partner_address_33" model="res.partner">
<field name="name">Julie Richards</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="function">Financial Manager</field>
<field name="email">julie.richards84@example.com</field>
<field name="phone">(225)-148-7811</field>
</record>
<record id="res_partner_address_34" model="res.partner">
<field name="name">Travis Mendoza</field>
<field name="parent_id" ref="res_partner_4"/>
<field name="function">Knowledge Manager</field>
<field name="email">travis.mendoza24@example.com</field>
<field name="phone">(840)-944-8661</field>
</record>
<record id="res_partner_main1" model="res.partner">
<field name="name">Chester Reed</field>
<field name="parent_id" ref="main_partner"/>
<field name="function">Chief Executive Officer (CEO)</field>
<field name="email">chester.reed79@example.com</field>
<field name="phone">(979)-904-8902</field>
</record>
<record id="res_partner_main2" model="res.partner">
<field name="name">Dwayne Newman</field>
<field name="function">Chief Operations Officer (COO)</field>
<field name="parent_id" ref="main_partner"/>
<field name="email">dwayne.newman28@example.com</field>
<field name="phone">(614)-177-4937</field>
</record>
</data>
</odoo>
@@ -0,0 +1,106 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<data noupdate="0">
<record id="base.res_partner_address_1" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_1.jpg"/>
</record>
<record id="base.res_partner_address_2" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_2.jpg"/>
</record>
<record id="base.res_partner_address_3" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_3.jpg"/>
</record>
<record id="base.res_partner_address_4" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_4.jpg"/>
</record>
<record id="base.res_partner_address_5" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_5.jpg"/>
</record>
<record id="base.res_partner_address_7" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_7.jpg"/>
</record>
<record id="base.res_partner_address_10" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_10.jpg"/>
</record>
<record id="base.res_partner_address_11" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_11.jpg"/>
</record>
<record id="base.res_partner_address_13" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_13.jpg"/>
</record>
<record id="base.res_partner_address_14" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_14.jpg"/>
</record>
<record id="base.res_partner_address_15" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_15.jpg"/>
</record>
<record id="base.res_partner_address_16" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_16.jpg"/>
</record>
<record id="base.res_partner_address_17" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_17.jpg"/>
</record>
<record id="base.res_partner_address_18" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_18.jpg"/>
</record>
<record id="base.res_partner_address_24" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_24.jpg"/>
</record>
<record id="base.res_partner_address_25" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_25.jpg"/>
</record>
<record id="base.res_partner_address_27" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_27.jpg"/>
</record>
<record id="base.res_partner_address_28" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_28.jpg"/>
</record>
<record id="base.res_partner_address_30" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_30.jpg"/>
</record>
<record id="base.res_partner_address_31" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_31.jpg"/>
</record>
<record id="base.res_partner_address_32" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_32.jpg"/>
</record>
<record id="base.res_partner_address_33" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_33.jpg"/>
</record>
<record id="base.res_partner_address_34" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_address_34.jpg"/>
</record>
<record id="base.res_partner_main1" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_main1.jpg"/>
</record>
<record id="base.res_partner_main2" model="res.partner">
<field name="image_1920" type="base64" file="base/static/img/res_partner_main2.jpg"/>
</record>
</data>
</odoo>
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- user 1 is the technical admin user -->
<record model="res.users" id="base.user_root">
<field name="partner_id" ref="base.partner_root"/>
<field name="company_id" ref="main_company"/>
<field name="company_ids" eval="[Command.link(ref('main_company'))]"/>
<field name="email">odoobot@example.com</field>
<field name="signature"><![CDATA[<span>-- <br/>
System</span>]]></field>
</record>
<!-- user 2 is the human admin user -->
<record id="user_admin" model="res.users">
<field name="login">admin</field>
<field name="password">admin</field>
<field name="partner_id" ref="base.partner_admin"/>
<field name="company_id" ref="main_company"/>
<field name="company_ids" eval="[Command.link(ref('main_company'))]"/>
<field name="groups_id" eval="[Command.set([])]"/>
<field name="signature"><![CDATA[<span>-- <br/>
Administrator</span>]]></field>
</record>
<record id="user_admin_settings" model="res.users.settings" forcecreate="0">
<field name="user_id" ref="base.user_admin"/>
</record>
<!-- Default user with full access rights for newly created users -->
<record id="default_user" model="res.users">
<field name="name">Default User Template</field>
<field name="login">default</field>
<field name="active" eval="False"/>
</record>
<record id="public_user" model="res.users">
<field name="name">Public user</field>
<field name="login">public</field>
<field name="password"></field>
<!-- Avoid auto-including this demo user in any default group -->
<field name="groups_id" eval="[Command.set([])]"/>
<field name="image_1920" type="base64" file="base/static/img/public_user-image.png"/>
<field name="partner_id" ref="public_partner"/>
<field name="active" eval="False"/>
</record>
</data>
</odoo>
+97
View File
@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="partner_demo" model="res.partner">
<field name="name">Marc Demo</field>
<field name="company_id" ref="main_company"/>
<field name="company_name">YourCompany</field>
<field name="street">3575 Buena Vista Avenue</field>
<field name="city">Eugene</field>
<field name="state_id" model="res.country.state" search="[('code','=','OR')]"/>
<field name="zip">97401</field>
<field name="country_id" ref="us"/>
<field name="tz">Europe/Brussels</field>
<field name="email">mark.brown23@example.com</field>
<field name="phone">(441)-695-2334</field>
</record>
<!-- Only update if we don't have information coming from the database manager -->
<function model="res.partner" name="write">
<value eval="[ref('base.main_partner')]"/>
<value eval="{
'name': 'YourCompany',
'street': '250 Executive Park Blvd, Suite 3400',
'city': 'San Francisco',
'zip': '94134',
'country_id': ref('base.us'),
'state_id': ref('base.state_us_5'),
'phone': '+1 555-555-5556',
'website': 'www.example.com',
'email': 'info@yourcompany.com',
} if obj(ref('base.main_partner')).name == 'My Company' else {}" model="res.partner"/>
</function>
<record id="user_demo" model="res.users">
<field name="partner_id" ref="base.partner_demo"/>
<field name="login">demo</field>
<field name="password">demo</field>
<field name="signature" type="html"><span>-- <br/>+Mr Demo</span></field>
<field name="company_id" ref="main_company"/>
<field name="groups_id" eval="[Command.set([ref('base.group_user'), ref('base.group_partner_manager'), ref('base.group_allow_export')])]"/>
<field name="image_1920" type="base64" file="base/static/img/user_demo-image.png"/>
</record>
<record id="partner_demo" model="res.partner">
<field name="user_id" ref="base.user_demo"/>
</record>
<record model="res.partner" id="base.partner_root">
<field name="tz">Europe/Brussels</field>
</record>
<record model="res.partner" id="base.partner_admin">
<field name="name">Mitchell Admin</field>
<field name="company_name">YourCompany</field>
<field name="street">215 Vine St</field>
<field name="city">Scranton</field>
<field name="zip">18503</field>
<field name='country_id' ref='base.us'/>
<field name='state_id' ref='state_us_39'/>
<field name="phone">+1 555-555-5555</field>
<field name="email">admin@yourcompany.example.com</field>
<field name="tz">Europe/Brussels</field>
<field name="user_id" ref="base.user_admin"/>
<field name="image_1920" type="base64" file="base/static/img/partner_root-image.png"/>
</record>
<record id="base.user_admin" model="res.users">
<field name="signature" type="html"><span>-- <br/>Mitchell Admin</span></field>
</record>
<!-- Portal : partner and user -->
<record id="partner_demo_portal" model="res.partner">
<field name="name">Joel Willis</field>
<field name="email">joel.willis63@example.com</field>
<field name="street">858 Lynn Street</field>
<field name="city">Bayonne</field>
<field model="res.country.state" name="state_id" search="[('code','ilike','NJ')]"/>
<field name="zip">07002</field>
<field name="country_id" ref="base.us"/>
<field name="company_name">YourCompany</field>
<field name="image_1920" type="base64" file="base/static/img/partner_demo_portal.png"/>
<field name="phone">(683)-556-5104</field>
</record>
<record id="demo_user0" model="res.users" context="{'no_reset_password': True}">
<field name="partner_id" ref="partner_demo_portal"/>
<field name="login">portal</field>
<field name="password">portal</field>
<field name="signature"><![CDATA[<span>-- <br/>Mr Demo Portal</span>]]></field>
<field name="groups_id" eval="[Command.clear()]"/><!-- Avoid auto-including this user in any default group -->
</record>
<record id="base.group_portal" model="res.groups"><!-- Add the demo user to the portal (and therefore to the portal member group) -->
<field name="users" eval="[Command.link(ref('demo_user0'))]"/>
</record>
</data>
</odoo>
+21
View File
@@ -0,0 +1,21 @@
{
"options": {
"autoRename": false,
"autoRenameStrict": false,
"blacklist": {
"rtlcss": {
"config": true,
"options": true
}
},
"clean": true,
"greedy": false,
"processUrls": false,
"stringMap": [],
"useCalc": false,
"aliases": {},
"processEnv": false
},
"plugins": [],
"map": false
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More