lino 25.1.2__py3-none-any.whl → 25.1.4__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.2'
29
+ __version__ = '25.1.4'
30
30
 
31
31
  # import setuptools # avoid UserWarning "Distutils was imported before Setuptools"?
32
32
 
lino/core/actions.py CHANGED
@@ -1091,6 +1091,7 @@ class CreateRow(Action):
1091
1091
  return
1092
1092
 
1093
1093
  ar.goto_instance(elem)
1094
+ # print(f"20250121d eval_js response for {ar} is {ar.response['eval_js']}")
1094
1095
 
1095
1096
  # No need to ask refresh_all since closing the window will
1096
1097
  # automatically refresh the underlying window.
lino/core/fields.py CHANGED
@@ -1336,6 +1336,7 @@ class TableRow(object):
1336
1336
  if dt is not None:
1337
1337
  a = dt.get_request_detail_action(ar)
1338
1338
  # a = dt.detail_action
1339
+ # print(f"20250121 {ar} {ar.actor} {dt} {a}")
1339
1340
  if a is None or ar is None:
1340
1341
  return a
1341
1342
  if a.get_view_permission(ar.get_user().user_type):
lino/core/layouts.py CHANGED
@@ -805,7 +805,9 @@ class ParamsLayout(BaseLayout):
805
805
  def get_data_elem(self, name):
806
806
  de = self._datasource.get_param_elem(name)
807
807
  if de is None:
808
- de = self._datasource.get_data_elem(name)
808
+ # no longer return a data element when no param element exists:
809
+ raise Exception(f"No parameter '{name}' in {self._datasource}")
810
+ # de = self._datasource.get_data_elem(name)
809
811
  de.editable = True # 20200425
810
812
  # if "__" in name:
811
813
  # print("20200425 ParamsLayout.get_data_elem()", name, de)
lino/core/renderer.py CHANGED
@@ -101,6 +101,11 @@ class Renderer(object):
101
101
  not_implemented_js = None
102
102
  extjs_version = None
103
103
 
104
+ support_dashboard_layout = False
105
+ """Don't show dashboard items when rendering :xfile:`admin_main.html`.
106
+
107
+ """
108
+
104
109
  def __init__(self, front_end=None):
105
110
  # if not isinstance(plugin, Plugin):
106
111
  # raise Exception("{} is not a Plugin".format(plugin))
lino/core/requests.py CHANGED
@@ -2123,11 +2123,11 @@ class ActionRequest(BaseRequest):
2123
2123
  if self._status is not None and not kw:
2124
2124
  return self._status
2125
2125
  if self.actor.parameters:
2126
- kw.update(
2127
- param_values=self.actor.params_layout.params_store.pv2dict(
2128
- self, self.param_values
2129
- )
2130
- )
2126
+ pv = self.actor.params_layout.params_store.pv2dict(self, self.param_values)
2127
+ # print(f"20250121c {self}\n{self.actor.params_layout.params_store.__class__}\n{self.actor.params_layout.params_store.param_fields}")
2128
+ # print(f"20250121c {self} {self.param_values.keys()}\n{self.actor.params_layout}\n{pv.keys()}")
2129
+ # print(f"20250121c {self}|{self.actor.params_layout.params_store}\n{}")
2130
+ kw.update(param_values=pv)
2131
2131
 
2132
2132
  kw = self.bound_action.action.get_status(self, **kw)
2133
2133
  bp = kw.setdefault("base_params", {})
lino/core/store.py CHANGED
@@ -1078,11 +1078,12 @@ class BaseStore(object):
1078
1078
 
1079
1079
 
1080
1080
  class ParameterStore(BaseStore):
1081
- # instantiated in `lino.core.layouts`
1081
+ # Lazily instantiated in `lino.core.layouts`
1082
1082
  def __init__(self, params_layout_handle, url_param):
1083
- self.param_fields = []
1083
+ param_fields = []
1084
1084
 
1085
1085
  holder = params_layout_handle.layout.get_chooser_holder()
1086
+ # print(f"20250121e {holder}")
1086
1087
  # debug = False
1087
1088
  for pf in params_layout_handle._data_elems:
1088
1089
  sf = create_atomizer(holder, pf, pf.name)
