tryton 6.0.38__py3-none-any.whl → 6.0.40__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of tryton might be problematic. Click here for more details.

Files changed (44) hide show
  1. tryton/__init__.py +1 -1
  2. tryton/common/common.py +10 -3
  3. tryton/common/datetime_.py +3 -1
  4. tryton/data/locale/bg/LC_MESSAGES/tryton.mo +0 -0
  5. tryton/data/locale/ca/LC_MESSAGES/tryton.mo +0 -0
  6. tryton/data/locale/cs/LC_MESSAGES/tryton.mo +0 -0
  7. tryton/data/locale/de/LC_MESSAGES/tryton.mo +0 -0
  8. tryton/data/locale/es/LC_MESSAGES/tryton.mo +0 -0
  9. tryton/data/locale/es_419/LC_MESSAGES/tryton.mo +0 -0
  10. tryton/data/locale/et/LC_MESSAGES/tryton.mo +0 -0
  11. tryton/data/locale/fa/LC_MESSAGES/tryton.mo +0 -0
  12. tryton/data/locale/fi/LC_MESSAGES/tryton.mo +0 -0
  13. tryton/data/locale/fr/LC_MESSAGES/tryton.mo +0 -0
  14. tryton/data/locale/hu/LC_MESSAGES/tryton.mo +0 -0
  15. tryton/data/locale/id/LC_MESSAGES/tryton.mo +0 -0
  16. tryton/data/locale/it/LC_MESSAGES/tryton.mo +0 -0
  17. tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo +0 -0
  18. tryton/data/locale/lo/LC_MESSAGES/tryton.mo +0 -0
  19. tryton/data/locale/lt/LC_MESSAGES/tryton.mo +0 -0
  20. tryton/data/locale/nl/LC_MESSAGES/tryton.mo +0 -0
  21. tryton/data/locale/pl/LC_MESSAGES/tryton.mo +0 -0
  22. tryton/data/locale/pt/LC_MESSAGES/tryton.mo +0 -0
  23. tryton/data/locale/ro/LC_MESSAGES/tryton.mo +0 -0
  24. tryton/data/locale/ru/LC_MESSAGES/tryton.mo +0 -0
  25. tryton/data/locale/sl/LC_MESSAGES/tryton.mo +0 -0
  26. tryton/data/locale/tr/LC_MESSAGES/tryton.mo +0 -0
  27. tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo +0 -0
  28. tryton/gui/window/view_form/model/field.py +48 -18
  29. tryton/gui/window/view_form/screen/screen.py +58 -36
  30. tryton/gui/window/view_form/view/calendar_gtk/calendar_.py +12 -7
  31. tryton/gui/window/view_form/view/form_gtk/char.py +5 -6
  32. tryton/gui/window/view_form/view/form_gtk/document.py +9 -10
  33. tryton/gui/window/view_form/view/list_gtk/editabletree.py +2 -1
  34. tryton/gui/window/view_form/view/list_gtk/widget.py +21 -1
  35. tryton/gui/window/win_form.py +8 -6
  36. tryton/gui/window/wizard.py +2 -0
  37. tryton/jsonrpc.py +5 -1
  38. tryton/plugins/__init__.py +5 -3
  39. {tryton-6.0.38.data → tryton-6.0.40.data}/scripts/tryton +2 -1
  40. {tryton-6.0.38.dist-info → tryton-6.0.40.dist-info}/METADATA +1 -1
  41. {tryton-6.0.38.dist-info → tryton-6.0.40.dist-info}/RECORD +44 -44
  42. {tryton-6.0.38.dist-info → tryton-6.0.40.dist-info}/LICENSE +0 -0
  43. {tryton-6.0.38.dist-info → tryton-6.0.40.dist-info}/WHEEL +0 -0
  44. {tryton-6.0.38.dist-info → tryton-6.0.40.dist-info}/top_level.txt +0 -0
tryton/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # This file is part of Tryton. The COPYRIGHT file at the top level of
2
2
  # this repository contains the full copyright notices and license terms.
3
- __version__ = "6.0.38"
3
+ __version__ = "6.0.40"
4
4
  import gi
5
5
  import locale
6
6
 
tryton/common/common.py CHANGED
@@ -219,7 +219,7 @@ class ModelAccess(object):
219
219
  self._models = rpc.execute('model', 'ir.model', 'list_models',
220
220
  rpc.CONTEXT)
221
221
  except TrytonServerError:
222
- pass
222
+ logger.error("Unable to get model list.")
223
223
 
224
224
  def __getitem__(self, model):
225
225
  if model in self._access:
@@ -233,7 +233,14 @@ class ModelAccess(object):
233
233
  access = rpc.execute('model', 'ir.model.access', 'get_access',
234
234
  self._models[to_load], rpc.CONTEXT)
235
235
  except TrytonServerError:
236
- access = {}
236
+ logger.error("Unable to get access for %s.", model)
237
+ access = {
238
+ model: {
239
+ 'read': True,
240
+ 'write': False,
241
+ 'create': False,
242
+ 'delete': False},
243
+ }
237
244
  self._access.update(access)
238
245
  return self._access[model]
239
246
 
@@ -1135,7 +1142,7 @@ class RPCProgress(object):
1135
1142
 
1136
1143
  def return_():
1137
1144
  if self.exception:
1138
- raise self.exception
1145
+ raise RPCException(self.exception)
1139
1146
  else:
1140
1147
  return self.res
1141
1148
 
@@ -10,7 +10,9 @@ from dateutil.parser import parse
10
10
 
11
11
  from .common import IconFactory
12
12
 
13
- __all__ = ['Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime']
13
+ __all__ = [
14
+ 'Date', 'CellRendererDate', 'Time', 'CellRendererTime', 'DateTime',
15
+ 'date_parse']
14
16
 
15
17
  _ = gettext.gettext
16
18
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -15,6 +15,7 @@ import datetime
15
15
  import decimal
16
16
  from decimal import Decimal
17
17
  import math
18
+ from pathlib import Path
18
19
  from tryton.common import RPCExecute, RPCException
19
20
  from tryton.common.htmltextbuffer import guess_decode
20
21
  from tryton.pyson import PYSONDecoder
@@ -993,26 +994,56 @@ class ReferenceField(Field):
993
994
 
994
995
 
995
996
  class _FileCache(object):
996
- def __init__(self, path):
997
- self.path = path
997
+ def __init__(self, data=None):
998
+ _, filename = tempfile.mkstemp(prefix='tryton_')
999
+ self.path = Path(filename)
1000
+ self.suffixes = {}
1001
+ if data:
1002
+ with open(self.path, 'wb') as fp:
1003
+ fp.write(data)
1004
+
1005
+ @property
1006
+ def data(self):
1007
+ with open(self.path, 'rb') as fp:
1008
+ return fp.read()
998
1009
 
999
1010
  def __del__(self):
1000
1011
  try:
1001
1012
  os.remove(self.path)
1002
1013
  except IOError:
1003
1014
  pass
1015
+ for path in self.suffixes.values():
1016
+ try:
1017
+ os.remove(path)
1018
+ except IOError:
1019
+ pass
1020
+
1021
+ def with_suffix(self, suffix):
1022
+ if suffix in self.suffixes:
1023
+ return self.suffixes[suffix]
1024
+ _, filename = tempfile.mkstemp(prefix='tryton_', suffix=suffix)
1025
+ self.suffixes[suffix] = path = Path(filename)
1026
+ with open(path, 'wb') as fp:
1027
+ fp.write(self.data)
1028
+ return path
1004
1029
 
1005
1030
 
1006
1031
  class BinaryField(Field):
1007
1032
 
1008
1033
  _default = None
1009
1034
 
1035
+ def _set_file_cache(self, record, data):
1036
+ if isinstance(data, str):
1037
+ data = data.encode('utf-8')
1038
+ file_cache = _FileCache(data)
1039
+ self.set(record, file_cache)
1040
+ return file_cache
1041
+
1010
1042
  def get(self, record):
1011
1043
  result = record.value.get(self.name, self._default)
1012
1044
  if isinstance(result, _FileCache):
1013
1045
  try:
