lino 25.7.2__py3-none-any.whl → 25.8.0__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.
Files changed (43) hide show
  1. lino/__init__.py +1 -1
  2. lino/api/doctest.py +28 -2
  3. lino/core/actions.py +12 -1
  4. lino/core/atomizer.py +9 -8
  5. lino/core/auth/utils.py +9 -1
  6. lino/core/callbacks.py +2 -2
  7. lino/core/dbtables.py +4 -1
  8. lino/core/fields.py +0 -1
  9. lino/core/kernel.py +9 -19
  10. lino/core/model.py +11 -3
  11. lino/core/site.py +10 -14
  12. lino/core/store.py +3 -3
  13. lino/core/utils.py +14 -13
  14. lino/help_texts.py +9 -7
  15. lino/management/commands/ddt.py +60 -0
  16. lino/management/commands/dump2py.py +13 -25
  17. lino/management/commands/prep.py +1 -1
  18. lino/mixins/__init__.py +3 -2
  19. lino/mixins/{duplicable.py → clonable.py} +45 -50
  20. lino/mixins/dupable.py +2 -2
  21. lino/mixins/registrable.py +3 -3
  22. lino/mixins/sequenced.py +12 -14
  23. lino/modlib/comments/mixins.py +5 -6
  24. lino/modlib/comments/models.py +14 -12
  25. lino/modlib/comments/ui.py +0 -1
  26. lino/modlib/dupable/models.py +2 -2
  27. lino/modlib/memo/mixins.py +2 -0
  28. lino/modlib/notify/api.py +5 -0
  29. lino/modlib/printing/mixins.py +2 -2
  30. lino/modlib/publisher/models.py +15 -8
  31. lino/modlib/summaries/mixins.py +6 -4
  32. lino/modlib/users/actions.py +5 -0
  33. lino/sphinxcontrib/__init__.py +1 -1
  34. lino/sphinxcontrib/actordoc.py +1 -1
  35. lino/utils/cycler.py +6 -3
  36. lino/utils/diag.py +2 -2
  37. lino/utils/dpy.py +70 -59
  38. lino/utils/instantiator.py +21 -1
  39. {lino-25.7.2.dist-info → lino-25.8.0.dist-info}/METADATA +1 -1
  40. {lino-25.7.2.dist-info → lino-25.8.0.dist-info}/RECORD +43 -42
  41. {lino-25.7.2.dist-info → lino-25.8.0.dist-info}/WHEEL +0 -0
  42. {lino-25.7.2.dist-info → lino-25.8.0.dist-info}/licenses/AUTHORS.rst +0 -0
  43. {lino-25.7.2.dist-info → lino-25.8.0.dist-info}/licenses/COPYING +0 -0
lino/utils/dpy.py CHANGED
@@ -6,30 +6,27 @@ Defines Lino's **Python serializer and deserializer**. See
6
6
  :doc:`Specification </specs/dpy>`.
7
7
  """
8
8
 
9
- from lino import logger
10
- from packaging.version import Version
11
-
9
+ # import traceback
12
10
  import os
13
11
  import importlib.util
14
12
  import sys
15
- from unipath import Path
13
+ from packaging.version import Version
14
+ from pathlib import Path
16
15
  # from lino import AFTER17
17
-
18
16
  from django.conf import settings
19
17
  from django.db import models
20
-
21
18
  from django.utils import translation
22
19
  from django.utils.module_loading import import_string
23
20
  from django.utils.encoding import force_str
24
-
25
21
  # from django.db import IntegrityError
26
22
  from django.core.serializers import base
27
23
  from django.core.exceptions import ValidationError
28
24
  # from django.core.exceptions import ObjectDoesNotExist
29
-
30
25
  # from lino.utils.mldbc.fields import BabelCharField, BabelTextField
31
26
  # from lino.core.choicelists import ChoiceListField
32
27
  from lino.core.utils import obj2str, full_model_name
28
+ from lino.core.fields import VirtualField
29
+ from lino import logger
33
30
 
34
31
  SUFFIX = ".py"
35
32
 
@@ -118,7 +115,7 @@ if SUPPORT_EMPTY_FIXTURES:
118
115
  class FakeDeserializedObject(base.DeserializedObject):
119
116
  """Imitates DeserializedObject required by loaddata.
120
117
 
121
- Unlike normal DeserializedObject, we *don't want* to bypass
118
+ Unlike normal DeserializedObject, we do *not* want to bypass
122
119
  pre_save and validation methods on the individual objects.
123
120
 
