lino 25.1.4__py3-none-any.whl → 25.1.5__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/__init__.py CHANGED
@@ -26,7 +26,7 @@ defines no models, some template files, a series of :term:`django-admin commands
26
26
 
27
27
  """
28
28
 
29
- __version__ = '25.1.4'
29
+ __version__ = '25.1.5'
30
30
 
31
31
  # import setuptools # avoid UserWarning "Distutils was imported before Setuptools"?
32
32
 
lino/core/requests.py CHANGED
@@ -495,7 +495,7 @@ class BaseRequest:
495
495
  if self.actor is not None:
496
496
  if master is None:
497
497
  master = self.actor.master
498
- if master_type is not None and ContentType is not None:
498
+ if master_type and ContentType is not None:
499
499
  try:
500
500
  master = ContentType.objects.get(pk=master_type).model_class()
501
501
  except ContentType.DoesNotExist:
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2021 Rumma & Ko Ltd
2
+ # Copyright 2021-2025 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
 
5
5
  from lino import logger
@@ -18,7 +18,7 @@ from lino.utils.test import DemoTestCase
18
18
 
19
19
 
20
20
  class TestCase(DemoTestCase):
21
- tested_urls = ("/", "/?su=3", "/?su=1234")
21
+ tested_urls = ("/", "/?su=3", "/?su=123")
22
22
 
23
23
  def test_get(self):
24
24
  if False:
@@ -43,7 +43,7 @@ class TestCase(DemoTestCase):
43
43
  if settings.SITE.user_model:
44
44
  for user in settings.SITE.user_model.objects.all():
45
45
  if user.user_type:
46
- d = self.login(user.username, "1234")
46
+ d = self.login(user.username, dd.plugins.users.demo_password)
47
47
  # self.client.force_login(user)
48
48
  for url in self.tested_urls:
49
49
  # logger.debug("%s gets %s", user.username, url)
@@ -93,7 +93,7 @@ class TestCase(DemoTestCase):
93
93
 
94
94
  # Even with the right password you cannot unlock a blacklisted ip
95
95
  self.assertEqual(
96
- login("1234"), "Too many authentication failures from 127.0.0.1"
96
+ login(dd.plugins.users.demo_password), "Too many authentication failures from 127.0.0.1"
97
97
  )
98
98
 
99
99
  # After max_blacklist_time, the IP gets removed from the blacklist, but
@@ -109,7 +109,7 @@ class TestCase(DemoTestCase):
109
109
  self.assertEqual(rec.login_failures, 5)
110
110
 
111
111
  time.sleep(1)
112
- self.assertEqual(login("1234"), "Now signed in as Robin Rood")
112
+ self.assertEqual(login(dd.plugins.users.demo_password), "Now signed in as Robin Rood")
113
113
 
114
114
  # Once you manage to authenticate, your ip address gets removed from the
115
115
  # blacklist, i.e. when you log out and in for some reason, you get again
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2012-2013 Luc Saffre
2
+ # Copyright 2012-2025 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
  """
5
5
  Writes screenshots to <project_dir>/media/cache/screenshots
@@ -36,6 +36,7 @@ from django.test.testcases import StoppableWSGIServer
36
36
 
37
37
  from lino.core.utils import obj2str, full_model_name, sorted_models_list
38
38
  from lino.utils import screenshots
39
+ from lino.api import dd
39
40
  from rstgen.utils import SubProcessParent
40
41
 
41
42
  PHANTOMJS = "/home/luc/snapshots/phantomjs-1.9.0-linux-i686/bin/phantomjs"
@@ -223,7 +224,7 @@ class Command(BaseCommand):
223
224
  ctx = dict(
224
225
  url=url, target=target, username=ss.ar.get_user().username
225
226
  )
226
- ctx.update(password="1234")
227
+ ctx.update(password=dd.plugins.users.demo_password)
227
228
  ctx.update(remote_user_header=settings.SITE.remote_user_header)
228
229
  f = file("tmp.js", "wt")
229
230
  f.write(JS_SRC % ctx)
@@ -44,11 +44,26 @@ def objects():
44
44
  # use_linod = settings.SITE.use_linod
45
45
  # settings.SITE.use_linod = False
46
46
 
47
- if dd.is_installed("contacts"):
48
- BODIES.items.append("")
49
- MENTIONED = Cycler()
50
- MENTIONED.items += list(rt.models.contacts.Person.objects.all())
51
- MENTIONED.items += list(rt.models.contacts.Company.objects.all())
47
+ # Add two empty bodies that will be filled later:
48
+ BODIES.items.insert(0, "")
49
+ BODIES.items.insert(0, "")
50
+ MENTIONED = Cycler()
51
+ for model in rt.models_by_base(Commentable):
52
+ if model.memo_command is not None:
53
+ MENTIONED.items += list(model.objects.all())
54
+
55
+ # if dd.is_installed("contacts"):
56
+ # BODIES.items.append("")
57
+ # MENTIONED = Cycler()
58
+ # MENTIONED.items += list(rt.models.contacts.Person.objects.all())
59
+ # MENTIONED.items += list(rt.models.contacts.Company.objects.all())
60
+
61
+ if dd.get_plugin_setting("uploads", "with_volumes", False):
62
+ Upload = rt.models.uploads.Upload
63
+ SCREENSHOTS = Cycler(Upload.objects.filter(volume__ref="screenshots"))
64
+ assert len(SCREENSHOTS) > 0
65
+ else:
66
+ SCREENSHOTS = None
52
67
 
53
68
  for model in rt.models_by_base(Commentable):
54
69
  OWNERS = Cycler(model.objects.order_by("-id"))
@@ -73,9 +88,14 @@ def objects():
73
88
  # txt = TXT.pop() # txt = "Hackerish comment"
74
89
  body = BODIES.pop()
75
90
  if not body:
76
- cmd1 = MENTIONED.pop().obj2memo()
77
- cmd2 = MENTIONED.pop().obj2memo()
78
- body = f"This is a comment about {cmd1} and {cmd2}."
91
+ if SCREENSHOTS is None or i % 2:
92
+ cmd1 = MENTIONED.pop().obj2memo()
93
+ cmd2 = MENTIONED.pop().obj2memo()
94
+ body = f"This is a comment about {cmd1} and {cmd2}."
95
+ else:
96
+ upload = SCREENSHOTS.pop()
97
+ body = f"Here is a screenshot:\n\n [file {upload.pk}]"
98
+
79
99
  obj = Comment(user=u, owner=owner, body=body, reply_to=reply_to)
80
100
  obj.on_create(ses)
81
101
  obj.after_ui_create(ses)
@@ -29,13 +29,11 @@ class Plugin(ad.Plugin):
29
29
  """Whether to use PIL, the Python Imaging Library.
30
30
  """
31
31
 
32
- # def on_ui_init(self, kernel):
33
- # super().on_ui_init(kernel)
34
- # self.site.makedirs_if_missing(self.get_uploads_root())
35
- # self.site.makedirs_if_missing(self.get_volumes_root())
36
- #
37
- # print("20240907 created", self.get_uploads_root())
38
- # print("20240907 created", self.get_volumes_root())
32
+ with_volumes = True
33
+ """Whether to use library files (volumes).
34
+ """
35
+ # TODO: Also remove the Volume model and its actors when with_volumes is set
36
+ # to False.
39
37
 
40
38
  def get_uploads_root(self):
41
39
  # return join(self.site.django_settings["MEDIA_ROOT"], "uploads")
@@ -0,0 +1,53 @@
1
+ # -*- coding: UTF-8 -*-
2
+ # Copyright 2015-2025 Rumma & Ko Ltd
3
+ # License: GNU Affero General Public License v3 (see file COPYING for details)
4
+
5
+ import os
6
+ from lino.api import dd, rt
7
+ from lino.modlib.uploads.mixins import make_uploaded_file
8
+
9
+ try:
10
+ from lino_book import DEMO_DATA
11
+ except ImportError:
12
+ DEMO_DATA = None
13
+
14
+ def walk(p):
15
+ # print("20230331", p)
16
+ for c in sorted(p.iterdir()):
17
+ if c.is_dir():
18
+ for cc in walk(c):
19
+ yield cc
20
+ else:
21
+ yield c
22
+
23
+ def objects():
24
+
25
+ if DEMO_DATA is None:
26
+ # logger.info("No demo data because lino_book is not installed")
27
+ return
28
+ if not dd.plugins.uploads.with_volumes:
29
+ return
30
+
31
+ Upload = rt.models.uploads.Upload
32
+ Volume = rt.models.uploads.Volume
33
+
34
+ def load_vol(root_dir, ref, desc, **kwargs):
35
+ vol = Volume(ref=ref, description=desc, root_dir=root_dir)
36
+ yield vol
37
+ kwargs.update(volume=vol)
38
+ chop = len(str(root_dir)) + 1
39
+ for fn in walk(root_dir):
40
+ fns = str(fn)[chop:]
41
+ # print("20230325 {}".format(fn))
42
+ yield Upload(
43
+ library_file=fns,
44
+ description=fns.replace('_', ' ').replace('/', ' '),
45
+ **kwargs)
46
+
47
+ if dd.is_installed('sources'):
48
+ yield (luc := rt.models.sources.Author(first_name="Luc", last_name="Saffre"))
49
+ yield (source := rt.models.sources.Source(
50
+ author=luc, year_published="2022", title="Private collection"))
51
+ yield load_vol(DEMO_DATA / 'photos', "photos", "Photo album", source=source)
52
+
53
+ yield load_vol(DEMO_DATA / 'screenshots', "screenshots", "Screenshots")
lino/modlib/uploads/ui.py CHANGED
@@ -81,7 +81,7 @@ class Uploads(dd.Table):
81
81
  model = "uploads.Upload"
82
82
  # required_roles = dd.login_required((OfficeUser, OfficeOperator))
83
83
  required_roles = dd.login_required(UploadsReader)
84
- column_names = "file type user owner description id *"
84
+ column_names = "id description file type user owner *"
85
85
  order_by = ["-id"]
86
86
  default_display_modes = {
87
87
  70: constants.DISPLAY_MODE_LIST,
@@ -21,6 +21,7 @@ class Plugin(ad.Plugin):
21
21
  with_nickname = False
22
22
  # partner_model = 'contacts.Person'
23
23
  partner_model = "contacts.Partner"
24
+ demo_password = "1234"
24
25
 
25
26
  def pre_site_startup(self, site):
26
27
  super().pre_site_startup(site)
@@ -1,17 +1,18 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2012-2014 Rumma & Ko Ltd
2
+ # Copyright 2012-2025 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
  """
5
- Set password "1234" for all users.
5
+ Set password to :setting:`users.demo_password` for all users.
6
6
 
7
7
  This is an additive fixture designed to work also on existing data.
8
8
 
9
9
  """
10
10
 
11
11
  from django.conf import settings
12
+ from lino.api import dd
12
13
 
13
14
 
14
15
  def objects():
15
16
  for u in settings.SITE.user_model.objects.exclude(user_type=""):
16
- u.set_password("1234")
17
+ u.set_password(dd.plugins.users.demo_password)
17
18
  yield u
lino/modlib/users/ui.py CHANGED
@@ -1,11 +1,7 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2011-2023 Rumma & Ko Ltd
2
+ # Copyright 2011-2025 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
- """Desktop UI for this plugin.
5
-
6
- Documentation is in :doc:`/specs/users` and :doc:`/dev/users`
7
-
8
- """
4
+ # Documentation: :doc:`/specs/users` and :doc:`/dev/users`
9
5
 
10
6
  from datetime import datetime
11
7
  from textwrap import wrap
@@ -135,7 +131,7 @@ class UsersOverview(Users):
135
131
  def row_as_paragraph(cls, ar, self):
136
132
  pv = dict(username=self.username)
137
133
  if settings.SITE.is_demo_site:
138
- pv.update(password="1234")
134
+ pv.update(password=dd.plugins.users.demo_password)
139
135
  btn = rt.models.about.About.get_action_by_name("sign_in")
140
136
  # print btn.get_row_permission(ar, None, None)
141
137
  btn = btn.request(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lino
3
- Version: 25.1.4
3
+ Version: 25.1.5
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,6 +1,6 @@
1
1
  lino/.cvsignore,sha256=1vrrWoP-WD8hPfCszHHIiJEi8KUMRCt5WvoKB9TSB1k,28
2
2
  lino/SciTEDirectory.properties,sha256=rCYi_e-6h8Yx5DwXhAa6MBPlVINcl6Vv9BQDYZV2_go,28
3
- lino/__init__.py,sha256=5iUFhz4TNfwjFGIjiyQTXaMFRg1C8lAmxgHDQV6XFEU,5584
3
+ lino/__init__.py,sha256=Mra9LM9wR3fgRgjFBaSaezhNxDMo36zcQqJfCHpCRhY,5584
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
@@ -56,7 +56,7 @@ lino/core/model.py,sha256=MNTlg53WbKXPIne5wOHtO5V3nLdxoYTBMosz9JdFQJU,36386
56
56
  lino/core/permissions.py,sha256=Fnemz3NwWz21X0YATI9Q7ba2FcAdg-EMLHjIcbt_AVU,6840
57
57
  lino/core/plugin.py,sha256=oVvTsGoBBYmjvRgtyiFPIiHZQErH0ZlNjiUFtOk2dOM,6834
58
58
  lino/core/renderer.py,sha256=jIXxNSpljZhb9tBMhUfDNbZD3XmxYzaS6SlipHx29L4,47291
59
- lino/core/requests.py,sha256=DijyPSRmwVbuco-JAHy7gZZMyOxA-cXPnVQ3rbpw9Fs,92834
59
+ lino/core/requests.py,sha256=DAen9Jys3RfDMRQNbQFAo_h7iUipe7khhXTVT4RvcNY,92822
60
60
  lino/core/roles.py,sha256=PXwk436xUupxdbJcygRSYFu7ixfKjAJPQRUQ8sy0lB0,4425
61
61
  lino/core/signals.py,sha256=0JT89mkjSbRm57QZcSI9DoThoKUGkyi-egNhuLUKEds,948
62
62
  lino/core/site.py,sha256=lEPAEF4OyBsF8NLy3y9O0GOcC5C1REc9ug9mIZR-mIs,83150
@@ -97,14 +97,14 @@ lino/locale/zh_Hant/LC_MESSAGES/django.po,sha256=KWejkd_imTiK-SX6BG_bfEGtGIWEQ-b
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=QjhvKKdp1mX6rl8Y5rcS6kUK2LVOBVAd6wrUKLYSGF8,448
100
- lino/management/commands/demotest.py,sha256=xnqRRFvKZ94pcWSlepFFAR7ycC4c2ppWqSRsSGj__Ac,4844
100
+ lino/management/commands/demotest.py,sha256=543acKUeqliMSgI_21ylSMvMlMpnjJej065MdSIkzNo,4920
101
101
  lino/management/commands/diag.py,sha256=vt-NlZUx5gf7T4EpbM-gle3tAwMuwfPQY8lUgxjFaUw,478
102
102
  lino/management/commands/dump2py.py,sha256=DyvhXYPJY7-Tt_xyw4_U5WjVeobcOU5AhWRZB6l4esI,20329
103
103
  lino/management/commands/dump_settings.py,sha256=tGOR4h_ueVe2DOk84ILFvzvndt0doshvaxRkybB-rnY,2009
104
104
  lino/management/commands/initdb.py,sha256=U1yu7JoPG3sDVYmn985Z73oux1zPHl7Ur_U5UJbMBb4,11467
105
105
  lino/management/commands/install.py,sha256=PljQJecr9s8rk5caR4rW0Fg1mL3S9JJHp6NqgB8bWTs,1888
106
106
  lino/management/commands/makemigdump.py,sha256=TvNnFFjD6XRMFLbX8IEMSNDKTMPLTBCi8i5SRNcpYD8,1279
107
- lino/management/commands/makescreenshots.py,sha256=VkTMmlRzG8JyxQne3bDm4ONXY5-dW0RmiJZvbbOGEDo,8615
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
110
  lino/management/commands/monitor.py,sha256=-axtsW-uzk87ESR6-GSfUL0Y2ylB5BwHC6Xlx3fPxo4,5113
@@ -180,7 +180,7 @@ lino/modlib/comments/roles.py,sha256=z3gctvlTa_5PAs-D4pounyzNyuEc31jTFq9g33r6Z1w
180
180
  lino/modlib/comments/ui.py,sha256=w72vOmK8fn6H13t2aPS7ydYU1fCsbbMH2-TSNWt3pwA,9799
181
181
  lino/modlib/comments/config/comments/comments.js,sha256=7oAnNyx_MKM1iWPu-QSp6iKfnOVdgq7EciQPpxTvYU8,242
182
182
  lino/modlib/comments/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
- lino/modlib/comments/fixtures/demo2.py,sha256=YxzgXaQeH3bum5_7473ie4hJtHfKSChuR19sTBSd4fo,24466
183
+ lino/modlib/comments/fixtures/demo2.py,sha256=mi1LY0-hotH-BG34bGgvCXkvDhVJPQ4uDfzKCicSIRM,25248
184
184
  lino/modlib/dashboard/__init__.py,sha256=_PFbmakUn8DShXyJY3EfAcuZtX5ofWnS-8dk7s1CrLw,1420
185
185
  lino/modlib/dashboard/models.py,sha256=EgRNg88dmz-OlIdi1SyEuerWMsRqKIfqE2MgKL7kApw,3510
186
186
  lino/modlib/dupable/__init__.py,sha256=fIQ8wj-T8ZbkjwQgW_-ankJsHLjPMepOTo32mJXNCvI,532
@@ -4388,7 +4388,7 @@ lino/modlib/tinymce/static/tinymce-4.1.10/skins/lightgray/img/loader.gif,sha256=
4388
4388
  lino/modlib/tinymce/static/tinymce-4.1.10/skins/lightgray/img/object.gif,sha256=5qFeUrxKF7CFBzuo3r1HCOrWrj1MvrOIDGXLevxIl3c,152
4389
4389
  lino/modlib/tinymce/static/tinymce-4.1.10/skins/lightgray/img/trans.gif,sha256=nPAg18O7p_WrEM2lSqvvk0-QbU-aOs-Z6efcbJhXljU,43
4390
4390
  lino/modlib/tinymce/static/tinymce-4.1.10/themes/modern/theme.min.js,sha256=w41NrMzqdGEDk6OhjeuElBHlIr5Ntt_QpdoxNRFXa3Q,6431
4391
- lino/modlib/uploads/__init__.py,sha256=vM3gC8xZ-JdOf1EuNipJyHIhg5V8rLLWCPWTCKLp5aU,2830
4391
+ lino/modlib/uploads/__init__.py,sha256=S6RNBs5vwCTnoAkPGRGWBQdKp1uOzWngc_B19iAmGsg,2675
4392
4392
  lino/modlib/uploads/actions.py,sha256=lSdMmMmFaJRkJ2JkMX0aOVFNiisGVcI3PP3WqSQmK1E,1402
4393
4393
  lino/modlib/uploads/choicelists.py,sha256=RVKLCEDly9VUa183ul5U9DRla8yOkMxrP4qMjTC5410,1327
4394
4394
  lino/modlib/uploads/dummy_upload.odt,sha256=VHG2YkykCg8VqoXx8Hm37QYunvdbmg_jCyygiZseKF8,10447
@@ -4396,24 +4396,25 @@ lino/modlib/uploads/dummy_upload.pdf,sha256=hdAx7s3V10lqVekSGugzkn_Hqxx3V4OkCNVN
4396
4396
  lino/modlib/uploads/mixins.py,sha256=4CSTEDU0ZBfdCV5RqV9SGc3r0rH7TlaGdB7tGGlVN-o,8000
4397
4397
  lino/modlib/uploads/models.py,sha256=ATLVrV1cbmUj7Kv_pLOmBz3IkKpvYBjGriv74AkjD0M,16528
4398
4398
  lino/modlib/uploads/roles.py,sha256=ae0wf_vC4O6MffDx8abpjW1M2oWOp5VzOvt_ckk72Cc,191
4399
- lino/modlib/uploads/ui.py,sha256=Iu06xyKaTKbw2YfTgDJYWQVXuUuVAqENgnfnscViL_c,8456
4399
+ lino/modlib/uploads/ui.py,sha256=dc17OUf8R6jqFFt6qzfCkBHIiMKEhoOBGFw0esWfA2g,8456
4400
4400
  lino/modlib/uploads/utils.py,sha256=MQAJbI5sUe0RCXCrkxpNKUJFxHpz1bOMqKQy3QsA76o,3343
4401
4401
  lino/modlib/uploads/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4402
+ lino/modlib/uploads/fixtures/demo.py,sha256=XY5oNgPvlPcL3B3nBMkqpAkfRZ0WGsr_2edOlpWTcF8,1661
4402
4403
  lino/modlib/uploads/fixtures/demo3.py,sha256=q0bwZrx5XtRsRlFpsa33fL0sCl7IdCYaP9E1rhCnJt4,547
4403
- lino/modlib/users/__init__.py,sha256=QHLCNKiRMyL14Iy2eiz7_y9fAwugnDCt4N0aKtIhFA8,3188
4404
+ lino/modlib/users/__init__.py,sha256=40f-PheIyHqAzGXQbkvEKAnZ9_bb8RkaLAKIqNE96qg,3215
4404
4405
  lino/modlib/users/actions.py,sha256=Nik2CoxKZWoGIsPT50mWESzHSTQx9WiBXWG64CUFyS8,18074
4405
4406
  lino/modlib/users/choicelists.py,sha256=-X76C1NxIs5e7rFHp5Z0kjJkA1NlOP2vdLKGkI2wZRU,3876
4406
4407
  lino/modlib/users/mixins.py,sha256=cMmTtR1-w9iWgdPlNF5kMybDR41D5kd1waGxEROSvSE,14150
4407
4408
  lino/modlib/users/models.py,sha256=tdROzvtd3cMxsXKtYZjcUv2XJU7hQLbyBCiE0zVvaOo,16470
4408
4409
  lino/modlib/users/roles.py,sha256=yi29ELbWU1VtteGARaxetxmsCkZQHA2oJiD0dXujMiE,320
4409
- lino/modlib/users/ui.py,sha256=kRuCCEK77ZhHj3kawio6NTcAvEixwupKkVnQ5LByCEc,13143
4410
+ lino/modlib/users/ui.py,sha256=WA1bqVx1Z4yQzydHhvw_d5yE-teKdkHqd36ynz9ivPk,13127
4410
4411
  lino/modlib/users/utils.py,sha256=bD0DJZsUy59xw9N-tx3W_h30_R10GT2qXZVzYtGWMa8,1963
4411
4412
  lino/modlib/users/config/users/verification_response.html,sha256=8X1sEn53ploQgB6ds0UfmmkZpcvP9KSwWiQjRE_q970,772
4412
4413
  lino/modlib/users/config/users/welcome_email.eml,sha256=bPSPbJKIPFRVWPDCuhNquQYwQtXzYGZgs7wICoiutS8,1078
4413
4414
  lino/modlib/users/config/users/User/welcome.body.html,sha256=5k1cVYdYUd0vDLUzyRBtGy52A027wpRiGYLbdgaOKs0,141
4414
4415
  lino/modlib/users/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4415
4416
  lino/modlib/users/fixtures/demo.py,sha256=YHPhvjqAh-V9WHgFct2GQlQATZmS-W3Nry-X6mI05z8,199
4416
- lino/modlib/users/fixtures/demo2.py,sha256=4-toQfGIkJF8eROS1FgBxP6w-EiKOI7QBoHcIO2T0dw,420
4417
+ lino/modlib/users/fixtures/demo2.py,sha256=j2ke91wvpHs3kHpeztzV3nOG4rJvavkHv2YJo0dISdI,495
4417
4418
  lino/modlib/users/fixtures/demo_users.py,sha256=FJz5gW95PbgxrPD8BMSVnpA8SJJSPWtjyi3LMdytd5o,1805
4418
4419
  lino/modlib/users/fixtures/std.py,sha256=Eo_TdqFC7NPryLeGRfp-nbOXw3hDqxTUpddFTxUuZ74,712
4419
4420
  lino/modlib/weasyprint/__init__.py,sha256=_kLw0xg5_ByLv4l5VvQbZjTtloTM4c9WrpfFgOGMPVc,2344
@@ -4648,8 +4649,8 @@ lino/utils/xml.py,sha256=4Z44W1e5HvTVrU8erkohgnwqY-5Cr2NHywaAJ5OgRvw,989
4648
4649
  lino/utils/mldbc/__init__.py,sha256=QqWRlzeXaOmFfbCk-vTY3SZMn1-FCf67XnpZdd_Nim0,1134
4649
4650
  lino/utils/mldbc/fields.py,sha256=tAX8G5UKigr9c6g0F3ARIjZZtg406mdaZ--PWSbiH9E,2873
4650
4651
  lino/utils/mldbc/mixins.py,sha256=CkYe5jDa7xp9fJq_V8zcZf8ocxgIjUgHc9KZccvA_Yw,1945
4651
- lino-25.1.4.dist-info/METADATA,sha256=k3hFLehospJnAypZq6TLEZbj_UZ5sh2UwBbKAWImOFo,42534
4652
- lino-25.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4653
- lino-25.1.4.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4654
- lino-25.1.4.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4655
- lino-25.1.4.dist-info/RECORD,,
4652
+ lino-25.1.5.dist-info/METADATA,sha256=wGSveOojnYjUFx-8Ag72a9SoTwNUYFaaJ-Ce9LfUzPA,42534
4653
+ lino-25.1.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4654
+ lino-25.1.5.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4655
+ lino-25.1.5.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4656
+ lino-25.1.5.dist-info/RECORD,,
File without changes