lino 25.4.2__py3-none-any.whl → 25.4.3__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.
lino/modlib/notify/api.py CHANGED
@@ -15,6 +15,8 @@ LIVE_PANEL_UPDATE = "PANEL_UPDATE"
15
15
 
16
16
  NOTIFICATION_TYPES = [NOTIFICATION, CHAT, LIVE_PANEL_UPDATE]
17
17
 
18
+ DONT_CATCH = True
19
+
18
20
 
19
21
  # def send_panel_update(actorIDs: list[str], pk: int):
20
22
  def send_panel_update(data):
@@ -27,16 +29,24 @@ def send_panel_update(data):
27
29
  from channels.layers import get_channel_layer
28
30
  from asgiref.sync import async_to_sync
29
31
 
32
+ if settings.SITE.loading_from_dump:
33
+ return
34
+
30
35
  channel_layer = get_channel_layer()
31
36
 
32
37
  data.update(type=LIVE_PANEL_UPDATE)
33
38
 
34
- try:
39
+ if DONT_CATCH:
35
40
  async_to_sync(channel_layer.send)(
36
41
  CHANNEL_NAME, {"type": "send.panel.update", "text": json.dumps(data)}
37
42
  )
38
- except Exception as e:
39
- logger.exception(e)
43
+ else:
44
+ try:
45
+ async_to_sync(channel_layer.send)(
46
+ CHANNEL_NAME, {"type": "send.panel.update", "text": json.dumps(data)}
47
+ )
48
+ except Exception as e:
49
+ logger.exception(e)
40
50
 
41
51
 
