Add some patches in 4.2 series
This commit is contained in:
parent
0a80b4cd13
commit
5e27dcc318
|
@ -0,0 +1,16 @@
|
|||
diff -r dd969de519a8 trytond/trytond/model/modelsql.py
|
||||
--- a/trytond/trytond/model/modelsql.py Mon Nov 28 15:54:24 2016 +0100
|
||||
+++ b/trytond/trytond/model/modelsql.py Mon Jan 30 22:32:48 2017 +0100
|
||||
@@ -304,10 +304,10 @@
|
||||
cls.raise_user_error('foreign_model_missing',
|
||||
error_args=error_args)
|
||||
for name, _, error in cls._sql_constraints:
|
||||
- if name in str(exception):
|
||||
+ if name in exception.message:
|
||||
cls.raise_user_error(error)
|
||||
for name, error in cls._sql_error_messages.iteritems():
|
||||
- if name in str(exception):
|
||||
+ if name in exception.message:
|
||||
cls.raise_user_error(error)
|
||||
|
||||
@classmethod
|
|
@ -0,0 +1,349 @@
|
|||
diff -r 2283822f1703 trytond/trytond/protocols/apm.py
|
||||
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
||||
+++ b/trytond/trytond/protocols/apm.py Sun Aug 07 01:55:37 2016 +0200
|
||||
@@ -0,0 +1,313 @@
|
||||
+# encoding: utf-8
|
||||
+#
|
||||
+# apm.py aims to be an utility to extend Tryton with Application
|
||||
+# Performance Monitoring functionalities.
|
||||
+#
|
||||
+# For it to work you'll need to add some parameters to the configuration file.
|
||||
+#
|
||||
+# Here you have all available options:
|
||||
+#
|
||||
+# ------------------------
|
||||
+#
|
||||
+# [apm]
|
||||
+# directory = /var/lib/tryton/apm
|
||||
+#
|
||||
+# profiler = vmprof
|
||||
+# # vmprof options. See:
|
||||
+# # https://vmprof.readthedocs.io/en/latest/vmprof.html#module-level-functions
|
||||
+# # vmprof_period: Frequency of vmprof checks in milliseconds
|
||||
+# vmprof_period = 0.99 # Frequency in milliseconds
|
||||
+# vmprof_memory = True
|
||||
+# vmprof_lines = True
|
||||
+#
|
||||
+# #profiler = profile
|
||||
+#
|
||||
+# profiler_start_condition = True
|
||||
+# profiler_store_condition = elapsed > 0.1
|
||||
+# log_condition = elapsed > 0.005
|
||||
+#
|
||||
+# ------------------------
|
||||
+#
|
||||
+# As you can see, you can choose between 'vmprof' or 'profile' (cProfile is
|
||||
+# used), but the former is much faster. See the corresponding docs on the
|
||||
+# features and limitations of each one.
|
||||
+#
|
||||
+# *_condition options define, by using a python expression when should the
|
||||
+# profiler be started (they are overhead so most probably you don't want to
|
||||
+# start it with all transactions), when to store the profile, and when to log
|
||||
+# transactions (in $directory/transactions.log).
|
||||
+#
|
||||
+# In order to see the profiles created by vmprof you should use:
|
||||
+#
|
||||
+# $ vmprofshow $directory/profiles/$transactionid
|
||||
+#
|
||||
+# In order to see the profiles created by profile you can use a script like
|
||||
+# this (profiles are saved just like vmprof as
|
||||
+# $directory/profiles/$transactionid):
|
||||
+#
|
||||
+# #!/usr/bin/env python
|
||||
+# import sys
|
||||
+# import pstats
|
||||
+# stats = pstats.Stats(sys.argv[1]).sort_stats('cumulative')
|
||||
+# stats.print_stats()
|
||||
+#
|
||||
+import os
|
||||
+import sys
|
||||
+import random
|
||||
+import signal
|
||||
+import locale
|
||||
+import faulthandler
|
||||
+import json
|
||||
+import traceback
|
||||
+from operator import itemgetter
|
||||
+from datetime import datetime
|
||||
+from trytond import backend
|
||||
+from trytond.config import config
|
||||
+from trytond.tools import is_instance_method
|
||||
+from trytond.exceptions import TrytonException, UserError
|
||||
+from trytond.transaction import Transaction
|
||||
+
|
||||
+
|
||||
+current_actions = {}
|
||||
+action_id = 0
|
||||
+
|
||||
+apm = config.getboolean('apm', 'apm', default=True)
|
||||
+profiler = config.get('apm', 'profiler')
|
||||
+profiler_start_condition = config.get('apm', 'profiler_start_condition')
|
||||
+profiler_store_condition = config.get('apm', 'profiler_store_condition')
|
||||
+apm_directory = config.get('apm', 'directory')
|
||||
+vmprof_period = config.getfloat('apm', 'vmprof_period')
|
||||
+vmprof_memory = config.getboolean('apm', 'vmprof_memory')
|
||||
+vmprof_lines = config.getboolean('apm', 'vmprof_lines')
|
||||
+log_condition = config.get('apm', 'log_condition')
|
||||
+
|
||||
+if apm_directory:
|
||||
+ profiler_directory = os.path.join(apm_directory, 'profiles')
|
||||
+ errors_directory = os.path.join(apm_directory, 'errors')
|
||||
+ for d in (apm_directory, profiler_directory, errors_directory):
|
||||
+ if not os.path.exists(d):
|
||||
+ os.mkdir(d)
|
||||
+ log_path = os.path.join(apm_directory, 'transactions.log')
|
||||
+ log_file = open(log_path, 'a')
|
||||
+
|
||||
+if profiler == 'vmprof':
|
||||
+ import vmprof
|
||||
+elif profiler == 'profile':
|
||||
+ import cProfile
|
||||
+
|
||||
+
|
||||
+ERROR_MESSAGE = {
|
||||
+ 'ca': ("S'ha produït un error executant la vostra petició. S'ha "
|
||||
+ "enviat la informació per saber la causa i ho resoldrem.\n\n"
|
||||
+ "Tot i amb això, si vols parlar-ne amb algú del nostre equip pots "
|
||||
+ "utilitzar la següent referència: %d."),
|
||||
+ 'es': ('Se ha producido un error ejecutando vuestra petición. Se ha '
|
||||
+ 'enviado la información para saber el motivo y lo resolveremos.\n\n'
|
||||
+ 'A pesar de esto, si quieres hablar sobre la incidencia con alguien de '
|
||||
+ 'nuestro equipo puedes utilizar la referencia siguiente: %d.'),
|
||||
+ 'en': ('There was an error while executing your request. We will check '
|
||||
+ 'to see what could be the cause.\n\nHowever, if you want to talk to a '
|
||||
+ 'NaN-tic consultant about this issue, you may use the following '
|
||||
+ 'reference: %d'),
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+# Start Printing Tables
|
||||
+# http://ginstrom.com/scribbles/2007/09/04/pretty-printing-a-table-in-python/
|
||||
+
|
||||
+# Usage:
|
||||
+# 1. Gets which PID trytond run
|
||||
+# 2. sudo kill -s SIGUSR1 PID
|
||||
+# 3. See results in trytond logs
|
||||
+
|
||||
+def format_num(num):
|
||||
+ """Format a number according to given places.
|
||||
+ Adds commas, etc. Will truncate floats into ints!"""
|
||||
+
|
||||
+ try:
|
||||
+ inum = int(num)
|
||||
+ return locale.format("%.*f", (0, inum), True)
|
||||
+
|
||||
+ except (ValueError, TypeError):
|
||||
+ return str(num)
|
||||
+
|
||||
+def get_max_width(table, index):
|
||||
+ """Get the maximum width of the given column index"""
|
||||
+ return max([len(format_num(row[index])) for row in table])
|
||||
+
|
||||
+def pprint_table(table):
|
||||
+ """
|
||||
+ Prints out a table of data, padded for alignment
|
||||
+ @param table: The table to print. A list of lists.
|
||||
+ Each row must have the same number of columns.
|
||||
+ """
|
||||
+ col_paddings = []
|
||||
+
|
||||
+ for i in range(len(table[0])):
|
||||
+ col_paddings.append(get_max_width(table, i))
|
||||
+
|
||||
+ for row in table:
|
||||
+ # left col
|
||||
+ print row[0].ljust(col_paddings[0] + 1),
|
||||
+ # rest of the cols
|
||||
+ for i in range(1, len(row)):
|
||||
+ col = format_num(row[i]).ljust(col_paddings[i] + 2)
|
||||
+ print col,
|
||||
+ print
|
||||
+
|
||||
+# End Printing Tables
|
||||
+
|
||||
+def signal_user_handler(signal, frame):
|
||||
+ print '-' * 30
|
||||
+ if current_actions:
|
||||
+ key = current_actions.keys()[0]
|
||||
+ header = sorted(current_actions[key].keys())
|
||||
+ header = ('id', 'database_name', 'database_pid', 'user', 'protocol',
|
||||
+ 'host', 'port', 'timestamp', 'elapsed', 'object_name', 'method',
|
||||
+ 'args')
|
||||
+ table = []
|
||||
+ table.append([x.upper() for x in header])
|
||||
+
|
||||
+ for action in sorted(current_actions.values(),
|
||||
+ key=itemgetter('timestamp')):
|
||||
+ row = []
|
||||
+ for key in header:
|
||||
+ value = action.get(key, '')
|
||||
+ if key == 'elapsed':
|
||||
+ value = (datetime.now() - action['timestamp']).total_seconds()
|
||||
+ if key == 'args':
|
||||
+ value = value[:30]
|
||||
+ if isinstance(value, datetime):
|
||||
+ value = value.ctime()
|
||||
+ row.append(value)
|
||||
+ table.append(row)
|
||||
+ pprint_table(table)
|
||||
+ print '=' * 30
|
||||
+
|
||||
+def call_rpc(rpc, obj, method, c_args, c_kwargs):
|
||||
+ try:
|
||||
+ meth = getattr(obj, method)
|
||||
+ if (rpc.instantiate is None
|
||||
+ or not is_instance_method(obj, method)):
|
||||
+ result = rpc.result(meth(*c_args, **c_kwargs))
|
||||
+ else:
|
||||
+ assert rpc.instantiate == 0
|
||||
+ inst = c_args.pop(0)
|
||||
+ if hasattr(inst, method):
|
||||
+ result = rpc.result(meth(inst, *c_args, **c_kwargs))
|
||||
+ else:
|
||||
+ result = [rpc.result(meth(i, *c_args, **c_kwargs))
|
||||
+ for i in inst]
|
||||
+ except TrytonException:
|
||||
+ raise
|
||||
+ except Exception, e:
|
||||
+ if not apm_directory:
|
||||
+ raise
|
||||
+ ex_type, ex, tb = sys.exc_info()
|
||||
+ transaction_id = Transaction().apm_transaction_id
|
||||
+ language = Transaction().language
|
||||
+ data = {
|
||||
+ 'id': transaction_id,
|
||||
+ 'exception_type' : str(type(e)),
|
||||
+ 'exception_args': e.args,
|
||||
+ 'formatted_exception': traceback.format_exception(type(e), e, tb),
|
||||
+ 'root_directory': sys.path[0],
|
||||
+ }
|
||||
+ data.update(current_actions[transaction_id])
|
||||
+ path = os.path.join(errors_directory, str(transaction_id))
|
||||
+ with open(path, 'w') as f:
|
||||
+ f.write(json.dumps(data, default=json_serial, sort_keys=True,
|
||||
+ indent=4, separators=(',', ': ')))
|
||||
+ # Try to get language from the user
|
||||
+ if not language in ERROR_MESSAGE:
|
||||
+ language = 'en_US'
|
||||
+ raise UserError(ERROR_MESSAGE[language] % transaction_id)
|
||||
+ return result
|
||||
+
|
||||
+def rpc_result(transaction, request, pool, user, args, rpc, obj, method,
|
||||
+ c_args, c_kwargs):
|
||||
+ if backend.name() == 'postgresql':
|
||||
+ cursor = transaction.connection.cursor()
|
||||
+ cursor.execute("SELECT pg_backend_pid()")
|
||||
+ database_pid = cursor.fetchone()[0]
|
||||
+ else:
|
||||
+ database_pid = '-'
|
||||
+ action = {
|
||||
+ 'host': request.host,
|
||||
+ 'port': '',
|
||||
+ 'protocol': '',
|
||||
+ 'database_name': pool.database_name,
|
||||
+ 'database_pid': database_pid,
|
||||
+ 'user': user,
|
||||
+ 'object_name': obj.__name__,
|
||||
+ 'method': method,
|
||||
+ 'args': repr(args),
|
||||
+ }
|
||||
+ action_id = add(action)
|
||||
+ transaction.apm_transaction_id = action_id
|
||||
+ def get_filename():
|
||||
+ return os.path.join(profiler_directory, str(action_id))
|
||||
+
|
||||
+ if not profiler or not eval(profiler_start_condition, {}, action):
|
||||
+ try:
|
||||
+ result = call_rpc(rpc, obj, method, c_args, c_kwargs)
|
||||
+ finally:
|
||||
+ remove(action_id)
|
||||
+ return result
|
||||
+
|
||||
+ if profiler == 'vmprof':
|
||||
+ filename = get_filename()
|
||||
+ with open(filename, 'w') as f:
|
||||
+ vmprof.enable(f.fileno(), period=float(vmprof_period)/1000.0,
|
||||
+ memory=vmprof_memory, lines=vmprof_lines)
|
||||
+ try:
|
||||
+ result = call_rpc(rpc, obj, method, c_args, c_kwargs)
|
||||
+ finally:
|
||||
+ vmprof.disable()
|
||||
+ action = close(action_id)
|
||||
+ if not eval(profiler_store_condition, {}, action):
|
||||
+ os.remove(filename)
|
||||
+ remove(action_id)
|
||||
+ elif profiler == 'profile':
|
||||
+ profile = cProfile.Profile()
|
||||
+ profile.enable()
|
||||
+ try:
|
||||
+ result = call_rpc(rpc, obj, method, c_args, c_kwargs)
|
||||
+ finally:
|
||||
+ profile.disable()
|
||||
+ action = close(action_id)
|
||||
+ if eval(profiler_store_condition, {}, action):
|
||||
+ profile.dump_stats(get_filename())
|
||||
+ remove(action_id)
|
||||
+ return result
|
||||
+
|
||||
+if apm:
|
||||
+ signal.signal(signal.SIGUSR1, signal_user_handler)
|
||||
+ faulthandler.register(signal.SIGUSR2)
|
||||
+
|
||||
+def add(value):
|
||||
+ action_id = random.randint(0, 999999)
|
||||
+ value['timestamp'] = datetime.now()
|
||||
+ value['elapsed'] = None
|
||||
+ value['id'] = str(action_id)
|
||||
+ current_actions[action_id] = value
|
||||
+ return action_id
|
||||
+
|
||||
+def json_serial(obj):
|
||||
+ """JSON serializer for objects not serializable by default json code"""
|
||||
+
|
||||
+ if isinstance(obj, datetime):
|
||||
+ serial = obj.isoformat()
|
||||
+ return serial
|
||||
+ raise TypeError ("Type not serializable")
|
||||
+
|
||||
+
|
||||
+def close(action_id):
|
||||
+ action = current_actions[action_id]
|
||||
+ action['elapsed'] = (datetime.now() - action['timestamp']).total_seconds()
|
||||
+ if eval(log_condition, {}, action):
|
||||
+ log_file.write(json.dumps(action, default=json_serial) + '\n')
|
||||
+ return action
|
||||
+
|
||||
+def remove(action_id):
|
||||
+ del current_actions[action_id]
|
||||
diff -r dd969de519a8 trytond/trytond/protocols/dispatcher.py
|
||||
--- a/trytond/trytond/protocols/dispatcher.py Mon Nov 28 15:54:24 2016 +0100
|
||||
+++ b/trytond/trytond/protocols/dispatcher.py Mon Jan 30 22:49:35 2017 +0100
|
||||
@@ -3,6 +3,7 @@
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
import logging
|
||||
import pydoc
|
||||
+import apm
|
||||
|
||||
from werkzeug.utils import redirect
|
||||
from werkzeug.exceptions import abort
|
||||
@@ -154,18 +155,8 @@
|
||||
try:
|
||||
c_args, c_kwargs, transaction.context, transaction.timestamp \
|
||||
= rpc.convert(obj, *args, **kwargs)
|
||||
- meth = getattr(obj, method)
|
||||
- if (rpc.instantiate is None
|
||||
- or not is_instance_method(obj, method)):
|
||||
- result = rpc.result(meth(*c_args, **c_kwargs))
|
||||
- else:
|
||||
- assert rpc.instantiate == 0
|
||||
- inst = c_args.pop(0)
|
||||
- if hasattr(inst, method):
|
||||
- result = rpc.result(meth(inst, *c_args, **c_kwargs))
|
||||
- else:
|
||||
- result = [rpc.result(meth(i, *c_args, **c_kwargs))
|
||||
- for i in inst]
|
||||
+ result = apm.rpc_result(transaction, request, pool, user,
|
||||
+ args, rpc, obj, method, c_args, c_kwargs)
|
||||
except DatabaseOperationalError:
|
||||
if count and not rpc.readonly:
|
||||
transaction.rollback()
|
|
@ -0,0 +1,256 @@
|
|||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/country.xml
|
||||
--- a/trytond/trytond/modules/country/country.xml Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/country.xml Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -30896,7 +30896,7 @@
|
||||
</record>
|
||||
|
||||
<record model="country.subdivision" id="es-bi">
|
||||
- <field name="name">Vizcayaa / Bizkaia</field>
|
||||
+ <field name="name">Vizcaya / Bizkaia</field>
|
||||
<field name="code">ES-BI</field>
|
||||
<field name="type">province</field>
|
||||
<field name="parent" ref="es-pv"/>
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/bg.po
|
||||
--- a/trytond/trytond/modules/country/locale/bg.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/bg.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5728,8 +5728,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/ca.po
|
||||
--- a/trytond/trytond/modules/country/locale/ca.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/ca.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5715,8 +5715,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/cs.po
|
||||
--- a/trytond/trytond/modules/country/locale/cs.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/cs.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5720,8 +5720,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/de.po
|
||||
--- a/trytond/trytond/modules/country/locale/de.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/de.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5715,8 +5715,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/es.po
|
||||
--- a/trytond/trytond/modules/country/locale/es.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/es.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5715,8 +5715,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/es_419.po
|
||||
--- a/trytond/trytond/modules/country/locale/es_419.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/es_419.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5718,8 +5718,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/fr.po
|
||||
--- a/trytond/trytond/modules/country/locale/fr.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/fr.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5715,7 +5715,7 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
msgstr "Biscaye"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/hu_HU.po
|
||||
--- a/trytond/trytond/modules/country/locale/hu_HU.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/hu_HU.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5725,8 +5725,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/it_IT.po
|
||||
--- a/trytond/trytond/modules/country/locale/it_IT.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/it_IT.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5727,8 +5727,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/ja_JP.po
|
||||
--- a/trytond/trytond/modules/country/locale/ja_JP.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/ja_JP.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5718,8 +5718,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/lo.po
|
||||
--- a/trytond/trytond/modules/country/locale/lo.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/lo.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5734,7 +5734,7 @@
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/lt.po
|
||||
--- a/trytond/trytond/modules/country/locale/lt.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/lt.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5717,8 +5717,8 @@
|
||||
msgstr "Badachoso provincija"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/nl.po
|
||||
--- a/trytond/trytond/modules/country/locale/nl.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/nl.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5741,7 +5741,7 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
msgstr "Biskaje / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/pl.po
|
||||
--- a/trytond/trytond/modules/country/locale/pl.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/pl.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5715,8 +5715,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/pt_BR.po
|
||||
--- a/trytond/trytond/modules/country/locale/pt_BR.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/pt_BR.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5718,8 +5718,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/ru.po
|
||||
--- a/trytond/trytond/modules/country/locale/ru.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/ru.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5745,7 +5745,7 @@
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/sl.po
|
||||
--- a/trytond/trytond/modules/country/locale/sl.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/sl.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5715,8 +5715,8 @@
|
||||
msgstr "Badajoz"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
||||
diff -r 0d85c0b4b17a trytond/trytond/modules/country/locale/zh_CN.po
|
||||
--- a/trytond/trytond/modules/country/locale/zh_CN.po Mon Nov 28 16:07:47 2016 +0100
|
||||
+++ b/trytond/trytond/modules/country/locale/zh_CN.po Mon Jan 30 22:43:16 2017 +0100
|
||||
@@ -5736,8 +5736,8 @@
|
||||
msgstr "巴达霍斯"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bi"
|
||||
-msgid "Vizcayaa / Bizkaia"
|
||||
-msgstr "Vizcayaa / Bizkaia"
|
||||
+msgid "Vizcaya / Bizkaia"
|
||||
+msgstr "Vizcaya / Bizkaia"
|
||||
|
||||
msgctxt "model:country.subdivision,name:es-bu"
|
||||
msgid "Burgos"
|
|
@ -0,0 +1,24 @@
|
|||
diff -r 6e2341a690a7 trytond/trytond/modules/stock/locale/ca.po
|
||||
--- a/trytond/trytond/modules/stock/locale/ca.po Mon Nov 28 16:40:14 2016 +0100
|
||||
+++ b/trytond/trytond/modules/stock/locale/ca.po Mon Jan 30 22:39:45 2017 +0100
|
||||
@@ -1914,7 +1914,7 @@
|
||||
|
||||
msgctxt "selection:stock.location,type:"
|
||||
msgid "Drop"
|
||||
-msgstr "Rebuig"
|
||||
+msgstr "Dipòsit"
|
||||
|
||||
msgctxt "selection:stock.location,type:"
|
||||
msgid "Lost and Found"
|
||||
diff -r 6e2341a690a7 trytond/trytond/modules/stock/locale/es.po
|
||||
--- a/trytond/trytond/modules/stock/locale/es.po Mon Nov 28 16:40:14 2016 +0100
|
||||
+++ b/trytond/trytond/modules/stock/locale/es.po Mon Jan 30 22:39:45 2017 +0100
|
||||
@@ -1907,7 +1907,7 @@
|
||||
|
||||
msgctxt "selection:stock.location,type:"
|
||||
msgid "Drop"
|
||||
-msgstr "Desecho"
|
||||
+msgstr "Dipósito"
|
||||
|
||||
msgctxt "selection:stock.location,type:"
|
||||
msgid "Lost and Found"
|
|
@ -0,0 +1,16 @@
|
|||
diff -r 49bb5470d6ba trytond/trytond/modules/sale/sale.py
|
||||
--- a/trytond/trytond/modules/sale/sale.py Mon Nov 28 17:25:07 2016 +0100
|
||||
+++ b/trytond/trytond/modules/sale/sale.py Tue Dec 13 16:23:06 2016 +0100
|
||||
@@ -1175,8 +1175,10 @@
|
||||
party_context = {}
|
||||
if self.sale and self.sale.party:
|
||||
party = self.sale.party
|
||||
- if party.lang:
|
||||
- party_context['language'] = party.lang.code
|
||||
+ elif hasattr(self, 'party') and self.party:
|
||||
+ party = self.party
|
||||
+ if party and party.lang:
|
||||
+ party_context['language'] = party.lang.code
|
||||
|
||||
# Set taxes before unit_price to have taxes in context of sale price
|
||||
taxes = []
|
Loading…
Reference in New Issue