@@ -1090,12 +1091,12 @@ class ParameterStore(BaseStore):
1090
1091
  # if "__" in pf.name:
1091
1092
  # print("20200423 ParameterStore", pf.name, sf)
1092
1093
  # debug = True
1093
- self.param_fields.append(sf)
1094
+ param_fields.append(sf)
1094
1095
 
1095
1096
  # if debug:
1096
1097
  # print("20200423 ParameterStore2", self.param_fields)
1097
1098
 
1098
- self.param_fields = tuple(self.param_fields)
1099
+ self.param_fields = tuple(param_fields)
1099
1100
  self.url_param = url_param
1100
1101
  self.params_layout_handle = params_layout_handle
1101
1102
 
Binary file
@@ -8,7 +8,7 @@ msgstr ""
8
8
  "Project-Id-Version: \n"
9
9
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
10
  "POT-Creation-Date: 2024-11-16 21:41+0200\n"
11
- "PO-Revision-Date: 2024-11-16 21:42+0200\n"
11
+ "PO-Revision-Date: 2025-01-18 21:35+0200\n"
12
12
  "Last-Translator: Luc Saffre <luc.saffre@gmail.com>\n"
13
13
  "Language-Team: \n"
14
14
  "Language: fr\n"
@@ -5716,7 +5716,7 @@ msgstr "Bienvenue sur <b>%s</b>."
5716
5716
 
5717
5717
  #: lino/modlib/publisher/choicelists.py:234
5718
5718
  msgid "Terms and conditions"
5719
- msgstr ""
5719
+ msgstr "Conditions générales"
5720
5720
 
5721
5721
  #: lino/modlib/publisher/choicelists.py:235
5722
5722
  msgid "Privacy policy"
@@ -5729,12 +5729,11 @@ msgstr "Mes préférences"
5729
5729
 
5730
5730
  #: lino/modlib/publisher/choicelists.py:237
5731
5731
  msgid "Copyright"
5732
- msgstr ""
5732
+ msgstr "Droits d'auteur"
5733
5733
 
5734
5734
  #: lino/modlib/publisher/choicelists.py:238
5735
- #, fuzzy
5736
5735
  msgid "About us"
5737
- msgstr "à propos"
5736
+ msgstr "À propos"
5738
5737
 
5739
5738
  #: lino/modlib/publisher/models.py:55
5740
5739
  #, fuzzy
@@ -30,6 +30,7 @@ cond_comment = (
30
30
  )
31
31
  plain1 = "Some plain text."
32
32
  plain2 = "Two paragraphs of plain text.\n\nThe second paragraph."
33
+ # plain2 += " With an 👁 (U+1F441)." #5855 (Jane fails to store certain unicode characters)
33
34
 