124
121
  """
@@ -126,7 +123,6 @@ class FakeDeserializedObject(base.DeserializedObject):
126
123
  def __init__(self, deserializer, object, **kw):
127
124
  super().__init__(object, deserializer, **kw)
128
125
  self.object = object
129
- # self.name = name
130
126
  self.deserializer = deserializer
131
127
 
132
128
  def save(self, *args, **kw):
@@ -134,16 +130,9 @@ class FakeDeserializedObject(base.DeserializedObject):
134
130
  # logger.info("Loading %s...",self.name)
135
131
 
136
132
  self.try_save(*args, **kw)
137
- # if self.try_save(*args,**kw):
138
- # self.deserializer.saved += 1
139
- # else:
140
- # self.deserializer.save_later.append(self)
141
133
 
142
134
  def try_save(self, *args, **kw):
143
- """Try to save the specified Model instance `obj`. Return `True`
144
- on success, `False` if this instance wasn't saved and should be
145
- deferred.
146
- """
135
+ """Try to save this Model instance."""
147
136
  obj = self.object
148
137
  try:
149
138
  m = getattr(obj, "before_dumpy_save", None)
@@ -152,39 +141,56 @@ class FakeDeserializedObject(base.DeserializedObject):
152
141
  if not self.deserializer.quick:
153
142
  try:
154
143
  obj.full_clean()
155
- except ValidationError as e:
144
+ except ValidationError:
156
145
  # raise Exception("{0} : {1}".format(obj2str(obj), e))
157
146
  raise # Exception("{0} : {1}".format(obj2str(obj), e))
158
147
  obj.save(*args, **kw)
159
- logger.debug("%s has been saved" % obj2str(obj))
148
+ logger.debug("%s has been saved", obj2str(obj))
160
149
  self.deserializer.register_success()
161
- return True
162
- # except ValidationError,e:
163
- # except ObjectDoesNotExist,e:
164
- # except (ValidationError,ObjectDoesNotExist), e:
165
- # except (ValidationError,ObjectDoesNotExist,IntegrityError), e:
166
150
  except Exception as e:
167
- if True:
168
- if not settings.SITE.loading_from_dump:
169
- # hand-written fixtures are expected to yield in savable
170
- # order
171
- logger.warning(
172
- "Failed to save %s from manual fixture:" % obj2str(obj)
173
- )
174
- raise
151
+ if not settings.SITE.loading_from_dump:
152
+ # hand-written fixtures are expected to yield in savable order
153
+ logger.warning(
154
+ "Failed to save %s from manual fixture:", obj2str(obj))
155
+ raise
175
156
  deps = [
176
- f.remote_field.model
177
- for f in obj._meta.fields
178
- if f.remote_field and f.remote_field.model
179
- ]
157
+ f for f in obj._meta.fields
158
+ if f.remote_field and f.remote_field.model]
180
159
  if not deps:
181
- logger.exception(e)
182
- raise Exception("Failed to save independent %s." % obj2str(obj))
160
+ # logger.exception(e)
161
+ msg = f"Failed to save independent {obj2str(obj)}."
162
+ raise Exception(msg) from e
163
+ self.on_restore_failure(obj)
183
164
  self.deserializer.register_failure(self, e)
184
- return False
185
- # except Exception,e:
186
- # logger.exception(e)
187
- # raise Exception("Failed to save %s. Abandoned." % obj2str(obj))
165
+
166
+ def on_restore_failure(self, obj):
167
+ # When a database row fails to save during restore.py, Lino looks
168
+ # whether it has nullable FK fields that aren't null, set these to None
169
+ # and try to save an intermediate row.
170
+
171
+ nullable = dict()
172
+ # required = dict()
173
+ for f in obj._meta.fields:
174
+ if f.remote_field and f.remote_field.model:
175
+ if f.null and (v := f.value_from_object(obj)) is not None:
176
+ nullable[f] = v
177
+ if not (nullable):
178
+ return
179
+ for f in nullable.keys():
180
+ setattr(obj, f.attname, None)
181
+ # f.set_value_in_object(obj, None)
182
+ try:
183
+ obj.full_clean()
184
+ obj.save()
185
+ except Exception:
186
+ pass
187
+ for f, v in nullable.items():
188
+ setattr(obj, f.attname, v)
189
+ # f.set_value_in_object(obj, v)
190
+ logger.info(
191
+ "Save intermediate %s without %s",
192
+ obj.__class__.__name__,
193
+ ", ".join([f"{f.name}={v}" for f, v in nullable.items()]))
188
194
 
189
195
 
190
196
  class Serializer(base.Serializer):
@@ -205,7 +211,7 @@ class Serializer(base.Serializer):
205
211
  raise NotImplementedError("Don't use dumpdata but `dump2py`")
206
212
 
207
213
 
208
- class FlushDeferredObjects(object):
214
+ class FlushDeferredObjects:
209
215
  """
210
216
  Indicator class object.
211
217
  Fixture may yield a `FlushDeferredObjects`
@@ -215,10 +221,11 @@ class FlushDeferredObjects(object):
215
221
  pass
216
222
 
217
223
 
218
- class LoaderBase(object):
224
+ class LoaderBase:
219
225
  quick = False
220
226
  source_version = None
221
- max_deferred_objects = 1000
227
+ max_deferred_objects = 4000
228
+ strict = False
222
229
 
223
230
  def __init__(self):
224
231
  # logger.info("20120225 DpyLoader.__init__()")
@@ -282,13 +289,13 @@ class LoaderBase(object):
282
289
  self.flush_deferred_objects()
283
290
  if count > self.max_deferred_objects + 1:
284
291
  raise Exception(
285
- "More than {} deferred objects".format(self.max_deferred_objects)
286
- )
292
+ f"More than {self.max_deferred_objects} deferred objects")
287
293
  l.append(obj)
288
294
  # report a full traceback, but only once per model and
289
295
  # exception type:
290
296
  k = (obj.object.__class__, e.__class__)
291
297
  if k not in self.reported_tracebacks:
298
+ # traceback.print_exc(e)
292
299
  logger.exception(e)
293
300
  self.reported_tracebacks.add(k)
294
301
 
@@ -333,14 +340,17 @@ class LoaderBase(object):
333
340
  ", ".join([str(o.object.pk) for o in objects]),
334
341
  )
335
342
  count += len(objects)
336
- msg = "Abandoning with {} unsaved instances:{}"
337
- logger.warning(msg.format(count, s))
338
-
339
- # Don't raise an exception. The unsaved instances got lost and
340
- # the loaddata should be done again, but meanwhile the database
341
- # is not necessarily invalid and may be used for further testing.
342
- # And anyway, loaddata would catch it and still continue.
343
- # raise Exception(msg)
343
+ msg = f"Abandoning with {count} unsaved instances:{s}"
344
+ if self.strict:
345
+ raise Exception(msg)
346
+ logger.warning(msg)
347
+
348
+ # Until 20250730: Don't raise an exception. The unsaved instances
349
+ # got lost and the loaddata should be done again, but meanwhile the
350
+ # database is not necessarily invalid and may be used for further
351
+ # testing. And anyway, loaddata would catch it and still continue.
352
+ # Since 20250730: But we need a way to make sure that the restore.py
353
+ # worked well.
344
354
 
345
355
  settings.SITE.loading_from_dump = False
346
356
  # reset to False because the same SITE might get reused by
@@ -350,11 +360,12 @@ class LoaderBase(object):
350
360
  class DpyLoader(LoaderBase):
351
361
  """Instantiated by :xfile:`restore.py`."""
352
362
 
353
- def __init__(self, globals_dict, quick=None):
363
+ def __init__(self, globals_dict, quick=None, strict=True):
354
364
  if quick is not None:
355
365
  self.quick = quick
356
366
  self.globals_dict = globals_dict
357
- super(DpyLoader, self).__init__()
367
+ self.strict = strict
368
+ super().__init__()
358
369
  self.source_version = globals_dict["SOURCE_VERSION"]
359
370
  site = globals_dict["settings"].SITE
360
371
  site.startup()