42
52
  def send_notification(
@@ -54,11 +64,9 @@ def send_notification(
54
64
  OK button of their desktop notification.
55
65
 
56
66
  """
57
- if user is None:
67
+ if user is None or settings.SITE.loading_from_dump:
58
68
  return
59
69
 
60
- created = created.strftime("%a %d %b %Y %H:%M")
61
-
62
70
  if dd.get_plugin_setting("linod", "use_channels"):
63
71
  # importing channels at module level would cause certain things to fail
64
72
  # when channels isn't installed, e.g. `manage.py prep` in `lino_book.projects.workflows`.
@@ -73,7 +81,7 @@ def send_notification(
73
81
  subject=subject,
74
82
  id=primary_key,
75
83
  body=body,
76
- created=created,
84
+ created=created.strftime("%a %d %b %Y %H:%M"),
77
85
  action_url=action_url,
78
86
  )
79
87
 
@@ -86,6 +94,7 @@ def send_notification(
86
94
  },
87
95
  ) # data
88
96
  except Exception as e:
97
+ raise # 20250415
89
98
  logger.exception(e)
90
99
 
91
100
  if dd.plugins.notify.use_push_api:
@@ -95,7 +104,7 @@ def send_notification(
95
104
  body=body,
96
105
  action_title=action_title,
97
106
  )
98
- try:
107
+ if DONT_CATCH:
99
108
  async_to_sync(channel_layer.send)(
100
109
  CHANNEL_NAME,
101
110
  {
@@ -104,9 +113,19 @@ def send_notification(
104
113
  "user_id": user.id if user is not None else None,
105
114
  },
106
115
  )
107
- except (
108
- ChannelFull
109
- ) as e: # happens on older Pythons and can cause many tracebacks
110
- # logger.exception(e)
111
- # logger.warning(str(e))
112
- pass
116
+ else:
117
+ try:
118
+ async_to_sync(channel_layer.send)(
119
+ CHANNEL_NAME,
120
+ {
121
+ "type": "send.push",
122
+ "data": data,
123
+ "user_id": user.id if user is not None else None,
124
+ },
125
+ )
126
+ except (
127
+ ChannelFull
128
+ ) as e: # happens on older Pythons and can cause many tracebacks
129
+ # logger.exception(e)
130
+ # logger.warning(str(e))
131
+ pass
@@ -1,7 +1,8 @@
1
- # Copyright 2016-2024 Rumma & Ko Ltd
1
+ # Copyright 2016-2025 Rumma & Ko Ltd
2
2
  # License: GNU Affero General Public License v3 (see file COPYING for details)
3
3
 
4
4
  from lino.utils.html import E, tostring, format_html, mark_safe
5
+ from lino.core.utils import full_model_name as fmn
5
6
  from lino.api import dd, rt, _
6
7
 
7
8
  # PUBLIC_GROUP = "all_users_channel"
@@ -11,13 +12,13 @@ def get_updatables(instance, ar=None):
11
12
  data = {
12
13
  "actorIDs": instance.updatable_panels,
13
14
  "pk": instance.pk,
14
- "model": f"{instance._meta.app_label}.{instance.__class__.__name__}",
15
+ "model": f"{fmn(instance)}",
15
16
  "mk": None, "master_model": None
16
17
  }
17
18
  if ar is None:
18
19
  return data
19
20
  if mi := ar.master_instance:
20
- data.update(mk=mi.pk, master_model=f"{mi._meta.app_label}.{mi.__class__.__name__}")
21
+ data.update(mk=mi.pk, master_model=f"{fmn(mi)}")
21
22
  return data
22
23
 
23
24
 
@@ -260,7 +260,7 @@ class CachedPrintableChecker(Checker):
260
260
  model = CachedPrintable
261
261
  verbose_name = _("Check for missing target files")
262
262
 
263
- def get_checkdata_problems(self, obj, fix=False):
263
+ def get_checkdata_problems(self, ar, obj, fix=False):
264
264
  if obj.build_time is not None:
265
265
  t = obj.get_cache_mtime()
266
266
  if t is None:
@@ -2,12 +2,6 @@
2
2
  # Copyright 2012-2024 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
 
5
- from .ui import *
6
- from lino.api import rt, dd
7
-
8
- from .choicelists import PublishingStates, PageFillers, SpecialPages
9
- from .mixins import Publishable
10
-
11
5
  from html import escape
12
6
  from django.db import models
13
7
  from django.http import HttpResponseRedirect
@@ -15,6 +9,11 @@ from django.conf import settings
15
9
  from django.utils import translation
16
10
  from django.utils.translation import pgettext_lazy
17
11
 
12
+ from lorem import get_paragraph
13
+ from django.utils import translation
14
+ from django.conf import settings
15
+
16
+
18
17
  # from django.utils.translation import get_language
19
18
  from django.utils.html import mark_safe
20
19
 
@@ -38,6 +37,10 @@ from lino.mixins.polymorphic import Polymorphic
38
37
  from lino_xl.lib.topics.mixins import Taggable
39
38
  # from .utils import render_node
40
39
 
40
+ from lino.api import rt, dd
41
+ from .choicelists import PublishingStates, PageFillers, SpecialPages
42
+ from .mixins import Publishable
43
+ from .ui import *
41
44
 
42
45
  # class Node(Referrable, Hierarchical, Sequenced, Previewable, Publishable, Commentable):
43
46
  # Polymorphic,
@@ -401,3 +404,49 @@ def update_publisher_pages(ar):
401
404
  prev = obj
402
405
  count += 1
403
406
  ar.logger.info("%d pages have been updated.", count)
407
+
408
+
409
+ def make_demo_pages(pages_desc):
410
+ # Translation = rt.models.pages.Translation
411
+ # for lc in settings.SITE.LANGUAGE_CHOICES:
412
+ # language = lc[0]
413
+ # kwargs = dict(language=language, ref='index')
414
+ # with translation.override(language):
415
+
416
+ parent_nodes = []
417
+ for lng in settings.SITE.languages:
418
+ counter = {None: 0}
419
+ # count = 0
420
+ home_page = Page.objects.get(
421
+ special_page=SpecialPages.home, language=lng.django_code)
422
+
423
+ with translation.override(lng.django_code):
424
+
425
+ def make_pages(pages, parent=None):
426
+ for page in pages:
427
+ if len(page) != 3:
428
+ raise Exception(f"Oops {page}")
429
+ title, body, children = page
430
+ kwargs = dict(title=title)
431
+ if body is None:
432
+ kwargs.update(body=get_paragraph())
433
+ else:
434
+ kwargs.update(body=body)
435
+ if parent is None:
436
+ # kwargs.update(ref='index')
437
+ continue # home page is created by SpecialPages
438
+ if lng.suffix:
439
+ kwargs.update(
440
+ translated_from=parent_nodes[counter[None]])
441
+ kwargs.update(language=lng.django_code)
442
+ if dd.is_installed("publisher"):
443
+ kwargs.update(publishing_state='published')
444
+ obj = Page(parent=parent, **kwargs)
445
+ yield obj
446
+ if not lng.suffix:
447
+ parent_nodes.append(obj)
448
+ counter[None] += 1
449
+ # print("20230324", title, kwargs)
450
+ yield make_pages(children, obj)
451
+
452
+ yield make_pages(pages_desc, parent=home_page)
@@ -92,7 +92,7 @@ else:
92
92
 
93
93
 
94
94
  class PageDetail(dd.DetailLayout):
95
- main = "first_panel general more"
95
+ main = "general first_panel more"
96
96
 
97
97
  first_panel = dd.Panel(
98
98
  """
@@ -129,11 +129,11 @@ class PageDetail(dd.DetailLayout):
129
129
  # """
130
130
 
131
131
  right_panel = """
132
- ref
132
+ ref language
133
133
  parent seqno
134
134
  child_node_depth
135
135
  #page_type filler
136
- language
136
+ publishing_state special_page
137
137
  publisher.TranslationsByPage
138
138
  """
139
139
 
@@ -5,6 +5,7 @@
5
5
  from django.conf import settings
6
6
  from django import http
7
7
  from django.views.generic import View
8
+ from django.utils import translation
8
9
 
9
10
  from lino.api import dd
10
11
  from lino.core import auth
@@ -52,7 +53,13 @@ class Index(View):
52
53
  def get(self, request, pk=1):
53
54
  rnd = settings.SITE.plugins.publisher.renderer
54
55
  dv = settings.SITE.models.publisher.Pages
55
- index_node = dv.model.objects.get(ref="index", language=request.LANGUAGE_CODE)
56
+ if len(settings.SITE.languages) == 1:
57
+ # language = settings.SITE.languages[0].django_code
58
+ language = translation.get_language()
59
+ else:
60
+ language = request.LANGUAGE_CODE
61
+ index_node = dv.model.objects.get(ref="index", language=language)
56
62
  # print("20231025", index_node)
57
- ar = dv.create_request(request=request, renderer=rnd, selected_rows=[index_node])
63
+ ar = dv.create_request(request=request, renderer=rnd,
64
+ selected_rows=[index_node])
58
65
  return index_node.get_publisher_response(ar)
@@ -326,7 +326,7 @@ class BleachChecker(Checker):
326
326
  if len(m._bleached_fields):
327
327
  yield m
328
328
 
329
- def get_checkdata_problems(self, obj, fix=False):
329
+ def get_checkdata_problems(self, ar, obj, fix=False):
330
330
  t = tuple(obj.fields_to_bleach(save=False))
331
331
  if len(t):
332
332
  fldnames = ", ".join([f.name for f, old, new in t])
@@ -285,7 +285,7 @@ class UploadChecker(Checker):
285
285
  verbose_name = _("Check metadata of upload files")
286
286
  model = "uploads.Upload"
287
287
 
288
- def get_checkdata_problems(self, obj, fix=False):
288
+ def get_checkdata_problems(self, ar, obj, fix=False):
289
289
  if obj.file:
290
290
  if not exists(join(settings.MEDIA_ROOT, obj.file.name)):
291
291
  yield (
@@ -311,7 +311,7 @@ UploadChecker.activate()
311
311
  class UploadsFolderChecker(Checker):
312
312
  verbose_name = _("Find orphaned files in uploads folder")
313
313
 
314
- def get_checkdata_problems(self, obj, fix=False):
314
+ def get_checkdata_problems(self, ar, obj, fix=False):
315
315
  assert obj is None # this is an unbound checker
316
316
  Upload = rt.models.uploads.Upload
317
317
  pth = dd.plugins.uploads.uploads_root
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lino
3
- Version: 25.4.2
3
+ Version: 25.4.3
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,10 +1,10 @@
1
1
  lino/.cvsignore,sha256=1vrrWoP-WD8hPfCszHHIiJEi8KUMRCt5WvoKB9TSB1k,28
2
2
  lino/SciTEDirectory.properties,sha256=rCYi_e-6h8Yx5DwXhAa6MBPlVINcl6Vv9BQDYZV2_go,28
3
- lino/__init__.py,sha256=vPakvNPcc39olTexcyLdrhwTrq7ulMVBrgPP5ZFuzIA,6176
3
+ lino/__init__.py,sha256=NIz99QDcp3WGCLbrw0KdBjHI4-fjQbLrCUifvYsLnOE,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=RPD-0OJQz8DZtJvr4FuZxiOnnGzNK9jdVYJykoSFWRc,91431
7
+ lino/help_texts.py,sha256=n0cYycLTZFF72ybnYAwMkF-FxpLPyS4fNxQaUNpNTAQ,91428
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=-mxiSJS27LGCWyOgboA8qDudTkE9vg9vmUGOT08Hq6A,7410
@@ -47,7 +47,7 @@ lino/core/frames.py,sha256=ISxgq9zyZfqW3tDZMWdKi9Ij455lT_81qBH0xex0bfE,1161
47
47
  lino/core/gfks.py,sha256=6VXn2FSIXOrwVq0stfbPevT37EWg1tg4Fn-HMNVnbmk,1970
48
48
  lino/core/help.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  lino/core/inject.py,sha256=Qd_PGEn0yMXNYVPI0wCv1vvo2CNdlPkyoBmKZELOtGM,13422
50
- lino/core/kernel.py,sha256=BY86dmUaU95zw22RlhZXbbBGpuOvsxfanMqzFr6Us0w,46939
50
+ lino/core/kernel.py,sha256=oeBQb5rbsSKWPXW67gHRTup5IXKGBptVbPAfiUjHVog,47664
51
51
  lino/core/keyboard.py,sha256=W3jA6qtB5HMppoNnd_6PgIM7ZlyHilJEhBvdeZTY7Xk,1283
52
52
  lino/core/layouts.py,sha256=Wojx5UUyhy7PsZE8FWmiXcmZDj4wz2y_1_wlz1G560Q,28663
53
53
  lino/core/menus.py,sha256=W0Co9K-ayvfX5Zt5rgSxJrFRejtiYrwIR5EecdYXPNc,10857
@@ -55,11 +55,11 @@ lino/core/merge.py,sha256=sKtTeZtHdoDKerdHj4NXuXXNzpKDsfdPaiq-CY0NqQc,9094
55
55
  lino/core/model.py,sha256=YENZ-v1sggtdTitgmC8jBmuihN1EsKXQMlbPAuTSat8,36870
56
56
  lino/core/permissions.py,sha256=Fnemz3NwWz21X0YATI9Q7ba2FcAdg-EMLHjIcbt_AVU,6840
57
57
  lino/core/plugin.py,sha256=8FdxFF5tqHK-N8aXANzpWXY97hj6Lty4ulM6PWcq5A8,6833
58
- lino/core/renderer.py,sha256=auQn2v9bBp6jLIH3hXRQXbrjFrTmsO1o0DwaoXBn1eE,47310
58
+ lino/core/renderer.py,sha256=C00J0L41hLv9b2sAzqSSrT0Lz5Fc78JnwHiq9LqF81c,47310
59
59
  lino/core/requests.py,sha256=xIq6kXhjLoYbSkW40_BH-uj0WvmfkvOVLGm2piiGtJo,95835
60
60
  lino/core/roles.py,sha256=PXwk436xUupxdbJcygRSYFu7ixfKjAJPQRUQ8sy0lB0,4425
61
61
  lino/core/signals.py,sha256=0JT89mkjSbRm57QZcSI9DoThoKUGkyi-egNhuLUKEds,948
62
- lino/core/site.py,sha256=9Ji_aj1Q3HHY6d3VqS1La4JP5K7S0tAg17Ns7gQ_TYg,83676
62
+ lino/core/site.py,sha256=IBC8XyyUTq7Qt3LSkAidsyPG3sd5eBevBA5abUQgQas,83446
63
63
  lino/core/store.py,sha256=6pd4J5Y-U7Muz4mKFSL6K9KEZpJUbpM-I7RQTWyCo-8,51483
64
64
  lino/core/tables.py,sha256=Yoj-H2ASW9xIger8kuW8xst5A_tEmtWpV17L11Ebca0,24348
65
65
  lino/core/urls.py,sha256=06QlmN1vpxjmb5snO3SPpP6lX1pMdE60bTiBiC77_vQ,2677
@@ -97,7 +97,7 @@ lino/locale/zh_Hant/LC_MESSAGES/django.po,sha256=J9IELaIaZmBI2Vfu9HPIVA-g45QTYIx
97
97
  lino/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  lino/management/commands/__init__.py,sha256=raVDRiXns3SegyXEhaLZMcxfEDs7ggy2nFUN5D0f5F0,47
99
99
  lino/management/commands/buildcache.py,sha256=MrOio6uBtQNW5gnbRrPIjarwUe18R-irxC7dLBBCpR4,1949
100
- lino/management/commands/demotest.py,sha256=yvxpl1G0Clt-iu7lY0DK9HVhaWyl_tQhYx0YUpddTWM,5041
100
+ lino/management/commands/demotest.py,sha256=NCUr3ttqU0oorOIc3Z6R_cNNgw5_OzHDbQf0HWlcB1g,4877
101
101
  lino/management/commands/diag.py,sha256=vt-NlZUx5gf7T4EpbM-gle3tAwMuwfPQY8lUgxjFaUw,478
102
102
  lino/management/commands/dump2py.py,sha256=X2u6OVkSb4MVQucF6jOKDDwRc8TCBNakW3UX_9S-n-U,20344
103
103
  lino/management/commands/dump_settings.py,sha256=tGOR4h_ueVe2DOk84ILFvzvndt0doshvaxRkybB-rnY,2009
@@ -107,7 +107,6 @@ lino/management/commands/makemigdump.py,sha256=TvNnFFjD6XRMFLbX8IEMSNDKTMPLTBCi8
107
107
  lino/management/commands/makescreenshots.py,sha256=fJF7ATZz7_s1IWkkYMEHVTLB5r5C1ny-kJp253BeoKM,8667
108
108
  lino/management/commands/makeui.py,sha256=qYz68fnUKNXicZfGy3GXdjIZubhg1KyQnqjMblFN_LY,4813
109
109
  lino/management/commands/mergedata.py,sha256=-dPvBtyc-AqKpQeL4TUd2IKHGe8EaaW8Citcsp_hwEU,2527
110
- lino/management/commands/monitor.py,sha256=-axtsW-uzk87ESR6-GSfUL0Y2ylB5BwHC6Xlx3fPxo4,5113
111
110
  lino/management/commands/passwd.py,sha256=S-7qyUWOaBnqRo_quwWewJjzwonqK4PBP2j8fuBGy3c,3012
112
111
  lino/management/commands/prep.py,sha256=23bnkHQrFHDPjGDI7Y2epXAC2bJ3oBYg0ZZV7g6ibTM,2124
113
112
  lino/management/commands/qtclient.py,sha256=ltZyz-SmIevotRmv26TmPiW8VTXKK37DUwdwwMUzrHI,4715
@@ -116,20 +115,20 @@ lino/management/commands/run.py,sha256=MiK53KIACYKDTKF6knJGwU-uzEApGnDxByi-3_nrT
116
115
  lino/management/commands/show.py,sha256=dS_TotAEeH8zo_wufQgca6q0Yj9qeWsJUOUcss6YD7E,1439
117
116
  lino/management/commands/syncscreenshots.py,sha256=XYZhqfm5_RwJzVFNGhHJKucl4j6T6mYo2GsDaUzvjAs,1561
118
117
  lino/management/commands/update_conf.py,sha256=saAaQdPhn3mNOoHcBxOFSf_vBEgM-aopTHq1sJN20Bo,1026
119
- lino/mixins/__init__.py,sha256=tUVJjAWMZv3gNOWKWodxeHXXOmEcxqvMCNXpltmXXO4,8832
120
- lino/mixins/dupable.py,sha256=ofyYrcT9WiYdVTkzgXyXaBu1kS-y197YnFTnZNALUHo,10233
118
+ lino/mixins/__init__.py,sha256=7_gW-TzHryL9hvcOx90Op-uBGvivtEj4e6bfNp6j_OE,8854
119
+ lino/mixins/dupable.py,sha256=9DNZ9xsgSFsxchqzlo86jQVecXABuDeEZ62tamj-X9A,10235
121
120
  lino/mixins/duplicable.py,sha256=a5-1jZZWX-kgKg5GNhV6yaSGOgfTyd2lWHtY35bVmes,4247
122
121
  lino/mixins/human.py,sha256=YDIfIHHAaVmzd3uGsJp_vDvkaBWOp09I7i4AGNy9YsQ,13255
123
122
  lino/mixins/periods.py,sha256=iFqUCUZlgUW2GmEHRl9suwJedztrXLluQhgFpu7Uj54,11479
124
123
  lino/mixins/polymorphic.py,sha256=MLbfOeIYRoDZO4048X2oWhG5cxds2pLkwciXcw1xjVQ,9393
125
124
  lino/mixins/printable.py,sha256=4U8M1lrTjUeuaPwrcWoanCBo53iAxiNpSTsVctI-gI0,199
126
125
  lino/mixins/ref.py,sha256=ZnyTcpHgcbYwDwgaBwLc5cGLQqz8MmjAypSEgPB7Ql4,5272
127
- lino/mixins/registrable.py,sha256=0m68YGlipRhE83IsEvXATZtvyxtMsH-Dpd5TGZh_GzE,6936
126
+ lino/mixins/registrable.py,sha256=I9KqbYf0kZdbpD4UBUwNK7_OhRdWQDVqK0tkSU-M2ZU,7114
128
127
  lino/mixins/sequenced.py,sha256=6FiHJX2ZIraqUofdnb082b978PISNbpd2Vr87YA_1pg,16460
129
128
  lino/modlib/__init__.py,sha256=cO31gNu2oRkp7o2v3D9gK2H7j4jF9rbVyPxPZhZQwrQ,940
130
129
  lino/modlib/about/__init__.py,sha256=jhqGQIXU1o7KkmmQjfwPKJc3buibB09Fy55carAmi7U,342
131
130
  lino/modlib/about/choicelists.py,sha256=2bxDb2u7cFacBOgLoEWrMmzQ4BJ3x1pmhdgqxzUp-Rw,1424
132
- lino/modlib/about/models.py,sha256=7dbWnw5DXy0BWsvj9bW9ugRQIxD8B_My3yA_ReLUP5o,5126
131
+ lino/modlib/about/models.py,sha256=bT62zZrvdEF1JprwB152v_VmRMfEIbdXrkN7VZISfEg,5141
133
132
  lino/modlib/awesomeuploader/__init__.py,sha256=pUUnpdglJ0IDMBgW-ZQwnTOPHDRjItEiIWbSwv4qvBM,1825
134
133
  lino/modlib/awesomeuploader/models.py,sha256=LaK6IzLoCX4qMkVhsgdPfgawyFPe5rcHUgBFY0PbzWg,801
135
134
  lino/modlib/awesomeuploader/config/awesomeuploader/snippet.js,sha256=cZCGi0e9lDW96vCg3KVJ5DUtg2KHLNdnPo5KPRrQxv8,1792
@@ -163,8 +162,8 @@ lino/modlib/changes/__init__.py,sha256=3-CO7xI-U-rKDu_-WJg7N4FaIgqmFcj81uzyQlNYr
163
162
  lino/modlib/changes/models.py,sha256=wflXkqKSC-0ZynPGEd6PR4agP6zMuYO6v6v2NcRJgoo,9537
164
163
  lino/modlib/changes/utils.py,sha256=4jz8QXgaBxfmCBUvDeZeh7lkdwfTq7OBXBiFhMmANqA,2550
165
164
  lino/modlib/checkdata/__init__.py,sha256=raUCoYi4WZLKVLG3GqH0ml1eH_YJXqY-EgXsKUe6iRY,2829
166
- lino/modlib/checkdata/choicelists.py,sha256=OGv3mmr5DPPahoBliAOFIx_H6ysuW3ZpcrI4fIq1SB0,5244
167
- lino/modlib/checkdata/models.py,sha256=AfqGbL9z61kxFqA6OIuOlozUmqrlOy_uRR1rwXVXcU8,13538
165
+ lino/modlib/checkdata/choicelists.py,sha256=JlBK8VeJK6yAFiqeU1Zx7m2wpDtTpZ1o6YPjnig6g70,5260
166
+ lino/modlib/checkdata/models.py,sha256=MNfvEqwHVw8K9Aoqd2rVvcdRo67vpsCufctj9B6g4qM,13546
168
167
  lino/modlib/checkdata/roles.py,sha256=xjQ882-BxYUoHbv2pzebs7MWl6snA2fKivFDTRzW7sQ,295
169
168
  lino/modlib/checkdata/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
169
  lino/modlib/checkdata/fixtures/checkdata.py,sha256=TY9yIBwB5nEw0e6RTXqRwYdiCaLkkYTwWmFGcVBw2ow,332
@@ -174,22 +173,22 @@ lino/modlib/checkdata/management/commands/checkdata.py,sha256=CjtGm26qPxIWgkn5a9
174
173
  lino/modlib/comments/__init__.py,sha256=XoRLIB-pSsz4EfA2FhsbKQ27fsW_AAvS7SyA0_vhHv8,1678
175
174
  lino/modlib/comments/choicelists.py,sha256=SIA7P_KwtaayqOJxCkwyZouK0Z23-2v4ZFV9a0Zexnk,3314
176
175
  lino/modlib/comments/mixins.py,sha256=h1VvM4h-6rEixziz0r7vJCptM7T7K6i4r50Scz5riws,4413
177
- lino/modlib/comments/models.py,sha256=bEfmLjLcugG8Fhfg7Sn2yXRm9m_pfayqNzi31XWJR7k,15922
176
+ lino/modlib/comments/models.py,sha256=6QMihylQW0z0nbNyVznp0pU_tWGSor79KczoYPjwtIw,15926
178
177
  lino/modlib/comments/roles.py,sha256=z3gctvlTa_5PAs-D4pounyzNyuEc31jTFq9g33r6Z1w,751
179
178
  lino/modlib/comments/ui.py,sha256=OYeYHJZUvou3d21OcChVhCWtCd7ildGNxIgRoM37Gng,9955
180
179
  lino/modlib/comments/config/comments/comments.js,sha256=7oAnNyx_MKM1iWPu-QSp6iKfnOVdgq7EciQPpxTvYU8,242
181
180
  lino/modlib/comments/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
- lino/modlib/comments/fixtures/demo2.py,sha256=GB8ADRsQPNCEZ16LFWHMlYNZIPlPmWbUgW4VjRvy4ho,25317
181
+ lino/modlib/comments/fixtures/demo2.py,sha256=DSIqNtGOQlwbg8k43nE2ax1x-H_ifRsozvw6LZM330Y,25407
183
182
  lino/modlib/dashboard/__init__.py,sha256=_PFbmakUn8DShXyJY3EfAcuZtX5ofWnS-8dk7s1CrLw,1420
184
183
  lino/modlib/dashboard/models.py,sha256=EgRNg88dmz-OlIdi1SyEuerWMsRqKIfqE2MgKL7kApw,3510
185
184
  lino/modlib/dupable/__init__.py,sha256=fIQ8wj-T8ZbkjwQgW_-ankJsHLjPMepOTo32mJXNCvI,532
186
- lino/modlib/dupable/mixins.py,sha256=B7JRVDRszf7ojFBAeb-Md_fJMc9Sp5u-emLEAtR6s2g,6318
185
+ lino/modlib/dupable/mixins.py,sha256=SZ2Exe5q3ANYsP7gnEXQuQczwCDKdRfFvOavreu4mYI,6324
187
186
  lino/modlib/dupable/models.py,sha256=0watviKwTiVwlArC54V3IxVVfcB1Yg5kO6ed2xCM9a0,4595
188
187
  lino/modlib/export_excel/__init__.py,sha256=HrsrhXjIMvMHRGu8whH3A_WijZWrH35p2cQsFXK60DY,356
189
188
  lino/modlib/export_excel/models.py,sha256=A-lFS-xFDSPHcVbY0OI7VsuGr82jJyLDhXH2Dcv80Os,5039
190
189
  lino/modlib/extjs/__init__.py,sha256=6UBWAWSROwy3DfTXQmVUVJTF6eZ_e2k3BEfE4wtqVhU,10172
191
- lino/modlib/extjs/ext_renderer.py,sha256=DVUoCmy-knDO_i6s8yVGy8xI2qsWBA8GByiv29Lm8ts,60609
192
- lino/modlib/extjs/views.py,sha256=7IlzseAwtGPZtpsbow103mEV8VuKIH9uhfZmv9StneA,26292
190
+ lino/modlib/extjs/ext_renderer.py,sha256=KkzvGe7pyOB-_tMiiifqeDI2KuKZd-nGNic9XbV3uu0,60616
191
+ lino/modlib/extjs/views.py,sha256=CrX_tPshJtSkHT7raDDqn4B_XYamujRs-CgLzY4CBxg,26299
193
192
  lino/modlib/extjs/config/extjs/index.html,sha256=jO5hdNpFSkm9t0xhHD5hc8Hw1fSr6xb3zYq9aMyOI7Q,8603
194
193
  lino/modlib/extjs/config/extjs/linoweb.js,sha256=I4VYGmkK4htqZvHM9g-6psJF3pp7SvgHEI0I02Sxpvo,175127
195
194
  lino/modlib/extjs/config/extjs/service-worker.js,sha256=KEKWeehTlfBHk3r8NbsP9C5av_DukHORybxFOwbjYaQ,1767
@@ -3507,7 +3506,7 @@ lino/modlib/help/config/makehelp/models.tpl.rst,sha256=6N_-CRztf1-bdKUr3Q7IXA-f2
3507
3506
  lino/modlib/help/config/makehelp/plugin.tpl.rst,sha256=D2eXEv_GFzsutTUtk64u6R-X2ACRD0UElCVH7RBZXec,492
3508
3507
  lino/modlib/help/config/makehelp/plugins.tpl.rst,sha256=rj9uRsag-u2gY_VcqkzuBepXhC5nRSRpoxJGvJHBVN8,352
3509
3508
  lino/modlib/help/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3510
- lino/modlib/help/fixtures/demo2.py,sha256=3FcLnr2KJYMiZ-mSpjvWCbn49VaGp7vM2wY1ZDtLb5M,814
3509
+ lino/modlib/help/fixtures/demo2.py,sha256=P719oIom7C7l_65-pKrZgsD6lhWUzoQCaNTQyVgeyoo,892
3511
3510
  lino/modlib/help/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3512
3511
  lino/modlib/help/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3513
3512
  lino/modlib/help/management/commands/makehelp.py,sha256=ylVcT9TNOYK7N-hCm0d3ZQ76CTzRxUd8nXV2PbJ2JYs,18600
@@ -3518,7 +3517,7 @@ lino/modlib/ipdict/models.py,sha256=9-pjj_xXdndhQaQI8sgXcmODxurST_aFcShGwomiYKk,
3518
3517
  lino/modlib/jinja/__init__.py,sha256=XSa-e1qZGabl8EmRDKPRtmzgBRole5ZbxAUBR_m-ds0,3418
3519
3518
  lino/modlib/jinja/choicelists.py,sha256=QHjWQWLnJCKSGnLIKeGqnCw41JYvcbTkCeXjBpWh23w,1466
3520
3519
  lino/modlib/jinja/loader.py,sha256=MX027X_UuQPqq0wOUr06QnOkdTzGpksNv0Om1CGp61I,1765
3521
- lino/modlib/jinja/mixins.py,sha256=FU0AcDyJwcip4EAlkG5vjuLFVZFLyiXqPXU4bjGx-S0,2490
3520
+ lino/modlib/jinja/mixins.py,sha256=X9ARAUsrD72sVj69cN3fl-auNnmz_0gVfG_-WXPHx_o,2837
3522
3521
  lino/modlib/jinja/models.py,sha256=vXNFS78qP-qIzeSmnXJNOpvW_IfH1h6hhPgYjfkvvD0,207
3523
3522
  lino/modlib/jinja/renderer.py,sha256=PtjhJdidlOOGzRdyUQlaEIj2FhFFuthFB80-bkSfsoM,6156
3524
3523
  lino/modlib/jinja/config/jinja/status.jinja.rst,sha256=XEsfXd82B0fLsBfds5-pXdeDWVr4ccTv7WyGa9ayigk,312
@@ -3536,7 +3535,7 @@ lino/modlib/linod/__init__.py,sha256=efmj_Kz3OO2zF1lvs7P459iufYGimH1-6Ge6Cbq85tQ
3536
3535
  lino/modlib/linod/choicelists.py,sha256=Cu82s1QpcGFmKUXJsg-7TSqpaESBCZKOEfxzFlJP06I,2626
3537
3536
  lino/modlib/linod/consumers.py,sha256=XBjA1fflJ-e9yWRMKXyQAhrOklYzs5JRhEeGMOKWFqM,6730
3538
3537
  lino/modlib/linod/mixins.py,sha256=gZci22_m3GNUNycLSvMelG1sUQLCCho2gniPTegopMs,13027
3539
- lino/modlib/linod/models.py,sha256=tbPKNk3BLnnAPWvbNrWhz713b3IPM0z8UoctJcwVhhw,2357
3538
+ lino/modlib/linod/models.py,sha256=yqGytDq7KxkHBCZpwF-7GQdR3nGh6-rBB-gLkvqoouQ,2361
3540
3539
  lino/modlib/linod/routing.py,sha256=FiG0JVqp9TWWkNpl9Y_50UCAJ7ZEImDXkQUhlg4aGL4,2094
3541
3540
  lino/modlib/linod/utils.py,sha256=dE973Xib6Be1DvNsZ0M5wzY_jpkk35R21WKs-jQPorM,339
3542
3541
  lino/modlib/linod/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -3545,16 +3544,16 @@ lino/modlib/linod/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
3545
3544
  lino/modlib/linod/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3546
3545
  lino/modlib/linod/management/commands/linod.py,sha256=RsUgUBz-soF8wkfgUE8KJiLZltrhEeCm1m7AFNthUps,3826
3547
3546
  lino/modlib/memo/__init__.py,sha256=GdzNURo3v_o5PxTBZ_KNkzrjlcDzn4AO95pYBbHmk8Q,5389
3548
- lino/modlib/memo/mixins.py,sha256=Ij_bFcBY_ivo5t2HWArEeRkxIQhg61iP0sTNnhZpRac,11246
3547
+ lino/modlib/memo/mixins.py,sha256=wk1bwb28GTBwXI2QJSo-6kJLfpjFwXTf5S8McjmZ0Gw,11251
3549
3548
  lino/modlib/memo/models.py,sha256=zUEvWu0dK5QhkU3DeMqNqsrzSUzOl6DLZaJBNytfgrs,4388
3550
3549
  lino/modlib/memo/parser.py,sha256=AKMfdbNFl9ehxl8TTFWwQ-ngfx7CD7hUjVA6bUNBY1c,12997
3551
3550
  lino/modlib/memo/views.py,sha256=H3g_nuiMzguptXLSWaWLJClU7BefXPFn9Rh8UIVVBeg,555
3552
3551
  lino/modlib/notify/__init__.py,sha256=suo7EMVdyTPTPFwuU2KZL25PwIEstTvvR4Turgdz7UE,6926
3553
3552
  lino/modlib/notify/actions.py,sha256=ClRKDjmgx3m43IZ5cx0TdxXN_pU6hLIlo_jCwEW2LhY,2468
3554
- lino/modlib/notify/api.py,sha256=dIuyn7uRF1dDgoGAqvFQvuJImLl1Q0g79skBJvnXMYs,3339
3553
+ lino/modlib/notify/api.py,sha256=xs5gAqIEJjkRYbRHAIMy47a1gHuIR6ZaPeK_0gk7EcU,4054
3555
3554
  lino/modlib/notify/choicelists.py,sha256=7ZkYNMOXNDfyTvdx8Sn-Gsma9f31o-6G1CtivXmQDmA,1324
3556
3555
  lino/modlib/notify/consumers.py,sha256=YaEAhAi_Oq5ovakuP5DI21YIAMvRqQcf4K8MBilcN2w,1529
3557
- lino/modlib/notify/mixins.py,sha256=E_PZuljGnE0Xwzxloe3vorCFTBZTsXhpTfHX0BrPvV4,3928
3556
+ lino/modlib/notify/mixins.py,sha256=rwsTgqpzvyiekOqHpxQRTPPdOhv2ZIPrW03YSATfdeE,3903
3558
3557
  lino/modlib/notify/models.py,sha256=LtefhX8wYtP2EYpFN1-VTV8ZAjSTbbbVoAh68LHU1KE,18464
3559
3558
  lino/modlib/notify/utils.py,sha256=e4TAJr8mgicwEjgyuP-bOiw1VGNA6tVo_hab1q-oSNc,328
3560
3559
  lino/modlib/notify/views.py,sha256=Ar2L_Tv1qqU5giHu2b0h_AKc3utvgfZwda4qncqoBsk,957
@@ -3583,7 +3582,7 @@ lino/modlib/periods/fixtures/std.py,sha256=iV6a2DNAhfYvO1VspGkcncEmygHK94zWdDZlH
3583
3582
  lino/modlib/printing/__init__.py,sha256=u1fq44d073-IDH_t8hWs1sQdlAHdsCP85sfEOMSW5L4,689
3584
3583
  lino/modlib/printing/actions.py,sha256=2-JORKcjJYuzK2kYmhqZl0gRR-4CrG7ul8mcFNfYYAI,11766
3585
3584
  lino/modlib/printing/choicelists.py,sha256=DM929pej7NUi1gm38nUr0t3-VANV95eqCLeW5ubh8y8,9712
3586
- lino/modlib/printing/mixins.py,sha256=WSgd7nbxcuIPeCG-zQd-jqTHzaTIuFtrGtn1kwMWIqU,8349
3585
+ lino/modlib/printing/mixins.py,sha256=4MLDD-A0zzuJNVcWJzbhyPfC9l6UUgKhm-m8DokN0aM,8353
3587
3586
  lino/modlib/printing/models.py,sha256=fd-BEKSLpgxPnkh9U7fg2tjNy39exBi3xJC9VzJuXdU,185
3588
3587
  lino/modlib/printing/utils.py,sha256=LUO9769wJvHCPZIqeVQ9XAS6UKJ6BfJbiwO8Dt1kHc4,737
3589
3588
  lino/modlib/printing/config/report/Default.odt,sha256=4X8UD9H_5Th2CELP0C6DTe4g0ZNUPXAg1C00xP3Qluc,10930
@@ -3591,10 +3590,10 @@ lino/modlib/printing/config/report/Default.wk.html,sha256=4Ssx2LWm1gVpXf0Q4XoSY1
3591
3590
  lino/modlib/publisher/__init__.py,sha256=bGQduKmgzr_lU2N6H4q4I5ZmW-3iwdPuT2D8dpiVOiI,2644
3592
3591
  lino/modlib/publisher/choicelists.py,sha256=fxvf0-1Y9YnBXaJVs8ZaNfLLQwyJO4BR3Uz_UeZtM7Q,8066
3593
3592
  lino/modlib/publisher/mixins.py,sha256=eMEZeMQdaEp9tDkA5_YdqFGQec1q7Z1DAJZvU1cmoRM,6229
3594
- lino/modlib/publisher/models.py,sha256=DtlqvzFieGvtK9NtphnhPICB9RyAR380IHWKAtdAiKY,14449
3593
+ lino/modlib/publisher/models.py,sha256=4DbS4-CeMyNnAetEiuWpY9-mrGS0HsXovKiE5DMHOm4,16404
3595
3594
  lino/modlib/publisher/renderer.py,sha256=9RoyVMQcbwh_GcbDJO8BWhCKe1kpbDc9M45hrMqzpNs,1922
3596
- lino/modlib/publisher/ui.py,sha256=Evh97oxIut8FMyEzy8KFfNFEsNbVeKb7s1Fy3hOJOWk,4451
3597
- lino/modlib/publisher/views.py,sha256=Ompti6ywm4KrH5DLJ0TqIdHfGMNYb1Fe7mwOFEyT708,2149
3595
+ lino/modlib/publisher/ui.py,sha256=l4QNzMjCdBDaY8qa20S8TWmt9rW_oYR2Qw_HMhSUHtg,4481
3596
+ lino/modlib/publisher/views.py,sha256=_0ktDagke4TOWVekJOnaRJBrbKqn27Yfz3SC2UnHKTM,2423
3598
3597
  lino/modlib/publisher/config/publisher/base.html,sha256=nrWuN4lhP1O4ORdYTaY3fS2pc90yfUnfDYfm2Jtr7hQ,198
3599
3598
  lino/modlib/publisher/config/publisher/default_list.pub.html,sha256=3ePc4U3xZxE-pqtzlnB9CRQWu8OQrtfXKEjyuc8BBUQ,578
3600
3599
  lino/modlib/publisher/config/publisher/item.pub.html,sha256=973RYgCAYG1SYIB4bwfVZFVTUo0WD2I98PsoPgjQ8XA,154
@@ -3639,7 +3638,7 @@ lino/modlib/system/__init__.py,sha256=cXb8cPBr3t18mXtiY_ScqscdUgd6MvSrsHebfqY-SH
3639
3638
  lino/modlib/system/actions.py,sha256=jmSYPQDvIQxDth8MaJ9GpkmSCufLGWjmAjKdHAIWE48,1126
3640
3639
  lino/modlib/system/choicelists.py,sha256=hClsYGgEDAuEYztCiivJlgReBdpDs8z3T_HRcS83ZFg,9578
3641
3640
  lino/modlib/system/mixins.py,sha256=fpj0O1218KgwGhRr8IHYRBXsNt5uXN87qVrx7dxvjys,19031
3642
- lino/modlib/system/models.py,sha256=3BYWRbd1jCIJvUVLHUw53ayQmquNotXVNCH_rVzFSmU,10902
3641
+ lino/modlib/system/models.py,sha256=9cXmONc-LPYMhc9-K63TTC20HrC3S6dHxVA1J7Bt4FQ,10906
3643
3642
  lino/modlib/system/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3644
3643
  lino/modlib/system/fixtures/std.py,sha256=ko6TxoQ6hQvUJT6BYOFBB8-F_kxu8VlRhlEcUg248Uc,102
3645
3644
  lino/modlib/tinymce/__init__.py,sha256=do3zN5Mo2ftsegHTV_KUVaHl44RJ8WHBSS4Jb7BExHs,4879
@@ -4397,7 +4396,7 @@ lino/modlib/uploads/choicelists.py,sha256=-7SODzA_0afrBgPh7-j8kpz0VdzDXy2U7dLhhw
4397
4396
  lino/modlib/uploads/dummy_upload.odt,sha256=VHG2YkykCg8VqoXx8Hm37QYunvdbmg_jCyygiZseKF8,10447
4398
4397
  lino/modlib/uploads/dummy_upload.pdf,sha256=hdAx7s3V10lqVekSGugzkn_Hqxx3V4OkCNVNQI2OsFY,18730
4399
4398
  lino/modlib/uploads/mixins.py,sha256=Vpr7BB0NvDIyG59KnR-j-4KH8CleSGmtjUSrS5YGeu0,8356
4400
- lino/modlib/uploads/models.py,sha256=aqneUEaai_wgmZTtm1Tj5RNc9k3yGQVPzLE2aj7MdCw,17527
4399
+ lino/modlib/uploads/models.py,sha256=d90XVswkatb5MtIGLJMNtxBaKTToVuNyxoqOR691gTc,17535
4401
4400
  lino/modlib/uploads/roles.py,sha256=ae0wf_vC4O6MffDx8abpjW1M2oWOp5VzOvt_ckk72Cc,191
4402
4401
  lino/modlib/uploads/ui.py,sha256=gVQQJUJEfBAESkU5ueKXs_XKZYiXYaIMh1CyNXBrcyk,8666
4403
4402
  lino/modlib/uploads/utils.py,sha256=MQAJbI5sUe0RCXCrkxpNKUJFxHpz1bOMqKQy3QsA76o,3343
@@ -4633,8 +4632,8 @@ lino/utils/xml.py,sha256=EGDnO1UaREst9fS7KTESdbHnrrVCwKbRQdvut6B6GmQ,1612
4633
4632
  lino/utils/mldbc/__init__.py,sha256=QqWRlzeXaOmFfbCk-vTY3SZMn1-FCf67XnpZdd_Nim0,1134
4634
4633
  lino/utils/mldbc/fields.py,sha256=tAX8G5UKigr9c6g0F3ARIjZZtg406mdaZ--PWSbiH9E,2873
4635
4634
  lino/utils/mldbc/mixins.py,sha256=CkYe5jDa7xp9fJq_V8zcZf8ocxgIjUgHc9KZccvA_Yw,1945
4636
- lino-25.4.2.dist-info/METADATA,sha256=8d3X3OB46Yp6iZ6qzfVpolugwultuOMXphYCLHdK7eg,42534
4637
- lino-25.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4638
- lino-25.4.2.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4639
- lino-25.4.2.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4640
- lino-25.4.2.dist-info/RECORD,,
4635
+ lino-25.4.3.dist-info/METADATA,sha256=qsQfxaXAH1QDVcf9nmSab5NgN8yYfHHpyUz8BqGt12E,42534
4636
+ lino-25.4.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4637
+ lino-25.4.3.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4638
+ lino-25.4.3.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4639
+ lino-25.4.3.dist-info/RECORD,,