1014
- with open(result.path, 'rb') as fp:
1015
- result = fp.read()
1046
+ result = result.data
1016
1047
  except IOError:
1017
1048
  result = self.get_data(record)
1018
1049
  return result
@@ -1021,13 +1052,7 @@ class BinaryField(Field):
1021
1052
  return self.get(record)
1022
1053
 
1023
1054
  def set_client(self, record, value, force_change=False):
1024
- _, filename = tempfile.mkstemp(prefix='tryton_')
1025
- data = value or b''
1026
- if isinstance(data, str):
1027
- data = data.encode('utf-8')
1028
- with open(filename, 'wb') as fp:
1029
- fp.write(data)
1030
- self.set(record, _FileCache(filename))
1055
+ self._set_file_cache(record, value or b'')
1031
1056
  record.modified_fields.setdefault(self.name)
1032
1057
  record.signal('record-modified')
1033
1058
  self.sig_changed(record)
@@ -1053,15 +1078,20 @@ class BinaryField(Field):
1053
1078
  [record.id], [self.name], context=context)
1054
1079
  except RPCException:
1055
1080
  return b''
1056
- _, filename = tempfile.mkstemp(prefix='tryton_')
1057
- data = values[self.name] or b''
1058
- if isinstance(data, str):
1059
- data = data.encode('utf-8')
1060
- with open(filename, 'wb') as fp:
1061
- fp.write(data)
1062
- self.set(record, _FileCache(filename))
1081
+ self._set_file_cache(record, values[self.name] or b'')
1063
1082
  return self.get(record)
1064
1083
 
1084
+ def get_filename(self, record, suffix=None):
1085
+ data = self.get_data(record)
1086
+ file_cache = record.value.get(self.name)
1087
+ if not isinstance(file_cache, _FileCache):
1088
+ file_cache = self._set_file_cache(record, data)
1089
+ if suffix:
1090
+ filename = file_cache.with_suffix(suffix)
1091
+ else:
1092
+ filename = file_cache.path
1093
+ return filename
1094
+
1065
1095
 
1066
1096
  class DictField(Field):
1067
1097
 
@@ -113,11 +113,10 @@ class Screen(SignalEvent):
113
113
  return child
114
114
 
115
115
  # Remove first level Viewport and ScrolledWindow to fill the Vbox
116
- for widget in [
117
- self.context_screen.screen_container.viewport,
118
- self.context_screen.current_view.widget.get_children()[0],
119
- ]:
120
- remove_bin(widget)
116
+ remove_bin(self.context_screen.screen_container.viewport)
117
+ if self.context_screen.current_view:
118
+ remove_bin(
119
+ self.context_screen.current_view.widget.get_children()[0])
121
120
 
122
121
  self.screen_container.filter_vbox.pack_start(
123
122
  context_widget, expand=False, fill=True, padding=0)
@@ -490,7 +489,8 @@ class Screen(SignalEvent):
490
489
  self.group.destroy()
491
490
 
492
491
  def default_row_activate(self):