@@ -369,7 +380,7 @@ class DpyDeserializer(LoaderBase):
369
380
  """The Django deserializer for :ref:`dpy`.
370
381
 
371
382
  Note that this deserializer explicitly ignores fixtures whose
372
- source file is located in the current directory because i the case
383
+ source file is located in the current directory because in the case
373
384
  of `.py` files this can lead to side effects when importing them.
374
385
  See e.g. :ticket:`1029`. We consider it an odd behaviour of
375
386
  Django to search for fixtures also in the current directory (and
@@ -215,13 +215,33 @@ def create_and_get(model, **kw):
215
215
  def make_if_needed(model, **values):
216
216
  qs = model.objects.filter(**values)
217
217
  if qs.count() == 1:
218
- pass # ok, nothing to do
218
+ return qs.first()
219
+ # pass # ok, nothing to do
219
220
  elif qs.count() == 0:
220
221
  return model(**values)
221
222
  else:
222
223
  raise Exception(f"Multiple {model._meta.verbose_name_plural} for {values}")
223
224
 
224
225
 
226
+ def get_or_create(model, **kwargs):
227
+ # similar to Djanop's QuerySet.get_or_create() but calls full_clean
228
+ try:
229
+ obj = model.objects.get(**kwargs)
230
+ except model.DoesNotExist:
231
+ obj = model(**kwargs)
232
+ obj.full_clean()
233
+ obj.save()
234
+ return obj
235
+
236
+
237
+ def update_or_create(m, **kwargs):
238
+ if (obj := m.objects.filter(id=kwargs['id']).first()) is not None:
239
+ for k, v in kwargs.items():
240
+ setattr(obj, k, v)
241
+ return obj
242
+ return m(**kwargs)
243
+
244
+
225
245
  def _test():
226
246
  import doctest
227
247
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lino
3
- Version: 25.7.2
3
+ Version: 25.8.0
4
4
  Summary: A framework for writing desktop-like web applications using Django and ExtJS or React
5
5
  Project-URL: Homepage, https://www.lino-framework.org
6
6
  Project-URL: Repository, https://gitlab.com/lino-framework/lino
@@ -1,14 +1,14 @@
1
1
  lino/.cvsignore,sha256=1vrrWoP-WD8hPfCszHHIiJEi8KUMRCt5WvoKB9TSB1k,28
2
2
  lino/SciTEDirectory.properties,sha256=rCYi_e-6h8Yx5DwXhAa6MBPlVINcl6Vv9BQDYZV2_go,28
3
- lino/__init__.py,sha256=odCk-YexuT5Jr0q8uV4WtTzrvQX1tAWdIVO-yZuaEYo,6176
3
+ lino/__init__.py,sha256=3LpwRlkMk6xt6IDAzhjZGE8PgM2L4Ypq6yP6kuhqqJs,6176
4
4
  lino/ad.py,sha256=AQ-vJ4scac1mx3xegXezxnxyOQpV-a0q3VFMJSDbj2s,142
5
5
  lino/apps.py,sha256=ECq-dPARDkuhngwNrcipse3b4Irj70HxJs44uWEZFc4,27
6
6
  lino/hello.py,sha256=7-PJg7PnEiznyETqGjOwXcKh8rda0qLetpbS2gvRYy0,532
7
- lino/help_texts.py,sha256=i-Dm3syEE7R8AZy50L5oIyG2VKXoifvLHeCwMTNJceI,92136
7
+ lino/help_texts.py,sha256=RPw9EDHoQD7foqFTXNC8gWlnaWPqTZJQYgBTzNtDqIg,92385
8
8
  lino/api/__init__.py,sha256=WmzHU-rHdZ68se_nI0SmepQTGE8-cd9tPpovHRH9aag,512
9
9
  lino/api/ad.py,sha256=F6SrcKPRRalHKOZ7QLwsRWGq9hhykQIeo0b85cEk9NQ,314
10
10
  lino/api/dd.py,sha256=w-5qIpWdXu5yXyCC4Qh4ApB3yZTn0AwdxAjEhH8PyVE,7510
11
- lino/api/doctest.py,sha256=xyVvEuW8udXaCa699rgD_25kLWKlFejxlbuwwqzM1mQ,25244
11
+ lino/api/doctest.py,sha256=XPcuBVeBQyjsR789G9nIhgGzXKSNAq0MJIstPlhuQdU,26119
12
12
  lino/api/rt.py,sha256=OCYWhrWnMcL988MdvBLBEP8qKQJEGXQhVoam_X0sotU,1376
13
13
  lino/api/selenium.py,sha256=bOu8UaNz3Q7lGVvxjmvrtYtSWn1xfI1f5MN5sVcdYr8,9383
14
14
  lino/api/shell.py,sha256=epyjwEZ396TiJ0AHqhVIvzX8TBIXU8xR4UHJlYOrRhc,536
@@ -28,45 +28,45 @@ lino/config/unused/403.html,sha256=ePwDIUXhz1iD8xXWWyt5xEvpcGIHU4LMnXma8x0ik1c,2
28
28
  lino/config/unused/404.html,sha256=GOJrAyF6NcM69ETdSHgjff_-lvYs_-bOYhyZBem7x3I,220
29
29
  lino/config/unused/500.html,sha256=aWmP37uPoMS-PJgPuBloxdx0nEreU7AvkXxsex3yVYs,544
30
30
  lino/core/__init__.py,sha256=I4X69XK6Y1MZ8X6tC13Wmg13C3r5iTfYcFDiPJKpUdw,726
31
- lino/core/actions.py,sha256=3lJTiTQKEArzPr-MhuPF70IlpZgPmOZBBNQncLwfOZQ,32370
31
+ lino/core/actions.py,sha256=0ebutR3pIMXa7cNpoVJlyt6TueWrfJNNygvQL7XkOgQ,32659
32
32
  lino/core/actors.py,sha256=hbbzTpP7iBjQ2Eup4JhV5zx8w64arqPpkv4RnCptyKY,72585
33
- lino/core/atomizer.py,sha256=T2hrXJoGRy_mYfYT4fILcicpNZ1v-wMw8iF7Zqq-tNQ,13401
33
+ lino/core/atomizer.py,sha256=yK_l9-g8RZIjy2_iBB_efpyO1CrvegCBbjobD5mTTVc,13476
34
34
  lino/core/boundaction.py,sha256=06NNPjCesEr-R1YQKkiuy8JKzDrMJJ948x9jczOkZqY,7850
35
- lino/core/callbacks.py,sha256=uu1-znzxVDD-JETUebw-hYsNg_9ExQb1vfwbc7Psjro,7549
35
+ lino/core/callbacks.py,sha256=45lg153pzY7w94XLvh7QqHH7qOH5yTxLyRH7Vn_l1Ec,7549
36
36
  lino/core/choicelists.py,sha256=5Xu3M5ZVOis2JoNSuNiJGBHdkqCwLofUxSd19iLIlKs,36503
37
37
  lino/core/classproperty.py,sha256=_E95WPAs7BWbAuFpPvoYM2ZwW_mbq3rvF7o43WsMq_8,4316
38
38
  lino/core/constants.py,sha256=GwSyViDk3wClZzgbrCo6N-JYOa3LCP46FSof-iZ5RRU,5085
39
39
  lino/core/dashboard.py,sha256=kKUoZ1P6He0By3qUOkNIPAVF1zPkXxGFgHsCOdQ8syM,6672
40
- lino/core/dbtables.py,sha256=AqH7OGnXiup7avmFU-GQubXqVYW338tu43D5X9BCyFE,29127
40
+ lino/core/dbtables.py,sha256=b3D7gNaLpNvRgiFmOcfIwnW14Z4eCT0nWaPE8OjziOU,29258
41
41
  lino/core/dbutils.py,sha256=_QHcWd-ajLUwt5G8uOp8d47lZQKD3VseHnqKJke18rA,263
42
42
  lino/core/ddh.py,sha256=dYScxWKTOCDEgow7wJNJe812ESasmmITPK2ovraBQno,3172
43
43
  lino/core/diff.py,sha256=XQ-oQQDS_v3kXd4eRP9Hwr5UCgp-TPZIPVav9ZblUno,5882
44
44
  lino/core/elems.py,sha256=vGAqGwWkNUG9mtQkeu-EOlqPpOHyvnI6uhHn9ivsNdw,110631
45
45
  lino/core/exceptions.py,sha256=QDxDo5cllSyXQ8VWet9hGXzNadxCOmwMVrFXc6V-vpE,665
46
- lino/core/fields.py,sha256=kM6HL3e8S3tdIljXbJd1us4hjR_ZdjxbKu76Jdgd6bU,54866
46
+ lino/core/fields.py,sha256=r8ZySAvyn2ZCkppPdgTVmqa0IPygM6xWU9GEgoCSQ-A,54775
47
47
  lino/core/frames.py,sha256=ISxgq9zyZfqW3tDZMWdKi9Ij455lT_81qBH0xex0bfE,1161
48
48
  lino/core/gfks.py,sha256=6VXn2FSIXOrwVq0stfbPevT37EWg1tg4Fn-HMNVnbmk,1970
49
49
  lino/core/help.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  lino/core/inject.py,sha256=Qd_PGEn0yMXNYVPI0wCv1vvo2CNdlPkyoBmKZELOtGM,13422
51
- lino/core/kernel.py,sha256=YWsw9_6RmJtJT1dlg9zaAzBbnjFRjJKHL7qGyM-lyNc,48831
51
+ lino/core/kernel.py,sha256=WbVyCANXcth5b-QGknJjidWc2mlmNjEUXiHStXzm8c0,48522
52
52
  lino/core/keyboard.py,sha256=W3jA6qtB5HMppoNnd_6PgIM7ZlyHilJEhBvdeZTY7Xk,1283
53
53
  lino/core/layouts.py,sha256=CWhKgCEBnjn39RMFRYUklPEvvCnZrDXhtigZpGuiR8o,28176
54
54
  lino/core/menus.py,sha256=oZN93iwQU4vfUCuxQzaVz2xcccN5AG6NG2wGruL74sU,10713
55
55
  lino/core/merge.py,sha256=sKtTeZtHdoDKerdHj4NXuXXNzpKDsfdPaiq-CY0NqQc,9094
56
- lino/core/model.py,sha256=LZE1De2sboRMqlmLycu4utuIsACSeBtG9COaj9CSeXE,37041
56
+ lino/core/model.py,sha256=jcjCuB_Rg3JBvXUHT8f5kz-DlwZDBQla7kB19e1BQBs,37427
57
57
  lino/core/permissions.py,sha256=sNReMhnjIpOZcJ79Z4k-Emp55evblExJZwH-PM-efcA,7579
58
58
  lino/core/plugin.py,sha256=ZuA2d1oa3Mqx_jyPIwIV68cyzawLw_grthliIo83nuM,6835
59
59
  lino/core/renderer.py,sha256=HhRC_gtrapNLw2Xl-cs67YdI_NdEdJ2ULsbvs5gb2wA,48252
60
60
  lino/core/requests.py,sha256=_kwmx8VAwdaPssIdsZt_GzCst67BTR7WwVv4z_KCsNo,96389
61
61
  lino/core/roles.py,sha256=PXwk436xUupxdbJcygRSYFu7ixfKjAJPQRUQ8sy0lB0,4425
62
62
  lino/core/signals.py,sha256=ORY2s3Krlh9n24XyHetfwbeUhCqzib6YSqWeFTTY7ps,979
63
- lino/core/site.py,sha256=HidiqVqXkTi-OKvNg8tvlR_FEKYEaowZ9h3ly0Zx-Fk,83583
64
- lino/core/store.py,sha256=lv5fNf8LPzYcO1rpS-5T-Dcw6haQrLc9aaIFO7m1ukI,46055
63
+ lino/core/site.py,sha256=DiKF-yRzubEE7xpBntBh4LGlbIaOs6jNd2dT1uTh9dg,83401
64
+ lino/core/store.py,sha256=bbWrbsV-hPS1FF3e2ABiQHQ_Q61tD2XSRBDSwoTW6jQ,46093
65
65
  lino/core/tables.py,sha256=sjmVu3A8gnamxwy16n76UJy2BXgiqeNeCEbI4oGd93Q,25431
66
66
  lino/core/urls.py,sha256=06QlmN1vpxjmb5snO3SPpP6lX1pMdE60bTiBiC77_vQ,2677
67
67
  lino/core/user_types.py,sha256=0iSYmzr2M9v2Mn2y6hzAZeqareUT-gD7l3MfIPyG9ZI,867
68
68
  lino/core/userprefs.py,sha256=cmufIS9xJErKDrw05uoWtQTUR6WRWIGkU1KdAqzNr5M,2850
69
- lino/core/utils.py,sha256=FAIJPRYFIVoyOrpc9AWwNaM4f5Z8OEgbYwGu6v4RQPA,40462
69
+ lino/core/utils.py,sha256=DD3v75WK3sCmAaRQH3WTX3phbEsunPvepA0O5g1PBaw,40495
70
70
  lino/core/views.py,sha256=qLjEN6GSXScbmAnKN7yDHySmsjL0h4sMKRIQCpOEdPU,7026
71
71
  lino/core/widgets.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  lino/core/workflows.py,sha256=6DJ-sCcZ7kwUWYvArD2_j4NZBia0S3OgHySifC-NSuQ,10584
@@ -74,7 +74,7 @@ lino/core/auth/__init__.py,sha256=gbO35DCpyHQV9zjV1l349HQMME9-YgQ1h4amVOHywAc,98
74
74
  lino/core/auth/apps.py,sha256=XCo18f23cEWZiZd4DUgL0JMTgxeERWFuQA8cQFQfUls,47
75
75
  lino/core/auth/backends.py,sha256=IN3UHtfCb0AQqQL6MzIjhu-ESEphNDu1Q86qT48RsBI,8183
76
76
  lino/core/auth/middleware.py,sha256=1c_z4lP_Rhbw7pdCapprGkjIXX40OJgIlFyQew4O-Nc,9708
77
- lino/core/auth/utils.py,sha256=Nv7QbINYi64hGZZxV-Ix1iwhrb_KOfUfhJXAzoKy2ng,4130
77
+ lino/core/auth/utils.py,sha256=wPR0rxkuYuLv7_-eU-Qm5MsQ0nlM8GqlFZF2Iwzam8U,4401
78
78
  lino/core/management/__init__.py,sha256=fp1cONBXgq1IftPk5c4b63gRlYOWpT5VzCIKrx0aGlE,61
79
79
  lino/fake_migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  lino/locale/django.pot,sha256=iyeDILZFawKvi1w-4END2Xa9TDBw81ldWgbWegdGC9c,158276
@@ -98,9 +98,10 @@ lino/locale/zh_Hant/LC_MESSAGES/django.po,sha256=t4Sjt5ygmJzPhmf5FqEgQmRKoFErB0R
98
98
  lino/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
99
  lino/management/commands/__init__.py,sha256=raVDRiXns3SegyXEhaLZMcxfEDs7ggy2nFUN5D0f5F0,47
100
100
  lino/management/commands/buildcache.py,sha256=MrOio6uBtQNW5gnbRrPIjarwUe18R-irxC7dLBBCpR4,1949
101
+ lino/management/commands/ddt.py,sha256=bn9DqZCztwJooa8u9lDBT96sB6o8on1aJWAUKafoQT8,2347
101
102
  lino/management/commands/demotest.py,sha256=NCUr3ttqU0oorOIc3Z6R_cNNgw5_OzHDbQf0HWlcB1g,4877
102
103
  lino/management/commands/diag.py,sha256=vt-NlZUx5gf7T4EpbM-gle3tAwMuwfPQY8lUgxjFaUw,478
103
- lino/management/commands/dump2py.py,sha256=X2u6OVkSb4MVQucF6jOKDDwRc8TCBNakW3UX_9S-n-U,20344
104
+ lino/management/commands/dump2py.py,sha256=V2weGrZnb2JzqNuJrmLWnkeVJFVHRbA-6f7b4f7cPBk,19895
104
105
  lino/management/commands/dump_settings.py,sha256=tGOR4h_ueVe2DOk84ILFvzvndt0doshvaxRkybB-rnY,2009
105
106
  lino/management/commands/initdb.py,sha256=j_cWTlugP2-UP_qnHpXmz_pzPGRK1oORymjxphhcdEg,11398
106
107
  lino/management/commands/install.py,sha256=k7lCJznVLS6swR4ayKNulj5TPpJ3qf99Fha87TZAaUk,1889
@@ -109,23 +110,23 @@ lino/management/commands/makescreenshots.py,sha256=fJF7ATZz7_s1IWkkYMEHVTLB5r5C1
109
110
  lino/management/commands/makeui.py,sha256=qYz68fnUKNXicZfGy3GXdjIZubhg1KyQnqjMblFN_LY,4813
110
111
  lino/management/commands/mergedata.py,sha256=-dPvBtyc-AqKpQeL4TUd2IKHGe8EaaW8Citcsp_hwEU,2527
111
112
  lino/management/commands/passwd.py,sha256=S-7qyUWOaBnqRo_quwWewJjzwonqK4PBP2j8fuBGy3c,3012
112
- lino/management/commands/prep.py,sha256=YPuUT8FLhK-R09N4FFckvYzKdPfou70ISC6l8IDhUEg,2150
113
+ lino/management/commands/prep.py,sha256=dsHu4owaAJB3kIlRLh-11WN3mMLR3I2EpEYOxBWJGfM,2156
113
114
  lino/management/commands/qtclient.py,sha256=ltZyz-SmIevotRmv26TmPiW8VTXKK37DUwdwwMUzrHI,4715
114
115
  lino/management/commands/resetsequences.py,sha256=v7MdzJCw-rBXljttCsgoMIi-cgubCPptXDlcNO0pCjw,978
115
116
  lino/management/commands/run.py,sha256=MiK53KIACYKDTKF6knJGwU-uzEApGnDxByi-3_nrTjQ,1115
116
117
  lino/management/commands/show.py,sha256=p59mer0ZDhNuasUzJpY0HbKr_st5_BMuwygInzp_yew,1371
117
118
  lino/management/commands/syncscreenshots.py,sha256=XYZhqfm5_RwJzVFNGhHJKucl4j6T6mYo2GsDaUzvjAs,1561
118
119
  lino/management/commands/update_conf.py,sha256=saAaQdPhn3mNOoHcBxOFSf_vBEgM-aopTHq1sJN20Bo,1026
119
- lino/mixins/__init__.py,sha256=rpLMX0MoHv79uaTC7n4aau51CZ1cTOhDXEOQiu2Z0x8,8794
120
- lino/mixins/dupable.py,sha256=9DNZ9xsgSFsxchqzlo86jQVecXABuDeEZ62tamj-X9A,10235
121
- lino/mixins/duplicable.py,sha256=MalSQJuZDRTyFq6XfcnwClaSDCphV4p9d4OesZWpv8o,4637
120
+ lino/mixins/__init__.py,sha256=M5P13IaRIfz-73Lz1EKCArARXHd5Dz8jKoV5c0Z0bZc,8788
121
+ lino/mixins/clonable.py,sha256=6wJeUl_dHuVv60fFVZlCMcqsrFBbo5gGzXNWxQjOAoM,4631
122
+ lino/mixins/dupable.py,sha256=_uXPiD29dYzzzAIPuw0urBRApJ2Y4-kNDJg5ye-lGf4,10215
122
123
  lino/mixins/human.py,sha256=YDIfIHHAaVmzd3uGsJp_vDvkaBWOp09I7i4AGNy9YsQ,13255
123
124
  lino/mixins/periods.py,sha256=b2vucnjFXYalxiDlH_LsSfPwJU5tcluKfFAaLS3vTck,11519
124
125
  lino/mixins/polymorphic.py,sha256=MLbfOeIYRoDZO4048X2oWhG5cxds2pLkwciXcw1xjVQ,9393
125
126
  lino/mixins/printable.py,sha256=4U8M1lrTjUeuaPwrcWoanCBo53iAxiNpSTsVctI-gI0,199
126
127
  lino/mixins/ref.py,sha256=qV8CprGCvwzzWTl6LQc9I1RwD8pziD0F7Ykoaznm8wM,5550
127
- lino/mixins/registrable.py,sha256=RXNaQS76X8_vLs2c57hxQ9BcCuPWF1CBH2T3hjnB61o,7258
128
- lino/mixins/sequenced.py,sha256=6j3slKU_nX2O0gymicNsWAcx93DfpNgg-Pe7Tzp6q24,16630
128
+ lino/mixins/registrable.py,sha256=DYiwiIoYMO488ZGX7C5PRbKz9HBpzk1rG6q9-_WvymQ,7208
129
+ lino/mixins/sequenced.py,sha256=3DvjBEHLHacbBBq6iiVGftcvOPhBVpA9FN_tvNc6Bpo,16567
129
130
  lino/modlib/__init__.py,sha256=cO31gNu2oRkp7o2v3D9gK2H7j4jF9rbVyPxPZhZQwrQ,940
130
131
  lino/modlib/about/__init__.py,sha256=jhqGQIXU1o7KkmmQjfwPKJc3buibB09Fy55carAmi7U,342
131
132
  lino/modlib/about/choicelists.py,sha256=2bxDb2u7cFacBOgLoEWrMmzQ4BJ3x1pmhdgqxzUp-Rw,1424
@@ -173,10 +174,10 @@ lino/modlib/checkdata/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-
173
174
  lino/modlib/checkdata/management/commands/checkdata.py,sha256=z-mvg8R0G7-BiWcyeyeMUoaLEhi9n58lockOtPdmhCg,1962
174
175
  lino/modlib/comments/__init__.py,sha256=XoRLIB-pSsz4EfA2FhsbKQ27fsW_AAvS7SyA0_vhHv8,1678
175
176
  lino/modlib/comments/choicelists.py,sha256=SIA7P_KwtaayqOJxCkwyZouK0Z23-2v4ZFV9a0Zexnk,3314
176
- lino/modlib/comments/mixins.py,sha256=h1VvM4h-6rEixziz0r7vJCptM7T7K6i4r50Scz5riws,4413
177
- lino/modlib/comments/models.py,sha256=BSm9x_KSVacba7x4BfLKo2KVbBO4oy84SU0vWEPVOqA,15945
177
+ lino/modlib/comments/mixins.py,sha256=pDlWCsBmIDlGM5EC7znciY5-GytApn6_KuUelWfp1Lo,4370
178
+ lino/modlib/comments/models.py,sha256=adzmBA5MBufTcgEIqAKBowz57yr6qoWkBtVd88DHb5M,15980
178
179
  lino/modlib/comments/roles.py,sha256=z3gctvlTa_5PAs-D4pounyzNyuEc31jTFq9g33r6Z1w,751
179
- lino/modlib/comments/ui.py,sha256=OYeYHJZUvou3d21OcChVhCWtCd7ildGNxIgRoM37Gng,9955
180
+ lino/modlib/comments/ui.py,sha256=Ttl-Fgx6AzPbeLA0DWE8xPbcHpAoJC5A4s_7QWNCaI8,9909
180
181
  lino/modlib/comments/config/comments/comments.js,sha256=7oAnNyx_MKM1iWPu-QSp6iKfnOVdgq7EciQPpxTvYU8,242
181
182
  lino/modlib/comments/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
183
  lino/modlib/comments/fixtures/demo2.py,sha256=DSIqNtGOQlwbg8k43nE2ax1x-H_ifRsozvw6LZM330Y,25407
@@ -184,7 +185,7 @@ lino/modlib/dashboard/__init__.py,sha256=_PFbmakUn8DShXyJY3EfAcuZtX5ofWnS-8dk7s1
184
185
  lino/modlib/dashboard/models.py,sha256=EgRNg88dmz-OlIdi1SyEuerWMsRqKIfqE2MgKL7kApw,3510
185
186
  lino/modlib/dupable/__init__.py,sha256=fIQ8wj-T8ZbkjwQgW_-ankJsHLjPMepOTo32mJXNCvI,532
186
187
  lino/modlib/dupable/mixins.py,sha256=SZ2Exe5q3ANYsP7gnEXQuQczwCDKdRfFvOavreu4mYI,6324
187
- lino/modlib/dupable/models.py,sha256=0watviKwTiVwlArC54V3IxVVfcB1Yg5kO6ed2xCM9a0,4595
188
+ lino/modlib/dupable/models.py,sha256=fcPbWRLwAVOQ4y_E3kaeHUanxmZTS69dlg9TLNCeyZs,4575
188
189
  lino/modlib/export_excel/__init__.py,sha256=HrsrhXjIMvMHRGu8whH3A_WijZWrH35p2cQsFXK60DY,356
189
190
  lino/modlib/export_excel/models.py,sha256=u9COKVdVsPwGk5WjgVarjLSkxmS-KOdohXfH4CruF_c,5353
190
191
  lino/modlib/extjs/__init__.py,sha256=6UBWAWSROwy3DfTXQmVUVJTF6eZ_e2k3BEfE4wtqVhU,10172
@@ -3541,7 +3542,7 @@ lino/modlib/linod/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
3541
3542
  lino/modlib/linod/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3542
3543
  lino/modlib/linod/management/commands/linod.py,sha256=SzJ6-yRpI1QFrXqiS8AO7_c2NmkMdV4JpFhfyGzs5eI,2587
3543
3544
  lino/modlib/memo/__init__.py,sha256=mM4xIODNczmmn43ympj_Un7sPyc9RuIr6zmGKYB5vkk,5381
3544
- lino/modlib/memo/mixins.py,sha256=gtWbmpjLEEBSB11zp30t1Kf3ukUsGXntaIjymj3Kq6k,10915
3545
+ lino/modlib/memo/mixins.py,sha256=cu5BkaYgNtFtJufqphlJrNJWO_wksZDqMdaQVBSrGAQ,10954
3545
3546
  lino/modlib/memo/models.py,sha256=zUEvWu0dK5QhkU3DeMqNqsrzSUzOl6DLZaJBNytfgrs,4388
3546
3547
  lino/modlib/memo/parser.py,sha256=h21I0EjXfV2oHvekp5LxqtfEGlHREa1eOFHU3yC3sOw,13029
3547
3548
  lino/modlib/memo/views.py,sha256=H3g_nuiMzguptXLSWaWLJClU7BefXPFn9Rh8UIVVBeg,555
@@ -3550,7 +3551,7 @@ lino/modlib/memo/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
3550
3551
  lino/modlib/memo/management/commands/removeurls.py,sha256=wZfy-u2ylCF-oKEgaMgvw9zvFIbgV3TZNUcJz4qvE2k,2133
3551
3552
  lino/modlib/notify/__init__.py,sha256=suo7EMVdyTPTPFwuU2KZL25PwIEstTvvR4Turgdz7UE,6926
3552
3553
  lino/modlib/notify/actions.py,sha256=ClRKDjmgx3m43IZ5cx0TdxXN_pU6hLIlo_jCwEW2LhY,2468
3553
- lino/modlib/notify/api.py,sha256=xs5gAqIEJjkRYbRHAIMy47a1gHuIR6ZaPeK_0gk7EcU,4054
3554
+ lino/modlib/notify/api.py,sha256=oZemK9G8Ie6O8iEMDl5mv7BbpCpbfBHbk0xI9125RBY,4366
3554
3555
  lino/modlib/notify/choicelists.py,sha256=7ZkYNMOXNDfyTvdx8Sn-Gsma9f31o-6G1CtivXmQDmA,1324
3555
3556
  lino/modlib/notify/consumers.py,sha256=YaEAhAi_Oq5ovakuP5DI21YIAMvRqQcf4K8MBilcN2w,1529
3556
3557
  lino/modlib/notify/mixins.py,sha256=rwsTgqpzvyiekOqHpxQRTPPdOhv2ZIPrW03YSATfdeE,3903
@@ -3582,7 +3583,7 @@ lino/modlib/periods/fixtures/std.py,sha256=aWzt-frGjzPDwQ2pCKU1nT3oE4xzm7AQ8uLTJ
3582
3583
  lino/modlib/printing/__init__.py,sha256=u1fq44d073-IDH_t8hWs1sQdlAHdsCP85sfEOMSW5L4,689
3583
3584
  lino/modlib/printing/actions.py,sha256=gn4XqIvToXUumymDA20sl7RRsPOejCMu8dKZ3NJJKcE,11669
3584
3585
  lino/modlib/printing/choicelists.py,sha256=UeOVlkYsLV7gxmVWuKqgqrU5zRlYyUck_3ebKDYnqDA,9743
3585
- lino/modlib/printing/mixins.py,sha256=1ETtco9A0Err6Vw46LnQOGEd7bSB5AzC7KCa-O7uXfE,8341
3586
+ lino/modlib/printing/mixins.py,sha256=meu4JvOJ_ErAOOR7qF9tEZZI-9NlRGa3z8f7KG9uHik,8335
3586
3587
  lino/modlib/printing/models.py,sha256=fd-BEKSLpgxPnkh9U7fg2tjNy39exBi3xJC9VzJuXdU,185
3587
3588
  lino/modlib/printing/utils.py,sha256=LUO9769wJvHCPZIqeVQ9XAS6UKJ6BfJbiwO8Dt1kHc4,737
3588
3589
  lino/modlib/printing/config/report/Default.odt,sha256=4X8UD9H_5Th2CELP0C6DTe4g0ZNUPXAg1C00xP3Qluc,10930
@@ -3590,7 +3591,7 @@ lino/modlib/printing/config/report/Default.wk.html,sha256=4Ssx2LWm1gVpXf0Q4XoSY1
3590
3591
  lino/modlib/publisher/__init__.py,sha256=9w4cclyodBB3PO5rFzheIkzJs-tfA62PSGx2WI0NL5Q,2303
3591
3592
  lino/modlib/publisher/choicelists.py,sha256=gVzjyp1sJ-XewAW-I_bCrKdTLgygLzh1ZwFI1rKyPdo,9070
3592
3593
  lino/modlib/publisher/mixins.py,sha256=yRxAtFSNe9aVvdY-th_a5wmQ76jBfKYWzeNUn-efJMA,6651
3593
- lino/modlib/publisher/models.py,sha256=GKM31oWJ6etzughvpQKuGN1rvHSiKneB4t6dWRBvsrA,17264
3594
+ lino/modlib/publisher/models.py,sha256=BvGv6JxdrKoa1VJITOw5Dlbwj96lRdDkCGcRc3uoxG4,17584
3594
3595
  lino/modlib/publisher/renderer.py,sha256=Rl6fX8PzfX6crmnUh8mdU5Mpe44mSN5lTu_Pv8aVSCk,1845
3595
3596
  lino/modlib/publisher/ui.py,sha256=qWp3JWhO6zN_HSZvSlolmNTgiZgoJeY2_TIDh9nYf3Q,4491
3596
3597
  lino/modlib/publisher/views.py,sha256=l_GomdliB1qCylg7jKKkay3ZgAaOPfWNQQ6ZPDjAUl0,2214
@@ -3629,7 +3630,7 @@ lino/modlib/smtpd/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
3629
3630
  lino/modlib/smtpd/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3630
3631
  lino/modlib/smtpd/management/commands/recmail.py,sha256=_0co9uNx3Cq0zudrho-630yupuSCRM-Ilc5cIug3exE,1980
3631
3632
  lino/modlib/summaries/__init__.py,sha256=IPoKcanVyKdWx2M1uSekQbsDUcdpw8yHmGKhiWtJIr0,538
3632
- lino/modlib/summaries/mixins.py,sha256=PYD2ITpHbiIAUnMeaAWa1xBfZtSwCHjBQhSoNA7nXpg,5880
3633
+ lino/modlib/summaries/mixins.py,sha256=dUf8Lwo8ZSgXCAeUIXgB2G0PrW7415lBsSzPfZDXzQM,5844
3633
3634
  lino/modlib/summaries/models.py,sha256=vx28VP6ApD9D9tgoemw6x2VTZZNLbMCfnRo75f4jjTw,2039
3634
3635
  lino/modlib/summaries/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3635
3636
  lino/modlib/summaries/fixtures/checksummaries.py,sha256=WOBdRAZkdje_2CGJof6BxhSNTQkCgBT0ri4E1heXl-8,382
@@ -4407,7 +4408,7 @@ lino/modlib/uploads/fixtures/demo.py,sha256=rhidbKN4vOyzqnRLMXu3gkx4zAtxGj3FoSz0
4407
4408
  lino/modlib/uploads/fixtures/demo3.py,sha256=q0bwZrx5XtRsRlFpsa33fL0sCl7IdCYaP9E1rhCnJt4,547
4408
4409
  lino/modlib/uploads/fixtures/std.py,sha256=nb5oRcX_WrkTLaGoch6PT7GA0FPKmqbN-BdlPq-hHSc,516
4409
4410
  lino/modlib/users/__init__.py,sha256=P9am0pJURsgCmx9J55q8LFChF8Ga9mody1PtJRXWbvM,4578
4410
- lino/modlib/users/actions.py,sha256=4ln4ojxoesA8i6eAiy-CSa-kQne_DFDCtHZ_3MpVItM,18230
4411
+ lino/modlib/users/actions.py,sha256=NcJVCfIhP3moN2MvhIonyCKzld7ruUtnCX4tFVMK7_c,18445
4411
4412
  lino/modlib/users/choicelists.py,sha256=-X76C1NxIs5e7rFHp5Z0kjJkA1NlOP2vdLKGkI2wZRU,3876
4412
4413
  lino/modlib/users/mixins.py,sha256=Ukib2jUnDR2MVJrASpmzoPS_eke-Z431U78JDPe8ysk,14275
4413
4414
  lino/modlib/users/models.py,sha256=V5r_aY7M7gXfY1wAcIknacwsF8k9vtiMY898-y7GSjE,17842
@@ -4433,8 +4434,8 @@ lino/projects/__init__.py,sha256=clYlClMVuUD0O5h_0rtmolCoA_V4fn7f5bUb6iSJn6I,111
4433
4434
  lino/projects/std/__init__.py,sha256=F1MQWdg7KpmHmKW-vWKRI0kwrkFd1nefWviKf4IIMD0,169
4434
4435
  lino/projects/std/settings.py,sha256=wZBvXavMo3sTsSOj4vm4Kgd9Cw9EgoGYFJJcJ1JzxeA,2831
4435
4436
  lino/projects/std/settings_test.py,sha256=qkxqAanlEvcuqOSuMtO8oGKnevftXflRmAxeyOicuSg,392
4436
- lino/sphinxcontrib/__init__.py,sha256=cz8sRK--NVr9thlToiuHRfJVelqdiYdRYmK2kyQKHqU,3970
4437
- lino/sphinxcontrib/actordoc.py,sha256=CrHbqW15V1w_6Rm1bZzRBZv1CduDRZKpCcJQtOJqOCM,20710
4437
+ lino/sphinxcontrib/__init__.py,sha256=sg03m76tbuhgXW4JranBaVj0HvBPPSVMwFATG413KWA,3968
4438
+ lino/sphinxcontrib/actordoc.py,sha256=Q5tuu1gRN0WJ_m-x_72Tq6UiZXK2_EznB4OoEUnnFwM,20708
4438
4439
  lino/sphinxcontrib/base.py,sha256=pq5u4bFSxMgPm9OMDo8xPVGhuS6MZAUd9bF6rQCCHJs,1193
4439
4440
  lino/sphinxcontrib/help_texts_extractor.py,sha256=mlHyeiIdzbfzQXkT8j8skdcBQ-FV3zAPW2DXnY8Hs1I,10385
4440
4441
  lino/sphinxcontrib/logo/__init__.py,sha256=dCHNLzhlMdSYVMui3vc2ybzPU6D4GikiRP-G9SCu1TA,2257
@@ -4585,22 +4586,22 @@ lino/utils/ajax.py,sha256=SdMckREfEk6-0oaXZNdEUfi1pL-OwnwS5YzaGbXLjEs,3254
4585
4586
  lino/utils/choosers.py,sha256=V3Eo0VtGR0t708DeiSkGwSziVCHkipoe2i95d5wTVYc,18298
4586
4587
  lino/utils/code.py,sha256=-2vc8npHQ5jsrRqzxmjRZZ8FWY7QJ7-sRg7-ZhOsUEU,7053
4587
4588
  lino/utils/config.py,sha256=gtaJURPOwHyV_AW7i7_vin3KTj3UwZa4iviDbldwXGE,8568
4588
- lino/utils/cycler.py,sha256=hUKogflEMAwVz8niQxHrLQJN1loRHXsgJTwfbtm0YDQ,1713
4589
+ lino/utils/cycler.py,sha256=Kd4jUUaj181gZxSYWMiZTgF7iT3JXZm57pBh-ZxiOMg,1775
4589
4590
  lino/utils/daemoncommand.py,sha256=NjGShiz09fddIV0WU0jK2nzO_CwPj1MfdmgwAOYZi4M,11525
4590
4591
  lino/utils/dataserializer.py,sha256=-_xHXaGwDSO6-sYEHEa2BtEmKS8bW6gsYx4dV-GbvDs,3779
4591
4592
  lino/utils/dates.py,sha256=eWF5WxA5uJf51Y9PKvDVBWD8yIf6yBF6oO6TeU3ujzw,1030
4592
4593
  lino/utils/dbfreader.py,sha256=KrGsBAFV2tF9pAd9jsmBAFpZ-yw-CRymZHEn_q9IL90,13784
4593
4594
  lino/utils/dbhash.py,sha256=tG1IHe6Bz9MaagTI-131gpcLcNw3g642QVvv7GsJH2g,3303
4594
4595
  lino/utils/dblogger.py,sha256=kr0YxQY6veymvNg5A4tsvkqW8haRWdwqL0C-_9_QTg0,721
4595
- lino/utils/diag.py,sha256=IVEn1CVqB_R_kN_hEp_JUQTdHysBVlZ9LCHkKDZ-s8c,18766
4596
+ lino/utils/diag.py,sha256=quiGcv-e0pwn_yjjt7OUMo8kr1qKYmIFBjDnHxr_5X4,18754
4596
4597
  lino/utils/djangotest.py,sha256=Phz1qNp0wDonZRja5dxbCk0Xl3a73gZNiKK8v9tAgZg,8334
4597
- lino/utils/dpy.py,sha256=8eL5SE6YfTFLvNjFJlFr2SpR_eubU0Rb3ckCbGgrsU8,20661
4598
+ lino/utils/dpy.py,sha256=pHeOmAQLqn4DLunipn5FwooTttRroqdewgUTUt_Dq5s,21220
4598
4599
  lino/utils/fieldutils.py,sha256=6GwPOfL-Jv-uh5-tZrTqC1hJccqHhdLbVSy4CAeegDA,2957
4599
4600
  lino/utils/format_date.py,sha256=zJu8PO45hGsk6Znq8_93D3vUz9HcY7CjHduAFxoU0v8,3123
4600
4601
  lino/utils/html.py,sha256=nR2h6oa_47Baq5rdSln0aGbqzS6SFsWzl-uqjnGIUWU,3273
4601
4602
  lino/utils/html2odf.py,sha256=Hxw4HiIHY1ZCjb4_JLykVHbr6yAMhhHrnrCnLNDYKAs,4826
4602
4603
  lino/utils/html2xhtml.py,sha256=fvrIoLBFpiXtYO3UYaIgAIDjf6ATvrxolQX4etxS57Y,2119
4603
- lino/utils/instantiator.py,sha256=RWC0uG1XkYa7yjQfWl9rmA_g9tErjeO5mM06u-BatnE,7027
4604
+ lino/utils/instantiator.py,sha256=w_yt1ETFa4DruvF3clTUr1xQ-bVCRN4m5oi2zKljj5w,7553
4604
4605
  lino/utils/jinja.py,sha256=1FZgWNKEP9wcokFuIfYysl_VD5mwVHxBHtpnmO17nRQ,1444
4605
4606
  lino/utils/jscompressor.py,sha256=j9UTaaPCfRZLrWUh6PBp0KDDM0QshG7XAFzp-R_elOs,5225
4606
4607
  lino/utils/jsgen.py,sha256=p5BSoCYs67AgD-Q9gmeJp_uQffskT3HXYdp7SrniDsI,15252
@@ -4635,8 +4636,8 @@ lino/utils/xml.py,sha256=EGDnO1UaREst9fS7KTESdbHnrrVCwKbRQdvut6B6GmQ,1612
4635
4636
  lino/utils/mldbc/__init__.py,sha256=QqWRlzeXaOmFfbCk-vTY3SZMn1-FCf67XnpZdd_Nim0,1134
4636
4637
  lino/utils/mldbc/fields.py,sha256=tAX8G5UKigr9c6g0F3ARIjZZtg406mdaZ--PWSbiH9E,2873
4637
4638
  lino/utils/mldbc/mixins.py,sha256=CkYe5jDa7xp9fJq_V8zcZf8ocxgIjUgHc9KZccvA_Yw,1945
4638
- lino-25.7.2.dist-info/METADATA,sha256=r02SpeYvS8PQ1F4MbZXwjctI20OpjU72PE0h51a-wfo,42534
4639
- lino-25.7.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4640
- lino-25.7.2.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4641
- lino-25.7.2.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4642
- lino-25.7.2.dist-info/RECORD,,
4639
+ lino-25.8.0.dist-info/METADATA,sha256=XrP3oqzSF9Mk0zoFtZXTU6oJ77YRw4e-pyhhX469cGg,42534
4640
+ lino-25.8.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4641
+ lino-25.8.0.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4642
+ lino-25.8.0.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4643
+ lino-25.8.0.dist-info/RECORD,,
File without changes