34
35
  BODIES = Cycler(
35
36
  [styled, table, lorem, short_lorem, breaking, cond_comment, plain1, plain2]
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2011-2024 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
4
 
5
5
  import datetime
@@ -8,11 +8,13 @@ from dateutil.rrule import SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, Y
8
8
 
9
9
  from django.conf import settings
10
10
  from django.db.models import Q
11
+ from django.db import models
11
12
  from django.utils.translation import gettext_lazy as _
12
13
 
13
14
  from lino.utils import isidentifier
14
15
  from lino.core.choicelists import ChoiceList, Choice
15
16
  from lino.core.roles import login_required, Explorer
17
+ from lino.core.fields import virtualfield
16
18
  from lino.utils.dates import DateRangeValue
17
19
  from lino.utils.format_date import day_and_month, fds
18
20
  from lino.utils.html import mark_safe, format_html
@@ -233,6 +235,11 @@ class DisplayColors(ChoiceList):
233
235
  verbose_name_plural = _("Display colors")
234
236
  item_class = DisplayColor
235
237
  required_roles = login_required(Explorer)
238
+ column_names = "value name text font_color"
239
+
240
+ @virtualfield(models.CharField(_("Font color")))
241
+ def font_color(cls, choice, ar):
242
+ return choice.font_color
236
243
 
237
244
  # TODO: The combobox used to select a color should include a sample of each
238
245
  # color. The following should theoretically do it, but the <span> tag gets
@@ -241,7 +248,9 @@ class DisplayColors(ChoiceList):
241
248
  # def display_text(cls, bc):
242
249
  # sample = f"""<span style="background-color:{bc.name};color:{bc.font_color}">(sample)</span>"""
243
250
  # sample = mark_safe(sample)
244
- # return format_html("{} {}", bc.text, sample)
251
+ # txt = format_html("{} {}", bc.text, sample)
252
+ # # raise Exception(f"20250118 {txt.__class__}")
253
+ # return txt
245
254
 
246
255
  add = DisplayColors.add_item
247
256
  # cssColors = 'White Silver Gray Black Red Maroon Yellow Olive Lime Green Aqua Teal Blue Navy Fuchsia Purple'
@@ -269,13 +278,20 @@ add("260", _("Magenta"), "magenta","white")
269
278
  add("270", _("Violet"), "violet", "white")
270
279
 
271
280
  # Other colors
272
- add("300", _("Silver"), "silver", "black")
273
- add("310", _("Maroon"), "maroon", "white")
274
- add("311", _("Peru"), "peru", "white")
275
- add("320", _("Olive"), "olive", "white")
276
- add("330", _("Aqua"), "aqua", "white")
277
- add("340", _("Navy"), "navy", "white")
278
- add("350", _("Fuchsia"), "fuchsia","white")
279
- add("351", _("Purple"), "purple", "white")
281
+ add("300", _("Silver"), "silver", "black")
282
+ add("310", _("Maroon"), "maroon", "white")
283
+ add("311", _("Peru"), "peru", "white")
284
+ add("312", _("Pink"), "pink", "black")
285
+ add("320", _("Olive"), "olive", "white")
286
+ add("330", _("Aqua"), "aqua", "white")
287
+ add("340", _("Navy"), "navy", "white")
288
+ add("341", _("Aquamarine"), "aquamarine", "black")
289
+ add("342", _("DarkGreen"), "darkgreen", "white")
290
+ add("343", _("PaleGreen"), "palegreen", "black")
291
+ add("344", _("Chartreuse"), "chartreuse", "black")
292
+ add("345", _("Lime"), "lime", "black")
293
+ add("350", _("Fuchsia"), "fuchsia", "white")
294
+ add("351", _("Cyan"), "cyan", "black")
295
+ add("361", _("Purple"), "purple", "white")
280
296
 
281
297
  # List of all named colors: https://www.w3schools.com/colors/colors_names.asp
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2010-2024 Rumma & Ko Ltd
2
+ # Copyright 2010-2025 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
 
5
5
  from os.path import splitext
@@ -8,9 +8,14 @@ from django.utils.text import format_lazy
8
8
  from lino.api import dd, rt, _
9
9
  from lino.utils import needs_update
10
10
 
11
- if (with_thumbnails := dd.get_plugin_setting('uploads', 'with_thumbnails', False)):
11
+ try:
12
12
  from PIL import Image # pip install Pillow
13
13
  import pymupdf # pip install PyMuPDF
14
+ except ImportError:
15
+ pass
16
+
17
+ with_thumbnails = dd.get_plugin_setting('uploads', 'with_thumbnails', False)
18
+
14
19
 
15
20
  class UploadMediaFile:
16
21
 
@@ -103,11 +108,3 @@ if with_thumbnails:
103
108
  previewer = FilePreviewer("thumbs", 720)
104
109
  else:
105
110
  previewer = Previewer()
106
-
107
- # full = Previewer()
108
- # if with_thumbnails:
109
- # small = FilePreviewer("thumbs", 720)
110
- # else:
111
- # small = full
112
-
113
- # Lino currently offers only two previewers, "full" and "small"
lino/utils/dbfreader.py CHANGED
@@ -12,16 +12,15 @@ http://www.the-oasis.net/clipper-12.html#ss12.4
12
12
 
13
13
  http://www.clicketyclick.dk/databases/xbase/format/
14
14
  """
15
- from __future__ import print_function
16
- from builtins import hex
17
- from builtins import str
18
- from builtins import object
15
+ # from builtins import hex
16
+ # from builtins import str
17
+ # from builtins import object
19
18
 
20
19
  import datetime
21
20
  from dateutil import parser as dateparser
22
21
 
23
22
  import sys
24
- import string
23
+ # import string
25
24
 
26
25
  codepages = {
27
26
  "\x01": "cp437",
@@ -32,28 +31,29 @@ codepages = {
32
31
 
33
32
 
34
33
  def unpack_long(number):
35
- return ord(number[0]) + 256 * (
36
- ord(number[1]) + 256 * (ord(number[2]) + 256 * ord(number[3]))
34
+ # print(f"20250123 unpack_long {number}")
35
+ return number[0] + 256 * (
36
+ number[1] + 256 * (number[2] + 256 * number[3])
37
37
  )
38
38
 
39
39
 
40
40
  def unpack_long_rev(number):
41
- return ord(number[3]) + 256 * (
42
- ord(number[2]) + 256 * (ord(number[1]) + 256 * ord(number[0]))
41
+ return number[3] + 256 * (
42
+ number[2] + 256 * (number[1] + 256 * number[0])
43
43
  )
44
44
 
45
45
 
46
46
  def unpack_int(number):
47
- return ord(number[0]) + 256 * ord(number[1])
47
+ return number[0] + 256 * number[1]
48
48
 
49
49
 
50
50
  def unpack_int_rev(number):
51
- return ord(number[1]) + 256 * ord(number[0])
51
+ return number[1] + 256 * number[0]
52
52
 
53
53
 
54
54
  def hex_analyze(number):
55
55
  for ch in number:
56
- print("%s\t%s\t%d" % (hex(ord(ch)), ch, ord(ch)))
56
+ print("%s\t%s\t%d" % (hex(ch), ch, ch))
57
57
 
58
58
 
59
59
  # def sort_by_key(list,key_func):
@@ -76,56 +76,52 @@ class DBFFile(object):
76
76
  HAS_MEMO_FILE = 128 # "\x80"
77
77
 
78
78
  versionmap = {
79
- "\x03": "dBASE III",
80
- "\x83": "dBASE III+ with memo",
81
- "\x8B": "dBASE IV with memo",
82
- "\xF5": "FoxPro with memo",
79
+ 0x03: "dBASE III",
80
+ 0x83: "dBASE III+ with memo",
81
+ 0x8B: "dBASE IV with memo",
82
+ 0xF5: "FoxPro with memo",
83
83
  }
84
84
 
85
85
  def __init__(self, filename, codepage=None):
86
86
  self.filename = filename
87
-
88
87
  infile = open(self.filename, "rb")
89
88
 
90
- # Read header
91
-
89
+ # Read header:
92
90
  header = infile.read(32)
93
-
94
91
  self.version = header[0]
95
- year = ord(header[1]) + 2000
96
- month = ord(header[2])
97
- day = ord(header[3])
92
+ year = header[1] + 2000
93
+ month = header[2]
94
+ day = header[3]
98
95
  self.lastUpdate = datetime.date(year, month, day)
99
-
96
+ # print(f"20250123 Loading {filename} (last updated {self.lastUpdate})")
100
97
  self.rec_num = unpack_long(header[4:8])
101
-
102
98
  self.first_rec = unpack_int(header[8:10])
103
-
104
99
  self.rec_len = unpack_int(header[10:12])
105
-
106
100
  self.codepage = codepage # s[header[29]]
107
101
 
108
- # Read field defs
109
-
102
+ # Read field defs:
110
103
  self.fields = {}
111
104
  self.field_list = []
112
105
  while 1:
113
106
  ch = infile.read(1)
114
- if ch == "\x0D":
107
+ # if ch == 0x0D:
108
+ if ch == b'\r':
115
109
  break
116
110
  field = DBFField(ch + infile.read(31), self)
117
111
  self.fields[field.name] = field
118
112
  self.field_list.append(field)
113
+ # if len(self.field_list) > 20:
114
+ # sys.exit(1)
119
115
 
120
116
  infile.close()
121
117
  if self.has_memo():
122
- if self.version == "\x83":
118
+ if self.version == 0x83:
123
119
  self.blockfile = DBTFile(self)
124
120
  else:
125
121
  self.blockfile = FPTFile(self)
126
122
 
127
123
  def has_memo(self):
128
- if ord(self.version) & self.HAS_MEMO_FILE:
124
+ if self.version & self.HAS_MEMO_FILE:
129
125
  return True
130
126
  return False
131
127
 
@@ -166,12 +162,12 @@ class DBFFile(object):
166
162
  values = {}
167
163
  ch = self.infile.read(1)
168
164
  self.recno += 1
169
- if ch == "*":
165
+ if ch == 0x1A or len(ch) == 0:
166
+ return None
167
+ if ch == b"*":
170
168
  deleted = True
171
169
  # Skip the record
172
170
  # return self.get_next_record()
173
- elif ch == "\x1A" or ch == "":
174
- return None
175
171
  else:
176
172
  deleted = False
177
173
 
@@ -259,14 +255,15 @@ class DBFField(object):
259
255
  }
260
256
 
261
257
  def __init__(self, buf, dbf):
262
- pos = string.find(buf, "\x00")
258
+ pos = buf.find(0)
263
259
  if pos == -1 or pos > 11:
264
260
  pos = 11
265
- self.name = buf[:pos]
266
- self.field_type = buf[11]
261
+ self.name = buf[:pos].decode()
262
+ # print(f"20250123 field {self.name}")
263
+ self.field_type = chr(buf[11])
267
264
  self.field_pos = unpack_long(buf[12:16])
268
- self.field_len = ord(buf[16])
269
- self.field_places = ord(buf[17])
265
+ self.field_len = buf[16]
266
+ self.field_places = buf[17]
270
267
  self.dbf = dbf
271
268
 
272
269
  # if self.field_type=="M" or self.field_type=="P" or \
@@ -289,6 +286,8 @@ class DBFField(object):
289
286
  return self.field_len
290
287
 
291
288
  def interpret(self, data):
289
+ # raise Exception("20250123 good")
290
+ # print(f"20250123 interpret {repr(self.field_type)}")
292
291
  if self.field_type == "C":
293
292
  if not self.dbf.codepage is None:
294
293
  data = data.decode(self.dbf.codepage)
@@ -301,7 +300,8 @@ class DBFField(object):
301
300
  return data == "Y" or data == "y" or data == "T" or data == "t"
302
301
  elif self.field_type == "M":
303
302
  try:
304
- num = string.atoi(data)
303
+ # num = string.atoi(data)
304
+ num = int(data)
305
305
  except ValueError:
306
306
  if len(data.strip()) == 0:
307
307
  # ~ return None
@@ -311,7 +311,8 @@ class DBFField(object):
311
311
 
312
312
  elif self.field_type == "N":
313
313
  try:
314
- return string.atoi(data)
314
+ # return string.atoi(data)
315
+ return int(data)
315
316
  except ValueError:
316
317
  return 0
317
318
  elif self.field_type == "D":
@@ -366,28 +367,28 @@ class DBTFile(object):
366
367
  def __init__(self, dbf):
367
368
  self.dbf = dbf
368
369
  self.filename = dbf.filename[:-4] + ".DBT"
369
- # print "DBTFile", self.filename
370
370
  self.blocksize = 512
371
+ # print(f"20250123 Opening DBTFile {self.filename}")
371
372
 
372
373
  def get_block(self, number):
373
374
  infile = open(self.filename, "rb")
374
375
  infile.seek(512 + self.blocksize * (number - 1))
375
- data = ""
376
+ data = b""
376
377
  while True:
377
378
  buf = infile.read(self.blocksize)
378
- # if len(buf) != self.blocksize:
379
- # print str(number)+":"+str(len(buf))
380
- ## data += buf
381
- # break
379
+ if len(buf) != self.blocksize:
380
+ raise Exception(f"20250123 {number}:{len(buf)}")
381
+ data += buf
382
+ break
382
383
  data += buf
383
- pos = data.find("\x1A")
384
+ pos = data.find(0x1A)
384
385
  # pos = data.find("\x1A\x1A")
385
386
  if pos != -1:
386
387
  data = data[:pos]
387
388
  break
388
389
 
389
390
  infile.close()
390
- if not self.dbf.codepage is None:
391
+ if self.dbf.codepage is not None:
391
392
  data = data.decode(self.dbf.codepage)
392
393
  # clipper adds "soft CR's" to memo texts. we convert them to
393
394
  # simple spaces:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lino
3
- Version: 25.1.2
3
+ Version: 25.1.4
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=cC6qgZ8ZAy5xkNERJhM9rWpDG7RC_GHwbTsWeO3ueXs,5584
3
+ lino/__init__.py,sha256=5iUFhz4TNfwjFGIjiyQTXaMFRg1C8lAmxgHDQV6XFEU,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
@@ -28,7 +28,7 @@ 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=T7106QxQpa3jXAouGTIer6AXEwpkJ0NAQ9B7Q3-K6qE,686
31
- lino/core/actions.py,sha256=_DIvjr1gb6Z29mqWcwv6snZ8MOiWdZSoBIiCViQndk8,46311
31
+ lino/core/actions.py,sha256=RiyuaK5F-VE6S7FVgSivOBx74F9H4uwGFOMEhXt66Rg,46395
32
32
  lino/core/actors.py,sha256=lsp-w2kC_t_-iqeHtIYIkIPoS_jbHgZ3MZlGJWH2dyc,73663
33
33
  lino/core/boundaction.py,sha256=tb0C4WwbJpAP3yKbR6OaibzcAkwVs3nfeuD0RjXTjIg,6665
34
34
  lino/core/callbacks.py,sha256=xkosb1l48o6WeSdj82k5udK9OmjI7-p6x4AJFjXiOf8,7518
@@ -42,25 +42,25 @@ lino/core/ddh.py,sha256=dYScxWKTOCDEgow7wJNJe812ESasmmITPK2ovraBQno,3172
42
42
  lino/core/diff.py,sha256=XQ-oQQDS_v3kXd4eRP9Hwr5UCgp-TPZIPVav9ZblUno,5882
43
43
  lino/core/elems.py,sha256=wgRDDDHlEjN1el37Mgt8yvsLlLNgunr4_vSA4iFLsUM,108454
44
44
  lino/core/exceptions.py,sha256=QDxDo5cllSyXQ8VWet9hGXzNadxCOmwMVrFXc6V-vpE,665
45
- lino/core/fields.py,sha256=3h4FFVvWDncXAlOAsLvPalXjpSSZed_49M7Fp183uRw,57273
45
+ lino/core/fields.py,sha256=0vK0F4LCqwwjLXA3sA7qG4jR9OvQF9EgIDVcsac9Qh0,57335
46
46
  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=o9pHxWBuo15vpGN5pwCsWVNk2awrMuBigOHiua78v4I,13413
50
50
  lino/core/kernel.py,sha256=gqx1dqVpahdxNPejLcVm9c7JX3qlajosEJ-yEQTgHCU,48275
51
51
  lino/core/keyboard.py,sha256=imdO-J5npZijtddhM2C7CLo2K6Hp30egsXgOOa4-AqQ,1137
52
- lino/core/layouts.py,sha256=vMoSwgNK-G4vOF5pcs5OhS73Q3YOvuVlCC1LgoIzb-Y,28509
52
+ lino/core/layouts.py,sha256=Wojx5UUyhy7PsZE8FWmiXcmZDj4wz2y_1_wlz1G560Q,28663
53
53
  lino/core/menus.py,sha256=BoPtcqtTB1-ADp3ffnzEXyIx8lQ4HLaZWxo0eQrj-T4,10850
54
54
  lino/core/merge.py,sha256=sKtTeZtHdoDKerdHj4NXuXXNzpKDsfdPaiq-CY0NqQc,9094
55
55
  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
- lino/core/renderer.py,sha256=PcySnp_KUfwWYfxzB5DFqwLtmA5931ocB-DGnR7oyQw,47169
59
- lino/core/requests.py,sha256=6CJumCg4Ds4k7XNPTEdDJOZHOKhVyyqmNxAZkduLau8,92542
58
+ lino/core/renderer.py,sha256=jIXxNSpljZhb9tBMhUfDNbZD3XmxYzaS6SlipHx29L4,47291
59
+ lino/core/requests.py,sha256=DijyPSRmwVbuco-JAHy7gZZMyOxA-cXPnVQ3rbpw9Fs,92834
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
63
- lino/core/store.py,sha256=UOUcVsjt61QrZ9QHy2P2rC_9Q8R-d0JAXLH0Ps41YQ4,51341
63
+ lino/core/store.py,sha256=6B_sYwkIKuIRsibx8iRrICyqJggqHh7pMC5K3-e7k7I,51372
64
64
  lino/core/tables.py,sha256=VXfUDENJ-Zl6M3tRvEdLr1LGjmJcAmwXUWSG4EWLFDE,24413
65
65
  lino/core/urls.py,sha256=06QlmN1vpxjmb5snO3SPpP6lX1pMdE60bTiBiC77_vQ,2677
66
66
  lino/core/user_types.py,sha256=0iSYmzr2M9v2Mn2y6hzAZeqareUT-gD7l3MfIPyG9ZI,867
@@ -85,8 +85,8 @@ lino/locale/es/LC_MESSAGES/django.mo,sha256=r2zi4aulC-1zX1XcoGddo0mpdOpuuOpUxpWx
85
85
  lino/locale/es/LC_MESSAGES/django.po,sha256=JKSABlHW8LZFD6oK9Oh-gw9hwCAlfZjDg1Nl2nZUkTE,153744
86
86
  lino/locale/et/LC_MESSAGES/django.mo,sha256=1RH5dX6YOBgk2tX_xpkriBRDh6qkxJDPrWysVeio_eM,5519
87
87
  lino/locale/et/LC_MESSAGES/django.po,sha256=0jGqXMllcz_7-T2S-lSeR-BeTMfI4_Rgz1h5Jy_D1xE,217301
88
- lino/locale/fr/LC_MESSAGES/django.mo,sha256=xOUuHwSjJ4AqMWuI6YHCfach3CKEKkt1l4KR_-YjBR4,17925
89
- lino/locale/fr/LC_MESSAGES/django.po,sha256=fBojP3hqMYF3cxQfgJioApQV9DQXo-YeA866kfaWGwg,162522
88
+ lino/locale/fr/LC_MESSAGES/django.mo,sha256=N7TxEPKmUBjDLu-EabjGUm1VB-CqKjZH1AzRRJ2M5OM,18078
89
+ lino/locale/fr/LC_MESSAGES/django.po,sha256=xRP1JGSmqAk3IuCohb6qCtUsokA90oaEj701WX-qhJ4,162550
90
90
  lino/locale/nl/LC_MESSAGES/django.mo,sha256=cQ3DTQqc4dbwrAdm5d95Kf4pDoYqKdMdElAaRerC0XA,8115
91
91
  lino/locale/nl/LC_MESSAGES/django.po,sha256=u_oZzTdxdEdyMKAJfNVI3Vm1D-uKPCKYDPSXa1vn_qc,339218
92
92
  lino/locale/pt/LC_MESSAGES/django.mo,sha256=OCKgnomRXLl_QsikdFsqUwKXkVexvLvSWf5kizPJrRE,42461
@@ -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=8RbIYaltCHMU5IG69cgHVvy5uNvwPiV3Ely076TuOP8,24372
183
+ lino/modlib/comments/fixtures/demo2.py,sha256=YxzgXaQeH3bum5_7473ie4hJtHfKSChuR19sTBSd4fo,24466
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
@@ -3634,7 +3634,7 @@ lino/modlib/summaries/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-
3634
3634
  lino/modlib/summaries/management/commands/checksummaries.py,sha256=hNEGFcZmbGFpL_H6aKAkdhL_Gw_mE8l-C2NYHvH4Bvo,839
3635
3635
  lino/modlib/system/__init__.py,sha256=cXb8cPBr3t18mXtiY_ScqscdUgd6MvSrsHebfqY-SHk,1407
3636
3636
  lino/modlib/system/actions.py,sha256=jmSYPQDvIQxDth8MaJ9GpkmSCufLGWjmAjKdHAIWE48,1126
3637
- lino/modlib/system/choicelists.py,sha256=Lop5gRFHSEXq5s1mOg5LPuyFGrrsLYh36Ur5X49Lmsg,8801
3637
+ lino/modlib/system/choicelists.py,sha256=JRv_NQ6xHMFFNBkoGgu53CBLmAI3bBShzEc0JmGo61U,9534
3638
3638
  lino/modlib/system/mixins.py,sha256=fpj0O1218KgwGhRr8IHYRBXsNt5uXN87qVrx7dxvjys,19031
3639
3639
  lino/modlib/system/models.py,sha256=30HT4M6o_jyYgZ5hLSRf6Inc0nuhxAsHQvLfPtvkFhM,10837
3640
3640
  lino/modlib/system/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -4397,7 +4397,7 @@ lino/modlib/uploads/mixins.py,sha256=4CSTEDU0ZBfdCV5RqV9SGc3r0rH7TlaGdB7tGGlVN-o
4397
4397
  lino/modlib/uploads/models.py,sha256=ATLVrV1cbmUj7Kv_pLOmBz3IkKpvYBjGriv74AkjD0M,16528
4398
4398
  lino/modlib/uploads/roles.py,sha256=ae0wf_vC4O6MffDx8abpjW1M2oWOp5VzOvt_ckk72Cc,191
4399
4399
  lino/modlib/uploads/ui.py,sha256=Iu06xyKaTKbw2YfTgDJYWQVXuUuVAqENgnfnscViL_c,8456
4400
- lino/modlib/uploads/utils.py,sha256=yrcROlpK95HT06qGBbC5rJdSodxgxMQpHiNVrHtxcfg,3493
4400
+ lino/modlib/uploads/utils.py,sha256=MQAJbI5sUe0RCXCrkxpNKUJFxHpz1bOMqKQy3QsA76o,3343
4401
4401
  lino/modlib/uploads/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4402
4402
  lino/modlib/uploads/fixtures/demo3.py,sha256=q0bwZrx5XtRsRlFpsa33fL0sCl7IdCYaP9E1rhCnJt4,547
4403
4403
  lino/modlib/users/__init__.py,sha256=QHLCNKiRMyL14Iy2eiz7_y9fAwugnDCt4N0aKtIhFA8,3188
@@ -4604,7 +4604,7 @@ lino/utils/cycler.py,sha256=2LGMhMJX5At5ln4yZvmNleWROs-CA_YE_UCzxzvxK4U,1548
4604
4604
  lino/utils/daemoncommand.py,sha256=NjGShiz09fddIV0WU0jK2nzO_CwPj1MfdmgwAOYZi4M,11525
4605
4605
  lino/utils/dataserializer.py,sha256=-_xHXaGwDSO6-sYEHEa2BtEmKS8bW6gsYx4dV-GbvDs,3779
4606
4606
  lino/utils/dates.py,sha256=eWF5WxA5uJf51Y9PKvDVBWD8yIf6yBF6oO6TeU3ujzw,1030
4607
- lino/utils/dbfreader.py,sha256=oV-8yQZo6MZlb_Y2DZPGx3y8tDeRo2d8RWhZzz1i7E8,11805
4607
+ lino/utils/dbfreader.py,sha256=lTIHkqmWJnKTdMwtF7amlSVBZZe2bW81fWF22Y4f5nM,12131
4608
4608
  lino/utils/dblogger.py,sha256=kr0YxQY6veymvNg5A4tsvkqW8haRWdwqL0C-_9_QTg0,721
4609
4609
  lino/utils/diag.py,sha256=evkU818hZSGpWdL0Du11QakT5_frvc5z4C93IEBlECg,18307
4610
4610
  lino/utils/djangotest.py,sha256=Phz1qNp0wDonZRja5dxbCk0Xl3a73gZNiKK8v9tAgZg,8334
@@ -4648,8 +4648,8 @@ lino/utils/xml.py,sha256=4Z44W1e5HvTVrU8erkohgnwqY-5Cr2NHywaAJ5OgRvw,989
4648
4648
  lino/utils/mldbc/__init__.py,sha256=QqWRlzeXaOmFfbCk-vTY3SZMn1-FCf67XnpZdd_Nim0,1134
4649
4649
  lino/utils/mldbc/fields.py,sha256=tAX8G5UKigr9c6g0F3ARIjZZtg406mdaZ--PWSbiH9E,2873
4650
4650
  lino/utils/mldbc/mixins.py,sha256=CkYe5jDa7xp9fJq_V8zcZf8ocxgIjUgHc9KZccvA_Yw,1945
4651
- lino-25.1.2.dist-info/METADATA,sha256=aLPFwgxbrrzrbFNuvcvWB9fPsdE_-9k3MBXKDwKSwAg,42534
4652
- lino-25.1.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4653
- lino-25.1.2.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4654
- lino-25.1.2.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4655
- lino-25.1.2.dist-info/RECORD,,
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,,
File without changes