493
- if (self.current_view.view_type == 'tree'
492
+ if (self.current_view
493
+ and self.current_view.view_type == 'tree'
494
494
  and int(self.current_view.attributes.get('keyword_open', 0))):
495
495
  return Action.exec_keyword('tree_open', {
496
496
  'model': self.model_name,
@@ -611,7 +611,7 @@ class Screen(SignalEvent):
611
611
 
612
612
  def new(self, default=True, rec_name=None):
613
613
  previous_view = self.current_view
614
- if self.current_view.view_type == 'calendar':
614
+ if self.current_view and self.current_view.view_type == 'calendar':
615
615
  selected_date = self.current_view.get_selected_date()
616
616
  if self.current_view and not self.current_view.editable:
617
617
  self.switch_view('form', display=False)
@@ -664,16 +664,19 @@ class Screen(SignalEvent):
664
664
 
665
665
  def save_current(self):
666
666
  if not self.current_record:
667
- if self.current_view.view_type == 'tree' and len(self.group):
667
+ if (self.current_view
668
+ and self.current_view.view_type == 'tree'
669
+ and len(self.group)):
668
670
  self.current_record = self.group[0]
669
671
  else:
670
672
  return True
671
- self.current_view.set_value()
672
673
  saved = False
673
674
  record_id = None
674
- fields = self.current_view.get_fields()
675
+ if self.current_view:
676
+ self.current_view.set_value()
677
+ fields = self.current_view.get_fields()
675
678
  path = self.current_record.get_path(self.group)
676
- if self.current_view.view_type == 'tree':
679
+ if self.current_view and self.current_view.view_type == 'tree':
677
680
  # False value must be not saved
678
681
  saved = all((
679
682
  x is not False and x >= 0
@@ -683,7 +686,7 @@ class Screen(SignalEvent):
683
686
  record_id = self.current_record.save(force_reload=True)
684
687
  # False value must be not saved
685
688
  saved = record_id is not False and record_id >= 0
686
- else:
689
+ elif self.current_view:
687
690
  self.set_cursor()
688
691
  self.current_view.display()
689
692
  return False
@@ -711,17 +714,19 @@ class Screen(SignalEvent):
711
714
  def get(self):
712
715
  if not self.current_record:
713
716
  return None
714
- self.current_view.set_value()
717
+ if self.current_view:
718
+ self.current_view.set_value()
715
719
  return self.current_record.get()
716
720
 
717
721
  def get_on_change_value(self):
718
722
  if not self.current_record:
719
723
  return None
720
- self.current_view.set_value()
724
+ if self.current_view:
725
+ self.current_view.set_value()
721
726
  return self.current_record.get_on_change_value()
722
727
 
723
728
  def modified(self):
724
- if self.current_view.view_type != 'tree':
729
+ if self.current_view and self.current_view.view_type != 'tree':
725
730
  if self.current_record:
726
731
  if self.current_record.modified or self.current_record.id < 0:
727
732
  return True
@@ -729,7 +734,7 @@ class Screen(SignalEvent):
729
734
  for record in self.group:
730
735
  if record.modified or record.id < 0:
731
736
  return True
732
- if self.current_view.modified:
737
+ if self.current_view and self.current_view.modified:
733
738
  return True
734
739
  return False
735
740
 
@@ -807,6 +812,8 @@ class Screen(SignalEvent):
807
812
 
808
813
  def set_tree_state(self):
809
814
  view = self.current_view
815
+ if not view:
816
+ return
810
817
  if view.view_type not in ('tree', 'form'):
811
818
  return
812
819
  if id(view) in self.tree_states_done:
@@ -909,8 +916,10 @@ class Screen(SignalEvent):
909
916
 
910
917
  def load(self, ids, set_cursor=True, modified=False, position=-1):
911
918
  self.group.load(ids, modified=modified, position=position)
912
- self.current_view.reset()
913
- if ids and self.current_view.view_type != 'calendar':
919
+ if self.current_view:
920
+ self.current_view.reset()
921
+ if (ids and self.current_view
922
+ and self.current_view.view_type != 'calendar'):
914
923
  self.display(ids[0])
915
924
  else:
916
925
  self.current_record = None
@@ -929,7 +938,7 @@ class Screen(SignalEvent):
929
938
  self.current_record = self.group[0]
930
939
  else:
931
940
  self.current_record = None
932
- if self.views:
941
+ if self.views and self.current_view:
933
942
  self.search_active(self.current_view.view_type
934
943
  in ('tree', 'graph', 'calendar'))
935
944
  for view in self.views:
@@ -974,7 +983,8 @@ class Screen(SignalEvent):
974
983
  model = view.treeview.get_model()
975
984
  iter_ = model.get_iter(end)
976
985
  self.current_record = model.get_value(iter_, 0)
977
- elif (view.view_type == 'form'
986
+ elif (view
987
+ and view.view_type == 'form'
978
988
  and self.current_record
979
989
  and self.current_record.group):
980
990
  group = self.current_record.group
@@ -1002,12 +1012,14 @@ class Screen(SignalEvent):
1002
1012
  record = next
1003
1013
  break
1004
1014
  self.current_record = record
1005
- elif (view.view_type == 'list-form' and len(self.group)
1015
+ elif (view
1016
+ and view.view_type == 'list-form'
1017
+ and len(self.group)
1006
1018
  and self.current_record in self.group):
1007
1019
  idx = self.group.index(self.current_record)
1008
1020
  if 0 <= idx < len(self.group) - 1:
1009
1021
  self.current_record = self.group[idx + 1]
1010
- elif view.view_type == 'calendar':
1022
+ elif view and view.view_type == 'calendar':
1011
1023
  record = self.current_record
1012
1024
  goocalendar = view.widgets.get('goocalendar')
1013
1025
  if goocalendar:
@@ -1039,9 +1051,10 @@ class Screen(SignalEvent):
1039
1051
 
1040
1052
  def display_prev(self):
1041
1053
  view = self.current_view
1042
- view.set_value()
1054
+ if view:
1055
+ view.set_value()
1043
1056
  self.set_cursor(reset_view=False)
1044
- if view.view_type == 'tree' and len(self.group):
1057
+ if view and view.view_type == 'tree' and len(self.group):
1045
1058
  range_ = view.treeview.get_visible_range()
1046
1059
  if range_:
1047
1060
  start, end = range_
@@ -1052,7 +1065,8 @@ class Screen(SignalEvent):
1052
1065
  model = view.treeview.get_model()
1053
1066
  iter_ = model.get_iter(start)
1054
1067
  self.current_record = model.get_value(iter_, 0)
1055
- elif (view.view_type == 'form'
1068
+ elif (view
1069
+ and view.view_type == 'form'
1056
1070
  and self.current_record
1057
1071
  and self.current_record.group):
1058
1072
  group = self.current_record.group
@@ -1070,7 +1084,7 @@ class Screen(SignalEvent):
1070
1084
  if parent and record.model_name == parent.model_name:
1071
1085
  record = parent
1072
1086
  self.current_record = record
1073
- elif view.view_type == 'calendar':
1087
+ elif view and view.view_type == 'calendar':
1074
1088
  record = self.current_record
1075
1089
  goocalendar = view.widgets.get('goocalendar')
1076
1090
  if goocalendar:
@@ -1095,7 +1109,9 @@ class Screen(SignalEvent):
1095
1109
  if prev_id >= 0:
1096
1110
  self.current_record = events[prev_id].record
1097
1111
  break
1098
- elif (view.view_type == 'list-form' and len(self.group)
1112
+ elif (view
1113
+ and view.view_type == 'list-form'
1114
+ and len(self.group)
1099
1115
  and self.current_record in self.group):
1100
1116
  idx = self.group.index(self.current_record)
1101
1117
  if 0 < idx <= len(self.group) - 1:
@@ -1103,7 +1119,8 @@ class Screen(SignalEvent):
1103
1119
  else:
1104
1120
  self.current_record = self.group[-1] if len(self.group) else None
1105
1121
  self.set_cursor(reset_view=False)
1106
- view.display()
1122
+ if view:
1123
+ view.display()
1107
1124
 
1108
1125
  def invalid_message(self, record=None):
1109
1126
  if record is None:
@@ -1174,7 +1191,7 @@ class Screen(SignalEvent):
1174
1191
  if not self.selected_records:
1175
1192
  return []
1176
1193
 
1177
- buttons = self.current_view.get_buttons()
1194
+ buttons = self.current_view.get_buttons() if self.current_view else []
1178
1195
 
1179
1196
  for record in self.selected_records:
1180
1197
  buttons = [b for b in buttons if is_active(record, b)]
@@ -1184,8 +1201,9 @@ class Screen(SignalEvent):
1184
1201
 
1185
1202
  def button(self, button):
1186
1203
  'Execute button on the selected records'
1187
- self.current_view.set_value()
1188
- fields = self.current_view.get_fields()
1204
+ if self.current_view:
1205
+ self.current_view.set_value()
1206
+ fields = self.current_view.get_fields()
1189
1207
  for record in self.selected_records:
1190
1208
  domain = record.expr_eval(
1191
1209
  button.get('states', {})).get('pre_validate', [])
@@ -1199,7 +1217,8 @@ class Screen(SignalEvent):
1199
1217
  if button.get('confirm', False) and not sur(button['confirm']):
1200
1218
  return
1201
1219
  if button.get('type', 'class') == 'class':
1202
- if not self.current_record.save(force_reload=False):
1220
+ record_id = self.current_record.save(force_reload=False)
1221
+ if record_id is False or record_id < 0:
1203
1222
  return
1204
1223
  if button.get('type', 'class') == 'class':
1205
1224
  self._button_class(button)
@@ -1266,7 +1285,9 @@ class Screen(SignalEvent):
1266
1285
  elif action.startswith('switch'):
1267
1286
  self.switch_view(*action.split(None, 2)[1:])
1268
1287
  elif action == 'reload':
1269
- if (self.current_view.view_type in ['tree', 'graph', 'calendar']
1288
+ if (self.current_view
1289
+ and self.current_view.view_type in [
1290
+ 'tree', 'graph', 'calendar']
1270
1291
  and not self.parent):
1271
1292
  self.search_filter()
1272
1293
  elif action == 'reload menu':
@@ -1296,7 +1317,7 @@ class Screen(SignalEvent):
1296
1317
  cls=JSONEncoder, separators=(',', ':'))))
1297
1318
  path = [CONFIG['login.db'], 'model', self.model_name]
1298
1319
  view_ids = [v.view_id for v in self.views] + self.view_ids
1299
- if self.current_view.view_type != 'form':
1320
+ if self.current_view and self.current_view.view_type != 'form':
1300
1321
  if self.search_value:
1301
1322
  search_value = self.search_value
1302
1323
  else:
@@ -1308,8 +1329,9 @@ class Screen(SignalEvent):
1308
1329
  separators=(',', ':'))))
1309
1330
  elif self.current_record and self.current_record.id > -1:
1310
1331
  path.append(str(self.current_record.id))
1311
- i = view_ids.index(self.current_view.view_id)
1312
- view_ids = view_ids[i:] + view_ids[:i]
1332
+ if self.current_view:
1333
+ i = view_ids.index(self.current_view.view_id)
1334
+ view_ids = view_ids[i:] + view_ids[:i]
1313
1335
  if view_ids:
1314
1336
  query_string.append(('views', json.dumps(
1315
1337
  view_ids, separators=(',', ':'))))
@@ -65,13 +65,18 @@ class Calendar_(goocalendar.Calendar):
65
65
  self.current_domain_period.get_dates(True)
66
66
  dtstart = self.attrs['dtstart']
67
67
  dtend = self.attrs.get('dtend') or dtstart
68
- domain = ['OR',
69
- ['AND', (dtstart, '>=', first_datetime),
70
- (dtstart, '<', last_datetime)],
71
- ['AND', (dtend, '>=', first_datetime),
72
- (dtend, '<', last_datetime)],
73
- ['AND', (dtstart, '<', first_datetime),
74
- (dtend, '>', last_datetime)]]
68
+ domain = [
69
+ (dtstart, '!=', None),
70
+ (dtend, '!=', None),
71
+ ['OR',
72
+ ['AND', (dtstart, '>=', first_datetime),
73
+ (dtstart, '<', last_datetime)],
74
+ ['AND', (dtend, '>=', first_datetime),
75
+ (dtend, '<', last_datetime)],
76
+ ['AND', (dtstart, '<', first_datetime),
77
+ (dtend, '>', last_datetime)],
78
+ ],
79
+ ]
75
80
  return domain
76
81
 
77
82
  def get_colors(self, record):
@@ -170,10 +170,9 @@ class Password(Char):
170
170
  self.widget.pack_start(
171
171
  self.visibility_checkbox, expand=False, fill=True, padding=0)
172
172
 
173
- def _readonly_set(self, value):
174
- super(Char, self)._readonly_set(value)
175
- self.entry.set_editable(not value)
176
- self.visibility_checkbox.props.visible = not value
177
-
178
173
  def toggle_visibility(self, button):
179
- self.entry.props.visibility = not self.entry.props.visibility
174
+ if self.autocomplete:
175
+ entry = self.entry.get_child()
176
+ else:
177
+ entry = self.entry
178
+ entry.props.visibility = not self.entry.props.visibility
@@ -1,7 +1,6 @@
1
1
  # This file is part of Tryton. The COPYRIGHT file at the top level of
2
2
  # this repository contains the full copyright notices and license terms.
3
3
  from pathlib import Path
4
- from tempfile import NamedTemporaryFile
5
4
 
6
5
  from gi.repository import Gtk, Gdk, GLib
7
6
  try:
@@ -75,17 +74,17 @@ class Document(BinaryMixin, Widget):
75
74
  self.image.hide()
76
75
  if self.evince_view:
77
76
  self.evince_scroll.show()
77
+ suffix = None
78
78
  if self.filename_field:
79
- suffix = self.filename_field.get(self.record)
80
- else:
81
- suffix = None
79
+ filename = self.filename_field.get(self.record)
80
+ if filename:
81
+ suffix = Path(filename).suffix
82
+ filename = Path(self.field.get_filename(self.record, suffix))
82
83
  try:
83
- with NamedTemporaryFile(suffix=suffix) as fp:
84
- fp.write(data)
85
- path = Path(fp.name)
86
- document = (
87
- EvinceDocument.Document.factory_get_document(
88
- path.as_uri()))
84
+ document = (
85
+ EvinceDocument.Document.factory_get_document_full(
86
+ filename.as_uri(),
87
+ EvinceDocument.DocumentLoadFlags.NONE))
89
88
  model = EvinceView.DocumentModel()
90
89
  model.set_document(document)
91
90
  self.evince_view.set_model(model)
@@ -153,7 +153,8 @@ class EditableTreeView(TreeView):
153
153
  for renderer in column.get_cells():
154
154
  if renderer.props.editing:
155
155
  widget = self.view.get_column_widget(column)
156
- self.on_editing_done(widget.editable, renderer)
156
+ editable = widget.get_editable(renderer)
157
+ self.on_editing_done(editable, renderer)
157
158
  return True
158
159
 
159
160
  def on_keypressed(self, entry, event, renderer):
@@ -28,7 +28,8 @@ from tryton.common import data2pixbuf
28
28
  from tryton.common.completion import get_completion, update_completion
29
29
  from tryton.common.selection import (
30
30
  SelectionMixin, PopdownMixin, selection_shortcuts)
31
- from tryton.common.datetime_ import CellRendererDate, CellRendererTime
31
+ from tryton.common.datetime_ import (
32
+ CellRendererDate, CellRendererTime, date_parse)
32
33
  from tryton.common.domain_parser import quote
33
34
  from tryton.config import CONFIG
34
35
 
@@ -358,6 +359,14 @@ class GenericText(Cell):
358
359
  editable.connect('remove-widget', remove)
359
360
  return False
360
361
 
362
+ def get_editable(self, renderer):
363
+ if self.renderer == renderer:
364
+ return self.editable
365
+ for cell in self.prefixes + self.suffixes:
366
+ editable = cell.get_editable(renderer)
367
+ if editable:
368
+ return editable
369
+
361
370
 
362
371
  class Char(GenericText):
363
372
 
@@ -474,6 +483,17 @@ class Date(GenericText):
474
483
  else:
475
484
  return ''
476
485
 
486
+ def value_from_text(self, record, text, callback=None):
487
+ if isinstance(text, str):
488
+ field = record[self.attrs['name']]
489
+ try:
490
+ # Use a datetime instance and rely on field to convert to the
491
+ # proper type
492
+ text = date_parse(text, self.get_format(record, field))
493
+ except (ValueError, OverflowError):
494
+ text = None
495
+ return super().value_from_text(record, text, callback=callback)
496
+
477
497
 
478
498
  class Time(Date):
479
499
 
@@ -68,7 +68,7 @@ class WinForm(NoModal, InfoBar):
68
68
  self.accel_group = Gtk.AccelGroup()
69
69
  self.win.add_accel_group(self.accel_group)
70
70
 
71
- readonly = self.screen.readonly or self.screen.group.readonly
71
+ readonly = self.screen.group.readonly
72
72
 
73
73
  self.but_ok = None
74
74
  self.but_new = None
@@ -355,7 +355,7 @@ class WinForm(NoModal, InfoBar):
355
355
  deletable = True
356
356
  if screen.current_record:
357
357
  deletable = screen.current_record.deletable
358
- readonly = self.screen.readonly or self.screen.group.readonly
358
+ readonly = self.screen.group.readonly
359
359
  if signal_data[0] >= 1:
360
360
  name = str(signal_data[0])
361
361
  if self.domain is not None:
@@ -368,9 +368,11 @@ class WinForm(NoModal, InfoBar):
368
368
  self.but_pre.set_sensitive(True)
369
369
  else:
370
370
  self.but_pre.set_sensitive(False)
371
- if access['delete'] and not readonly and deletable:
372
- self.but_del.set_sensitive(True)
373
- self.but_undel.set_sensitive(True)
371
+ self.but_del.set_sensitive(bool(
372
+ not readonly
373
+ and access['delete']
374
+ and deletable))
375
+ self.but_undel.set_sensitive(bool(not readonly))
374
376
  else:
375
377
  self.but_del.set_sensitive(False)
376
378
  self.but_undel.set_sensitive(False)
@@ -399,7 +401,7 @@ class WinForm(NoModal, InfoBar):
399
401
  cancel_responses = [
400
402
  Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT]
401
403
  self.screen.current_view.set_value()
402
- readonly = self.screen.readonly or self.screen.group.readonly
404
+ readonly = self.screen.group.readonly
403
405
  if (response_id not in cancel_responses
404
406
  and not readonly
405
407
  and self.screen.current_record is not None):
@@ -396,6 +396,8 @@ class WizardDialog(Wizard, NoModal):
396
396
  return True
397
397
 
398
398
  def show(self):
399
+ if not self.screen:
400
+ return
399
401
  view = self.screen.current_view
400
402
  if view.view_type == 'form':
401
403
  expand = False
tryton/jsonrpc.py CHANGED
@@ -130,7 +130,6 @@ class JSONUnmarshaller(object):
130
130
  class Transport(xmlrpc.client.SafeTransport):
131
131
 
132
132
  accept_gzip_encoding = True
133
- encode_threshold = 1400 # common MTU
134
133
 
135
134
  def __init__(
136
135
  self, fingerprints=None, ca_certs=None, session=None):
@@ -233,6 +232,11 @@ class Transport(xmlrpc.client.SafeTransport):
233
232
  self._connection[1].sock.settimeout(DEFAULT_TIMEOUT)
234
233
  return self._connection[1]
235
234
 
235
+ @property
236
+ def encode_threshold(self):
237
+ if self.session:
238
+ return 1400 # common MTU
239
+
236
240
 
237
241
  class ServerProxy(xmlrpc.client.ServerProxy):
238
242
  __id = 0
@@ -24,9 +24,11 @@ def register():
24
24
  imported = set()
25
25
  for path in paths:
26
26
  finder = importlib.machinery.FileFinder(
27
- path, (
28
- importlib.machinery.SourceFileLoader,
29
- importlib.machinery.SOURCE_SUFFIXES))
27
+ path,
28
+ (importlib.machinery.SourceFileLoader,
29
+ importlib.machinery.SOURCE_SUFFIXES),
30
+ (importlib.machinery.SourcelessFileLoader,
31
+ importlib.machinery.BYTECODE_SUFFIXES))
30
32
  for plugin in os.listdir(path):
31
33
  module = os.path.splitext(plugin)[0]
32
34
  if (module.startswith('_') or module in imported):
@@ -18,7 +18,8 @@ if hasattr(sys, 'frozen'):
18
18
  share = os.path.join(prefix, 'share')
19
19
  os.environ['GTK_EXE_PREFIX'] = prefix
20
20
  os.environ['GTK_DATA_PREFIX'] = prefix
21
- os.environ['EV_BACKENDS_DIR'] = prefix
21
+ os.environ['EV_BACKENDS_DIR'] = os.path.join(
22
+ prefix, 'lib', 'evince', '4', 'backends')
22
23
  os.environ['XDG_DATA_DIRS'] = share
23
24
  os.environ['GDK_PIXBUF_MODULE_FILE'] = os.path.join(
24
25
  share, 'gtk-3.0', 'gdk-pixbuf.loaders')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tryton
3
- Version: 6.0.38
3
+ Version: 6.0.40
4
4
  Summary: Tryton desktop client
5
5
  Home-page: http://www.tryton.org/
6
6
  Download-URL: http://downloads.tryton.org/6.0/
@@ -1,11 +1,11 @@
1
- tryton/__init__.py,sha256=KpCuu-gCYVm3kpPUplgb_1CijxwsNFU223-xNDN-XvE,1467
1
+ tryton/__init__.py,sha256=u-7np8n8z86uJDnKOVUE9QtOckyGXliW0LZzHfg8L3s,1467
2
2
  tryton/bus.py,sha256=eoR1nqzmeYL62DXouxpc_X8rHkyt-2ic6c7itwGIC5Y,2829
3
3
  tryton/client.py,sha256=8TWN1MHmIjpYTMtMoMrtcqAVSmmOmFjAR5OnyhnBopQ,2969
4
4
  tryton/config.py,sha256=23zHApZr8tMfgwwv486KOwP4Rs92tltr0YXLQo4Jw6M,6285
5
5
  tryton/device_cookie.py,sha256=NFt6F0y5At4DZKeCKWng5_9DmSIvVE47kiBCWlZsFmU,1879
6
6
  tryton/exceptions.py,sha256=WpmVk0TZM21p4x4b4RcaCdgRLKhFrKnTqaEViBxD_ic,354
7
7
  tryton/fingerprints.py,sha256=hFSbGF7M3jjbXogMpQ5UkHIYCtL9KZ92snoiq53VzWs,1388
8
- tryton/jsonrpc.py,sha256=IjJM8s-03oUs9IAhGHc6sFxo1xa21MFsi8hVMx0vZgU,13358
8
+ tryton/jsonrpc.py,sha256=oWhRAIeFr9mtAHnBMV2vJa_navmN76uISVuMJjaOfPM,13426
9
9
  tryton/pyson.py,sha256=55ACbuUKdpQB22KfWFjntPOavvI50Qyj7lwm4L4f1hc,21539
10
10
  tryton/rpc.py,sha256=0sp7j432GOheaz51IGIJmFZJA461W-0ROqk95pPCIQ8,3892
11
11
  tryton/signal_event.py,sha256=lK4B_8UOAfYGim3r0P-X-CeBnv25pMjx3toKGc_ftUM,1340
@@ -22,9 +22,9 @@ tryton/common/cellrendererfloat.py,sha256=kCzVX_e6plMpZ-gj7z8UWfgbLyLsHwzvGbmGn-
22
22
  tryton/common/cellrendererinteger.py,sha256=ic3RO9G1YycJPUz0LDMDv6TlB0rX-5aa1iocDjdU0pw,1094
23
23
  tryton/common/cellrenderertext.py,sha256=Hr53lVyg_jLQzvIafieo1jKvRlo-V8wCAoH2L80DNNw,881
24
24
  tryton/common/cellrenderertoggle.py,sha256=a4adZY72Q4hpUlCS7ozG21-mYp-QiBWYZVdtYw0f9B8,288
25
- tryton/common/common.py,sha256=YcvwuvoTP6SI32GrAzS-sffmAxqPBh2JJfy8f1G6w4U,42411
25
+ tryton/common/common.py,sha256=SUWWUPAb7JLGeA01ogdcTM4oB5QitVrx1bRGTyqPQa8,42713
26
26
  tryton/common/completion.py,sha256=KGlLm271YnbBB0_l3z9YvNeDHvzkpAQ-DlCDnRlMnzg,2747
27
- tryton/common/datetime_.py,sha256=nfMkA7omaC6P4R6hFN8-uR8v92Mntlgz96Eg4-zdT4E,19858
27
+ tryton/common/datetime_.py,sha256=TIV1PhcdHigBculOPKQttmQxTHko-CwNAQX6B5RemYI,19881
28
28
  tryton/common/domain_inversion.py,sha256=E9oFQlVWb1rDqwS6G59O_YBGmKHWsk60wb_M7ov7kkI,15630
29
29
  tryton/common/domain_parser.py,sha256=71FKqZf5HCIAPrzUBmwUBhgm1AOS5xokaIGC67QW6jY,29140
30
30
  tryton/common/entry_position.py,sha256=lKX3T8day_BQmpKRx7isuj-yieBKUqVmthZsfrtsu4M,281
@@ -39,53 +39,53 @@ tryton/common/timedelta.py,sha256=z3EXjKUzssaYHNFhngUIcc2sVaeNUVp4urQjm3JFJUw,31
39
39
  tryton/common/treeviewcontrol.py,sha256=SBKf-q5emDFI4oaSndtKODPpJO5ciF1BP6RPT3fG4KI,1007
40
40
  tryton/common/underline.py,sha256=cEGiOH27VN0IFIBcV1xFYC1QESHVybd3SzDI5R79-8s,260
41
41
  tryton/common/widget_style.py,sha256=YiS-FnCZm0Kesdw-vx9gWD7QKXMpasoUzHe-UPX2_e0,335
42
- tryton/data/locale/bg/LC_MESSAGES/tryton.mo,sha256=hZ2Ij8ieLbF4Qm2efAW-YgkiOjFhKMRcSEioD7oUXeU,8911
42
+ tryton/data/locale/bg/LC_MESSAGES/tryton.mo,sha256=82Ar63z2yt99_Kaw_BsfZKSGYsA2Bs9gn7G-rHe8EuI,8911
43
43
  tryton/data/locale/bg/LC_MESSAGES/tryton.po,sha256=MfnH-XlvLZmCOd9ohmkF_ZiAeHURmZhF8WiwgZCe3Ow,21477
44
- tryton/data/locale/ca/LC_MESSAGES/tryton.mo,sha256=Hchn5UBPlrsnZmJ8fOvEiVsPs6sdfEEAv27fR8Fz_HM,18889
44
+ tryton/data/locale/ca/LC_MESSAGES/tryton.mo,sha256=as5rhMTjhMsZq-jU6HXdxfYwes2x9IwjK-5ZOQ7jG_Q,18889
45
45
  tryton/data/locale/ca/LC_MESSAGES/tryton.po,sha256=MDE_e8vYM3s_KY43t3UTnu0-ANZfWDGF5NGPu5d-M3I,20095
46
- tryton/data/locale/cs/LC_MESSAGES/tryton.mo,sha256=zpxDetiVPnCzRKYx6JVn0JWtH7gf0VH3G_9dOluuNX8,4684
46
+ tryton/data/locale/cs/LC_MESSAGES/tryton.mo,sha256=M7qWagq-XOeYoFvgP7xVNv1OEkHqGunh483qI5Zb2uk,4684
47
47
  tryton/data/locale/cs/LC_MESSAGES/tryton.po,sha256=dcaO2QMGXGj3ZwajN9XhFeXETWXVUe7fj6_6uCUAIHY,17742
48
- tryton/data/locale/de/LC_MESSAGES/tryton.mo,sha256=RYbVFV8ABSaNaZqykAPl_xjIo669YrsiswOBHcYKPCY,19508
48
+ tryton/data/locale/de/LC_MESSAGES/tryton.mo,sha256=hecdiY6YlI1YPGDEiW42XHlzSXlGYuM6HWfDfYPo5sg,19508
49
49
  tryton/data/locale/de/LC_MESSAGES/tryton.po,sha256=a1qx9wj1bR50TY9o9WdrosyMXjqfWwOjzKrSOg_yRQU,20731
50
- tryton/data/locale/es/LC_MESSAGES/tryton.mo,sha256=u22TEpX25DlZXovCzKdombZFlkexjipG_EwuY_hTP1k,19180
50
+ tryton/data/locale/es/LC_MESSAGES/tryton.mo,sha256=XzWbpdZfRYwBOmpPNzirtKdM71j44PidyPtRTkT47qY,19180
51
51
  tryton/data/locale/es/LC_MESSAGES/tryton.po,sha256=D96SowoRpQrFNrSK4B6KgaTHA_3qqpau7B8WKIhgWsM,20595
52
- tryton/data/locale/es_419/LC_MESSAGES/tryton.mo,sha256=CHSdwTE4FtT5bleFKdbvXmjG4Vii3P2yybJR4sWuN1E,605
52
+ tryton/data/locale/es_419/LC_MESSAGES/tryton.mo,sha256=5QvvRS7cSrZ621rmAbWhcnLGw4Ed7oNIGiAHti-Op_Q,605
53
53
  tryton/data/locale/es_419/LC_MESSAGES/tryton.po,sha256=al4dG3YSGdVYAg3LNIrvdda2riKCzFzxWkToVksEbvE,13627
54
- tryton/data/locale/et/LC_MESSAGES/tryton.mo,sha256=hBJKvaNOdO-weVU674RaqLC66tGKRnZzVEPwhucBFbU,14026
54
+ tryton/data/locale/et/LC_MESSAGES/tryton.mo,sha256=oAIfCRWy0Qq70vNK1fD6XsUn5x9wSpyYsPgn6f3MDAw,14026
55
55
  tryton/data/locale/et/LC_MESSAGES/tryton.po,sha256=BFHkmQ8GNBzgnXiHgZ45uyNP6sEXg8JMnTuafthgGG4,18306
56
- tryton/data/locale/fa/LC_MESSAGES/tryton.mo,sha256=miFNrsvVXcipJ-AnTYjRLRHuUn14YThvwhDIxHKnLPs,17468
56
+ tryton/data/locale/fa/LC_MESSAGES/tryton.mo,sha256=TfTzJb9tO_m2uMymN3btuERhFgs4UpiCp_KyFOfh_3k,17468
57
57
  tryton/data/locale/fa/LC_MESSAGES/tryton.po,sha256=zOu2gUvrANp5emOc3-XzpFXS_9eYD924-7U7eJnXnSk,22303
58
- tryton/data/locale/fi/LC_MESSAGES/tryton.mo,sha256=XTb0ywO9vgmg23pmTmCG7dDGljhibiU5iXpJ8Ex234Y,445
58
+ tryton/data/locale/fi/LC_MESSAGES/tryton.mo,sha256=g1QFLXn1wt6KsD1opXj_0vqCfXZtq_CtCt0OxjRp8NM,445
59
59
  tryton/data/locale/fi/LC_MESSAGES/tryton.po,sha256=Ks_VXKmggigwXgRum0gisP_u62bIuXq079YJm3tYxLk,13486
60
- tryton/data/locale/fr/LC_MESSAGES/tryton.mo,sha256=p-OuScJXjRRKjds0BRZRxRWw5NMiQxE-jlSY0-kgXo8,19557
60
+ tryton/data/locale/fr/LC_MESSAGES/tryton.mo,sha256=6kWXV_zE63V9D5eHhk9sl0d6-3kfR1IrtRj2tVDJvbU,19557
61
61
  tryton/data/locale/fr/LC_MESSAGES/tryton.po,sha256=Twt-D_hIlDC6sqFVuTFPFj-LBCxcT5J_xwznisNZlNs,20718
62
- tryton/data/locale/hu/LC_MESSAGES/tryton.mo,sha256=GjWxbGk6K-2oazcZYGvtF7AlWC2UHg84PwLbYy6WoD4,17539
62
+ tryton/data/locale/hu/LC_MESSAGES/tryton.mo,sha256=8V1zBZ5E30ENfoN6E8FcoREboBmpbBV2mR5zYLgq4og,17539
63
63
  tryton/data/locale/hu/LC_MESSAGES/tryton.po,sha256=eOzM0iHImrLnuSJRZehkzgzNtSOcwTb963YrOtgaaxY,20338
64
- tryton/data/locale/id/LC_MESSAGES/tryton.mo,sha256=2dVqO4F1VGuR-KQPONaf7XLW-I450zWwxKnrPeMFLFk,5754
64
+ tryton/data/locale/id/LC_MESSAGES/tryton.mo,sha256=qe0s7vyZpFP1U6CH2x_k2JFJXvtzHzyabMa4nkKWoVk,5754
65
65
  tryton/data/locale/id/LC_MESSAGES/tryton.po,sha256=qSeWIfnL_ymkMYP0VPQsGAet-fcO-NMGW95cgxYaGU8,14976
66
- tryton/data/locale/it/LC_MESSAGES/tryton.mo,sha256=UeMGjuPdXc9CIEypDethknWOiPWbS9ApLsCaRvOQ12I,15093
66
+ tryton/data/locale/it/LC_MESSAGES/tryton.mo,sha256=coJTjNk3SK6bmAaLOkQDCuQbJIo4VmvU6V36EfVlB60,15093
67
67
  tryton/data/locale/it/LC_MESSAGES/tryton.po,sha256=oIPiBKifgoX2yUKM5490QghDfbVr4gsQRtxGbnAImUA,19260
68
- tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo,sha256=0Ky-znftX5qHVuMKAOFHh6uGMslBZSG2tWfHZvImBNA,7061
68
+ tryton/data/locale/ja_JP/LC_MESSAGES/tryton.mo,sha256=WUVlAF0oy9zzbNgxo7UOVgRulYLLklyCQEKku1xb8kc,7061
69
69
  tryton/data/locale/ja_JP/LC_MESSAGES/tryton.po,sha256=Ku2Rg_pOo3lzBZMzzSB-fsMMI6PGP-Gk6dF9zd8ktqQ,36736
70
- tryton/data/locale/lo/LC_MESSAGES/tryton.mo,sha256=n3AdxsHx9OVVZibJjPOGXrGH3ltbRrszR_PfLVXogRk,19020
70
+ tryton/data/locale/lo/LC_MESSAGES/tryton.mo,sha256=tYRcaLqslezOswFU8FzOMefWclqFz4-RA-J7-0kR-q0,19020
71
71
  tryton/data/locale/lo/LC_MESSAGES/tryton.po,sha256=P6SJ9z5WLjjP4-i1cO2Lejr6v-uupyjwNMp_v2-SmJg,26821
72
- tryton/data/locale/lt/LC_MESSAGES/tryton.mo,sha256=N70FMjvXefUuOvlJS7NRdEgPWw18fSJBpa0W56205GM,17120
72
+ tryton/data/locale/lt/LC_MESSAGES/tryton.mo,sha256=i1_RhzybhaKoF-_loq6d0QqUOcPuqIveSt1CdP17KYE,17120
73
73
  tryton/data/locale/lt/LC_MESSAGES/tryton.po,sha256=LqjP5OElVzY6El32VwIgBrT42WJZWqAyJJCcpEfBRwk,20340
74
- tryton/data/locale/nl/LC_MESSAGES/tryton.mo,sha256=bycnETpQcJM3V7hlaEQ0FjYooE8wPRhgcGJxMf0vQDU,18525
74
+ tryton/data/locale/nl/LC_MESSAGES/tryton.mo,sha256=mnBLXyGyxb9WHDE0_Jc0zM2DPa62TqhDsSGt98r7r3g,18525
75
75
  tryton/data/locale/nl/LC_MESSAGES/tryton.po,sha256=-quSH9RVQuO6_OKQbCUdyPdIcDJxq465F0IyOlLZUyE,19824
76
- tryton/data/locale/pl/LC_MESSAGES/tryton.mo,sha256=DQpdRV15ksiiietp_Z4nFAylKNBDvnZJ-S0cW8H3uEE,18464
76
+ tryton/data/locale/pl/LC_MESSAGES/tryton.mo,sha256=4_ldbwt2cHUEZkV0BBdl3vcFMOQb0UBXsYaB8wP8hSw,18464
77
77
  tryton/data/locale/pl/LC_MESSAGES/tryton.po,sha256=sdYkJiw6uaJOziGY_ViuiZbSLFLh5QTbnulTGVFQ4sI,19704
78
- tryton/data/locale/pt/LC_MESSAGES/tryton.mo,sha256=K8DtRTqbpE7Cw3xS6nWe2A9AYl6cj0ooVHgqFTXUffY,15876
78
+ tryton/data/locale/pt/LC_MESSAGES/tryton.mo,sha256=xaYz5sHh5tEagEo6sByndvP7V6vJGTel1t8kRLuDhFY,15876
79
79
  tryton/data/locale/pt/LC_MESSAGES/tryton.po,sha256=wyAyocsU1tOxtWxZNEwOJnqN5BXHpw2no0etQi5GhNA,19862
80
- tryton/data/locale/ro/LC_MESSAGES/tryton.mo,sha256=cHTGOx1u0kmeUPS3blqaYEzd8GHg_K7uS7KolvDXrCs,19157
80
+ tryton/data/locale/ro/LC_MESSAGES/tryton.mo,sha256=ooWJfk__QgMQZnVnQ5Xbo3sHRNkPhtuX2nvwxi9tcUM,19157
81
81
  tryton/data/locale/ro/LC_MESSAGES/tryton.po,sha256=3wwfLY152NBO9BDUIO2N-NMl6e0R67NzV8SIcwj8WdI,20065
82
- tryton/data/locale/ru/LC_MESSAGES/tryton.mo,sha256=1wCGW1FUyIfWUHnxvghvgaasmZeaczi-QJZuNvY1eT4,10130
82
+ tryton/data/locale/ru/LC_MESSAGES/tryton.mo,sha256=FhWD9s8CQE4ewWyyh-CrZcNM5dYvdlHBJINFxCRawuc,10130
83
83
  tryton/data/locale/ru/LC_MESSAGES/tryton.po,sha256=BUz7OIIc9JFKxv-N3E5bVfiumSxsETopcFmEpZ_fyHI,21808
84
- tryton/data/locale/sl/LC_MESSAGES/tryton.mo,sha256=Fi71Xxj9jTxO_Po_StZm85Q_O0iccPkgbmmGnNVkSi8,12605
84
+ tryton/data/locale/sl/LC_MESSAGES/tryton.mo,sha256=Fso9TyPgZuggoOdExOm-2kKtdTzWxNLIHmJsatt1taA,12605
85
85
  tryton/data/locale/sl/LC_MESSAGES/tryton.po,sha256=sehhqql-gJ6Q47N8jwRh7l3diie9QVff3Ncg2LrboOY,18707
86
- tryton/data/locale/tr/LC_MESSAGES/tryton.mo,sha256=3eO3oVZ_e-EIfZqnRWZqd0Ai6bTdimenS2hOBHfFIyc,1735
86
+ tryton/data/locale/tr/LC_MESSAGES/tryton.mo,sha256=kVTAV3a7TzER67kw37xn9n9QhH_fUouVbVvP0luJe8k,1735
87
87
  tryton/data/locale/tr/LC_MESSAGES/tryton.po,sha256=HlkdjSItw4WsYqstTEBvnSYsLUVQcq1Oq7gFEw5gdcc,14040
88
- tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo,sha256=Ur1ZTd5KiNloZ8hrKVw8UF8lfcrJTfRJ1piuw9elvZ0,17413
88
+ tryton/data/locale/zh_CN/LC_MESSAGES/tryton.mo,sha256=dOZSPZmlIcWSnfXsWLFdpJ-ouHyM4HSTTar7oQexFEY,17413
89
89
  tryton/data/locale/zh_CN/LC_MESSAGES/tryton.po,sha256=HMQLeaVuJSvsRoQLs0yV0dtfMuEFn3ipYX40UEbWttE,18702
90
90
  tryton/data/pixmaps/tryton/tryton-add.svg,sha256=qIk1ewmNjSHqD8vRqCv0kT7v6hbHnY0KNU-M1jrxb4s,185
91
91
  tryton/data/pixmaps/tryton/tryton-archive.svg,sha256=9MO4wyp1SyYh3-FuoIrHhKb-9ywyql2bExsnz0XX9x0,382
@@ -165,21 +165,21 @@ tryton/gui/window/revision.py,sha256=Ct16yKGwtc6FLEaDnY25hLH-qhG3WL7BQmBQenZDjyo
165
165
  tryton/gui/window/tabcontent.py,sha256=qhWFsWHlfGXs7iyFMHlREz8eTJYWnAn-g30do8sGGss,11208
166
166
  tryton/gui/window/win_csv.py,sha256=a8Di5FRBvvyS-A2rtjDId6WXRtVqvhEWRFrkzCP1jI8,13599
167
167
  tryton/gui/window/win_export.py,sha256=SH0Osu3KasVuAk0GgbASe8tyoBtONJcKpJnr1W_pIwE,20538
168
- tryton/gui/window/win_form.py,sha256=s5rA80uGZO8wCIlQzRP11HnNYXyjpAJwXwtB_VVoALU,19633
168
+ tryton/gui/window/win_form.py,sha256=SPFBTuVJmvQQ-tJARa8pjLeeGCEPotbtPuRRsg6lyAc,19613
169
169
  tryton/gui/window/win_import.py,sha256=jJ16MFXn4_nlDCbdRkv5lDfDRFQqCtWT_iNwotuGk7A,8975
170
170
  tryton/gui/window/win_search.py,sha256=LbAXNBDXflJKscuEqO_MdvHl4ZcZ7I9_XoIoe5MQ5mg,5975
171
171
  tryton/gui/window/window.py,sha256=u5upFYD37hSPGJLsAI_gOJs9kAtQBEMb2HWIRjuBmOs,1735
172
- tryton/gui/window/wizard.py,sha256=m5uIgJV4lG-fmbDEOdhgPdDuV72pN3cIrTNgWscDv4w,14770
172
+ tryton/gui/window/wizard.py,sha256=OPUsbXEpw19Y4Ot5FHRpzE5-kOTp2b9X8AQSayJa0SI,14817
173
173
  tryton/gui/window/view_board/__init__.py,sha256=JtgcMnloYRl68R56JrV31Y3T7bzN2AyO0tXxRr__t68,201
174
174
  tryton/gui/window/view_board/action.py,sha256=7g7g9IXhnzwfjnFJ83tdrV39B827YfmOI9WuuZXzI-Q,5686
175
175
  tryton/gui/window/view_board/view_board.py,sha256=3zEw1kfevVoL8LwRZH166RiDZwNxzHV76MmzdId5sjQ,1925
176
176
  tryton/gui/window/view_form/__init__.py,sha256=KpO5XlSYKEB3rxVNiloUx1I9xYQr_VEGw-D915kX_Ho,185
177
177
  tryton/gui/window/view_form/model/__init__.py,sha256=-5OdjQ8rEVZvZALCT9wzhMNZf0ryRVaqgbkVmHOqmqE,144
178
- tryton/gui/window/view_form/model/field.py,sha256=CpeXzXvmiMBXgyFlUxdFv6W_EZeMktt-xv_FCa5D53E,42314
178
+ tryton/gui/window/view_form/model/field.py,sha256=nvwfvTOJwH6BL_Fk3zG-A0o7HAll5YhEqsc8dGr9LDo,43202
179
179
  tryton/gui/window/view_form/model/group.py,sha256=LBHQB5O-nNIPqW6JXjIErjGryyf3cZWqeEqtpQ_JzK8,19033
180
180
  tryton/gui/window/view_form/model/record.py,sha256=1cB1apUHQ1gaKfo7R9bQb_8RknptOxWIobz5fsE_O4I,24349
181
181
  tryton/gui/window/view_form/screen/__init__.py,sha256=ws2wA8SsyQoZDbIjDpQF9-zP-BiLgVQyUSDVq8pvovo,191
182
- tryton/gui/window/view_form/screen/screen.py,sha256=NdVIPTY28YWHGC5tPk4GNX32RNEtJ6lbYsNCiPfb6DI,52435
182
+ tryton/gui/window/view_form/screen/screen.py,sha256=PhlpmJrAlNTIMqSPFb2Xjv4L7CfH9HjlqBOl5iKmqZY,53334
183
183
  tryton/gui/window/view_form/view/__init__.py,sha256=au9iaJC_1fa1iJhlj29cm5D_TI7KEiWDPhmuLIsDDjA,4343
184
184
  tryton/gui/window/view_form/view/calendar_.py,sha256=itsRvjh51ZLBW_ZCOcTBNm9sULIwlZjtQQkW1l4uzGs,5558
185
185
  tryton/gui/window/view_form/view/form.py,sha256=GR1BwrwNRLnwa8A5CtX3IPsA9wKpJD6KQydPmVUJ4OA,21292
@@ -188,16 +188,16 @@ tryton/gui/window/view_form/view/list.py,sha256=h3Kg_iltiL5fkIJ-7S10Nw-X-mDmVYbA
188
188
  tryton/gui/window/view_form/view/list_form.py,sha256=Pl70c2WDI-lhh3VR8EQfo2lmmqzJITw3zl94K7MnnMs,4915
189
189
  tryton/gui/window/view_form/view/screen_container.py,sha256=4_wd7Q27AhS1VSHCBc0Gqc_YEoogFrycE_p52vXZJPs,25811
190
190
  tryton/gui/window/view_form/view/calendar_gtk/__init__.py,sha256=-5OdjQ8rEVZvZALCT9wzhMNZf0ryRVaqgbkVmHOqmqE,144
191
- tryton/gui/window/view_form/view/calendar_gtk/calendar_.py,sha256=wlu1ZuDzdBnT_vKiepS79b446t42rxLTh9hsCryqozE,5609
191
+ tryton/gui/window/view_form/view/calendar_gtk/calendar_.py,sha256=B3lhcjq-rIy1H1TZkBFc46_-cMwQ41iCfVSD_DfsgmY,5748
192
192
  tryton/gui/window/view_form/view/calendar_gtk/dates_period.py,sha256=eSIs_Xb3SV65UUqchI2sh6ODfUFC0FyGYsxhWWD1p84,926
193
193
  tryton/gui/window/view_form/view/calendar_gtk/toolbar.py,sha256=wUAhBwX2Q4s33jOT8zrpJrU0qrLEdluiiwUCtKHU2O4,9795
194
194
  tryton/gui/window/view_form/view/form_gtk/__init__.py,sha256=-5OdjQ8rEVZvZALCT9wzhMNZf0ryRVaqgbkVmHOqmqE,144
195
195
  tryton/gui/window/view_form/view/form_gtk/binary.py,sha256=YNtGeyjgc1DhVoqSMwbzq75W9yOvtgpZB9pLR2itCP0,8370
196
196
  tryton/gui/window/view_form/view/form_gtk/calendar_.py,sha256=IxBnOQl01B1LuDk6bAjl1zh2XkmLrWsj31yNbH8RECE,5851
197
- tryton/gui/window/view_form/view/form_gtk/char.py,sha256=N02vw6KCuyoQ8BtiO4ShPcOtc-h-XH2zch7sGNWfoUQ,6597
197
+ tryton/gui/window/view_form/view/form_gtk/char.py,sha256=wZS8KZ2NEFvqtM23DjcNS42vqPuKd8MqZJyYe_yeRZI,6524
198
198
  tryton/gui/window/view_form/view/form_gtk/checkbox.py,sha256=FEVsM3zTX1-SpHLK7Hr0IF0dW8B_nVkL8SX9KabZZgs,1229
199
199
  tryton/gui/window/view_form/view/form_gtk/dictionary.py,sha256=KK2ZJqtkKNdVquz2waHR2LPw1X1WRLfIxdJAhJScVYI,21997
200
- tryton/gui/window/view_form/view/form_gtk/document.py,sha256=nSWRkcswvWfII8UTylw0A9HZeqqS7fr8RlGbzW9Kvig,3339
200
+ tryton/gui/window/view_form/view/form_gtk/document.py,sha256=jwFWTs3jNCIyJHXv1QCecEF7v9cDmDrhq5zr0dw1x-w,3355
201
201
  tryton/gui/window/view_form/view/form_gtk/float.py,sha256=ETwiBSGp2ETz18s_Pvd0Pszh0UStzp9Q8TyLyO2gFic,708
202
202
  tryton/gui/window/view_form/view/form_gtk/image.py,sha256=CYCw_ELRQx40Hxv05ahP_MQ5rWWH3-r04_ugSrync6Y,3879
203
203
  tryton/gui/window/view_form/view/form_gtk/integer.py,sha256=ULl-k57Qe9e12eH_IcqqKYLVlcZXynyr-tl0Ozsg7oQ,2911
@@ -222,17 +222,17 @@ tryton/gui/window/view_form/view/graph_gtk/graph.py,sha256=JQUnap7zKitXSUlS8ZD88
222
222
  tryton/gui/window/view_form/view/graph_gtk/line.py,sha256=RrpMhcvwWPjJO12BobK1oqzFRzhLhPrtJGzl71AE4xg,10358
223
223
  tryton/gui/window/view_form/view/graph_gtk/pie.py,sha256=xPm5rA7rB9EsukS2AbwLXlUl433TfT_OL6_xxP5HtH8,7240
224
224
  tryton/gui/window/view_form/view/list_gtk/__init__.py,sha256=-5OdjQ8rEVZvZALCT9wzhMNZf0ryRVaqgbkVmHOqmqE,144
225
- tryton/gui/window/view_form/view/list_gtk/editabletree.py,sha256=ABHuE9zoH9S1WROi6isM1lpZIu9hKTdFdpjVUIyCYUw,13320
226
- tryton/gui/window/view_form/view/list_gtk/widget.py,sha256=PbTHJPYT0Lekr-f1fCWt6KjDdbUAZaYAiCFT_6PkD0s,47193
227
- tryton/plugins/__init__.py,sha256=0PydsuWmOwU3El1g7EHG1PsrpOL0YQacSMMIwIjDSXw,1343
225
+ tryton/gui/window/view_form/view/list_gtk/editabletree.py,sha256=ZXDUcXLhc3Ggj6zfo_vWzv3eVIOAxLfPDWiTiXAUgQA,13370
226
+ tryton/gui/window/view_form/view/list_gtk/widget.py,sha256=jEOppk86kAI58EkhTyD_Qoh1Rhqz6N1sW9HN7TUpDRg,47968
227
+ tryton/plugins/__init__.py,sha256=LZAzEyRzXXJr1vTKMGh_1Qb922PR1SF4CqSZpXFJESo,1449
228
228
  tryton/plugins/translation/__init__.py,sha256=hyGVzFjh9t3UIU9LrdXVBNJ1UueqPv4QeWK1jmgjbEM,697
229
229
  tryton/tests/__init__.py,sha256=EzbzLAe2ypdgf1obs2Njs6VK_fFkd16EkfFyZDAFFbg,892
230
230
  tryton/tests/test_common_domain_parser.py,sha256=PG2fUTUdMrFZUFC3YzKJ5DWAFSduJE4GTiS8XbuKACA,43252
231
231
  tryton/tests/test_common_selection.py,sha256=1vvP7qfgCaqBhgADqbcCOI5ChXZghKSr7kzP99CGqtA,649
232
232
  tryton/tests/test_common_timedelta.py,sha256=RsofEhRRKI_EZFzR3lb4LNJ8NxcI9IufpcijPhU-XnU,3538
233
- tryton-6.0.38.data/scripts/tryton,sha256=vDXb3V6aWareETTNBZqeTt8vSQYtT7cArmq2k6o5G-8,1998
234
- tryton-6.0.38.dist-info/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
235
- tryton-6.0.38.dist-info/METADATA,sha256=2nG5DtCaL2lhMrxMfuqPB7m7RT-aFp7g9FtSYQo-jnE,2381
236
- tryton-6.0.38.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
237
- tryton-6.0.38.dist-info/top_level.txt,sha256=7l30wN15bNakY7BPm2TEO79_XxvmYpkJONTGR_dTTOU,7
238
- tryton-6.0.38.dist-info/RECORD,,
233
+ tryton-6.0.40.data/scripts/tryton,sha256=fQmQ1-ILiMOBXwmx8VQ60WmjzQk-eJd5KL1V9fPoIJo,2055
234
+ tryton-6.0.40.dist-info/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
235
+ tryton-6.0.40.dist-info/METADATA,sha256=U8j81iKDqKqj8owTDtHDR7GIcc-CqY5plFES5PRQYA8,2381
236
+ tryton-6.0.40.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
237
+ tryton-6.0.40.dist-info/top_level.txt,sha256=7l30wN15bNakY7BPm2TEO79_XxvmYpkJONTGR_dTTOU,7
238
+ tryton-6.0.40.dist-info/RECORD,,