lino 25.1.6__py3-none-any.whl → 25.2.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 (39) hide show
  1. lino/__init__.py +1 -1
  2. lino/core/actions.py +6 -0
  3. lino/core/actors.py +9 -3
  4. lino/core/callbacks.py +3 -2
  5. lino/core/fields.py +4 -0
  6. lino/core/keyboard.py +7 -2
  7. lino/core/model.py +1 -0
  8. lino/core/requests.py +7 -7
  9. lino/core/site.py +1 -2
  10. lino/core/store.py +2 -2
  11. lino/help_texts.py +3 -1
  12. lino/locale/bn/LC_MESSAGES/django.po +782 -710
  13. lino/locale/de/LC_MESSAGES/django.mo +0 -0
  14. lino/locale/de/LC_MESSAGES/django.po +1259 -1280
  15. lino/locale/django.pot +751 -702
  16. lino/locale/es/LC_MESSAGES/django.po +777 -708
  17. lino/locale/et/LC_MESSAGES/django.po +784 -709
  18. lino/locale/fr/LC_MESSAGES/django.po +1339 -1191
  19. lino/locale/nl/LC_MESSAGES/django.po +787 -712
  20. lino/locale/pt_BR/LC_MESSAGES/django.po +769 -700
  21. lino/locale/zh_Hant/LC_MESSAGES/django.po +769 -700
  22. lino/management/commands/demotest.py +2 -1
  23. lino/mixins/__init__.py +1 -1
  24. lino/modlib/checkdata/choicelists.py +5 -4
  25. lino/modlib/checkdata/models.py +9 -8
  26. lino/modlib/help/models.py +5 -0
  27. lino/modlib/jinja/__init__.py +0 -4
  28. lino/modlib/memo/__init__.py +1 -1
  29. lino/modlib/periods/mixins.py +1 -25
  30. lino/modlib/periods/models.py +42 -9
  31. lino/modlib/system/choicelists.py +12 -11
  32. lino/utils/config.py +2 -0
  33. lino/utils/dpy.py +15 -3
  34. lino/utils/soup.py +136 -103
  35. {lino-25.1.6.dist-info → lino-25.2.0.dist-info}/METADATA +1 -1
  36. {lino-25.1.6.dist-info → lino-25.2.0.dist-info}/RECORD +39 -39
  37. {lino-25.1.6.dist-info → lino-25.2.0.dist-info}/WHEEL +0 -0
  38. {lino-25.1.6.dist-info → lino-25.2.0.dist-info}/licenses/AUTHORS.rst +0 -0
  39. {lino-25.1.6.dist-info → lino-25.2.0.dist-info}/licenses/COPYING +0 -0
lino/utils/soup.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- # Copyright 2016-2024 Rumma & Ko Ltd
2
+ # Copyright 2016-2025 Rumma & Ko Ltd
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
 
5
5
  # See https://dev.lino-framework.org/dev/bleach.html
@@ -8,7 +8,7 @@ import re
8
8
  from bs4 import BeautifulSoup, NavigableString, Comment, Doctype
9
9
  from bs4.element import Tag
10
10
  import logging; logger = logging.getLogger(__file__)
11
- from lino.api import dd
11
+ # from lino.api import dd
12
12
 
13
13
 
14
14
  PARAGRAPH_TAGS = {
@@ -29,7 +29,6 @@ PARAGRAPH_TAGS = {
29
29
 
30
30
  WHITESPACE_TAGS = PARAGRAPH_TAGS | {
31
31
  "[document]",
32
- "span",
33
32
  "ul",
34
33
  "html",
35
34
  "head",
@@ -37,6 +36,8 @@ WHITESPACE_TAGS = PARAGRAPH_TAGS | {
37
36
  "base",
38
37
  }
39
38
 
39
+ SHORT_PREVIEW_IMAGE_HEIGHT = "8em"
40
+ REMOVED_IMAGE_PLACEHOLDER = "⌧"
40
41
 
41
42
  class Style:
42
43
  # TODO: Extend rstgen.sphinxconf.sigal_image.Format to incoroporate this.
@@ -67,65 +68,139 @@ class Style:
67
68
  # return
68
69
  if "width" in self._map:
69
70
  del self["width"]
70
- self["height"] = dd.plugins.memo.short_preview_image_height
71
+ self["height"] = SHORT_PREVIEW_IMAGE_HEIGHT
71
72
 
72
73
  def as_string(self):
73
74
  return ";".join(["{}:{}".format(*kv) for kv in self._map.items()])
74
75
 
75
76
 
77
+ # def truncate_soup(soup, max_length=None):
78
+ # elems = []
79
+ # found_image = False
80
+ # remaining = max_length or settings.SITE.plugins.memo.short_preview_length
81
+ # stop = False
82
+ # for ch in soup:
83
+ # if ch.name == "img":
84
+ # if found_image:
85
+ # continue
86
+ # style = Style(ch.get("style", None))
87
+ # if not "float" in style:
88
+ # style["float"] = "right"
89
+ # style.adjust_size()
90
+ # if style.is_dirty:
91
+ # ch["style"] = style.as_string()
92
+ # found_image = True
93
+ # elems.append(ch)
94
+ # continue
95
+ #
96
+ # if ch.string is not None:
97
+ # strlen = len(ch.string)
98
+ # if strlen > remaining:
99
+ # stop = True
100
+ # end_text = ch.string[:remaining] + "..."
101
+ # ch.string.replace_with(end_text)
102
+ # elems.append(ch)
103
+ # remaining -= strlen
104
+ # if isinstance(ch, Tag):
105
+ # for c in ch.children:
106
+ # if c.name in PARAGRAPH_TAGS:
107
+ # c.unwrap()
108
+ #
109
+ # if stop:
110
+
111
+
76
112
  class TextCollector:
77
113
  def __init__(self, max_length=None):
78
114
  self.text = ""
79
- self.sep = "" # becomes "\n\n" after a PARAGRAPH_TAGS
115
+ self.sep = "" # becomes " " after WHITESPACE_TAGS
80
116
  self.remaining = max_length or settings.SITE.plugins.memo.short_preview_length
81
- self.image = None
117
+ self.found_image = False
82
118
 
83
119
  def add_chunk(self, ch):
84
- # print("20230712 add_chunk", ch.name, ch)
85
-
120
+ # print(f"20250207 add_chunk {ch.__class__} {ch.name} {ch}")
121
+ # if isinstance(ch, Tag):
86
122
  if ch.name in WHITESPACE_TAGS:
123
+ # for c in ch.contents:
124
+ # for c in ch:
87
125
  for c in ch.children:
88
126
  if not self.add_chunk(c):
89
127
  return False
90
- if ch.name in PARAGRAPH_TAGS:
91
- self.sep = "\n\n"
92
- else:
93
- self.sep = " "
128
+ # if ch.name in PARAGRAPH_TAGS:
129
+ # # self.sep = "\n\n"
130
+ # self.sep = "<br/>"
131
+ # else:
132
+ # self.sep = " "
133
+ self.sep = " "
94
134
  return True
95
135
 
96
- assert ch.name != "IMG"
136
+ # assert ch.name != "IMG"
137
+ we_want_more = True
97
138
 
139
+ # Ignore all images except the first one. And for the first one we
140
+ # enforce our style.
98
141
  if ch.name == "img":
99
- if self.image is not None:
100
- # Ignore all images except the first one.
101
- self.text += self.sep
142
+ if self.found_image:
143
+ # self.text += self.sep
144
+ self.text += REMOVED_IMAGE_PLACEHOLDER
102
145
  return True
146
+ self.found_image = True
103
147
  style = Style(ch.get("style", None))
104
148
  if not "float" in style:
105
149
  style["float"] = "right"
106
150
  style.adjust_size()
107
151
  if style.is_dirty:
108
152
  ch["style"] = style.as_string()
109
- self.image = ch
110
153
  # print("20231023 a", ch)
111
154
 
112
- we_want_more = True
113
- if ch.string is not None:
114
- if len(ch.string) > self.remaining:
115
- # print("20231023", len(ch.string), '>', self.remaining)
116
- ch.string = ch.string[: self.remaining] + "..."
155
+ elif ch.string is not None:
156
+ text = ch.string
157
+ strlen = len(text)
158
+ # print(f"20250208b add_chunk {repr(ch)} len={strlen} remaining={self.remaining}")
159
+ # chop = self.remaining
160
+ if strlen > self.remaining:
117
161
  we_want_more = False
162
+ # ch.string = ch.string[: self.remaining] + "..."
163
+ end_text = text[:self.remaining] + "..."
164
+ # raise Exception(f"20250208 {strlen} > {self.remaining} {end_text}")
165
+ if isinstance(ch, NavigableString):
166
+ # ch = NavigableString(end_text)
167
+ ch = end_text
168
+ else:
169
+ ch.string.replace_with(end_text)
170
+ # # ch = NavigableString(ch.string[:chop] + "...")
171
+ # # self.text += self.sep + ch.string
172
+ # self.text += self.sep + end_text
173
+ # return False
174
+ # p = ch.string.parent
175
+ # previous_sibling = ch.previous_sibling
176
+ # ch = NavigableString(end_text)
177
+ # ch = previous_sibling.next_sibling
178
+ # raise Exception(f"20250208 Old {p} and new parent {ch.parent}")
179
+ # if isinstance(ch, NavigableString):
180
+ # ch.replace_with(end_text)
181
+ # else:
182
+ # ch.string.replace_with(end_text)
183
+ # self.text += self.sep + str(ch)
184
+ # for c in ch.children:
185
+ # self.add_chunk(c)
186
+ # return False
187
+ # raise Exception(f"20250208 {end_text} -- {ch}")
188
+ # print(f"20250208c {repr(end_text)} in {ch}")
118
189
  # print("20230927", ch.string, ch)
119
190
  # self.text += str(ch.string) + "..."
120
- # return False
121
- self.remaining -= len(ch.string)
122
-
123
- if isinstance(ch, NavigableString):
124
- self.text += self.sep + ch.string
125
- else:
126
- self.text += self.sep + str(ch)
127
-
191
+ # self.remaining = 0
192
+ # return True
193
+ # return we_want_more
194
+ self.remaining -= strlen
195
+ # print(f"20250207c add_chunk {ch.__class__} {ch}")
196
+
197
+ # if isinstance(ch, NavigableString):
198
+ # self.text += self.sep + ch.string
199
+ # else:
200
+ # self.text += self.sep + str(ch)
201
+ self.text += self.sep + str(ch)
128
202
  self.remaining -= len(self.sep)
203
+ # self.remaining -= 1 # any separator counts as 1 char
129
204
  self.sep = ""
130
205
  return we_want_more
131
206
 
@@ -135,7 +210,8 @@ def truncate_comment(html_str, max_length=300):
135
210
  # new implementation since 20230713
136
211
  html_str = html_str.strip() # remove leading or trailing newlines
137
212
 
138
- if not html_str.startswith("<"):
213
+ if False: # no longer need to test for specil case
214
+ if not html_str.startswith("<"):
139
215
  # print("20231023 c", html_str)
140
216
  if len(html_str) > max_length:
141
217
  return html_str[:max_length] + "..."
@@ -145,62 +221,17 @@ def truncate_comment(html_str, max_length=300):
145
221
  # print(html_str)
146
222
  # raise Exception("20230928 {} {}".format(len(html_str), max_length))
147
223
 
148
- soup = BeautifulSoup(html_str, features="html.parser")
224
+ # soup = BeautifulSoup(html_str, features="html.parser")
225
+ soup = BeautifulSoup(html_str, features="lxml")
226
+ # soup = sanitized_soup(html_str)
227
+ # truncate_soup(soup, max_length)
228
+ # return str(soup)
229
+ # return "".join([str(s) for s in walk(soup, max_length)])
149
230
  tc = TextCollector(max_length)
150
231
  tc.add_chunk(soup)
151
232
  return tc.text
152
233
 
153
234
 
154
-
155
- def old_truncate_comment(html_str, max_p_len=None):
156
- # returns a single paragraph with a maximum number of visible chars.
157
- # No longer used. Replaced by new truncate_comment() below
158
- if max_p_len is None:
159
- max_p_len = settings.SITE.plugins.memo.short_preview_length
160
- html_str = html_str.strip() # remove leading or trailing newlines
161
-
162
- if not html_str.startswith("<"):
163
- if len(html_str) > max_p_len:
164
- txt = html_str[:max_p_len] + "..."
165
- else:
166
- txt = html_str
167
- return txt
168
- soup = BeautifulSoup(html_str, "html.parser")
169
- ps = soup.find_all(
170
- ["p", "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "pre"]
171
- )
172
- if len(ps) > 0:
173
- anchor_end = "</a>"
174
- txt = ""
175
- for p in ps:
176
- text = ""
177
- for c in p.contents:
178
- if isinstance(c, Tag):
179
- if c.name == "a":
180
- text += str(c)
181
- max_p_len = max_p_len + len(text) - len(c.text)
182
- else:
183
- # text += str(c)
184
- text += c.text
185
- else:
186
- text += str(c)
187
-
188
- if len(txt) + len(text) > max_p_len:
189
- txt += text
190
- if anchor_end in txt:
191
- ae_index = txt.index(anchor_end) + len(anchor_end)
192
- if ae_index >= max_p_len:
193
- txt = txt[:ae_index]
194
- txt += "..."
195
- break
196
- txt = txt[:max_p_len]
197
- txt += "..."
198
- break
199
- else:
200
- txt += text + "\n\n"
201
- return txt
202
- return html_str
203
-
204
235
  # remove these tags including their content.
205
236
  blacklist = frozenset(["script", "style", "head"])
206
237
 
@@ -234,16 +265,15 @@ ALLOWED_TAGS = frozenset([
234
265
  "tbody",
235
266
  ])
236
267
 
268
+ GENERALLY_ALLOWED_ATTRS = {"title", "style", "class"}
237
269
 
238
- # Map of allowed attributes by tag. Copied from bleach.sanitizer:
270
+ # Map of allowed attributes by tag. Originally copied from bleach.sanitizer.
239
271
  ALLOWED_ATTRIBUTES = {
240
- "a": {"href", "title"},
241
- "abbr": {"title"},
242
- "acronym": {"title"},
272
+ "a": {"href"} | GENERALLY_ALLOWED_ATTRS,
273
+ "img": {"src", "alt"} | GENERALLY_ALLOWED_ATTRS,
243
274
  }
244
275
 
245
- ALLOWED_ATTRIBUTES["span"] = {
246
- "class",
276
+ ALLOWED_ATTRIBUTES["span"] = GENERALLY_ALLOWED_ATTRS | {
247
277
  "data-index",
248
278
  "data-denotation-char",
249
279
  "data-link",
@@ -251,28 +281,25 @@ ALLOWED_ATTRIBUTES["span"] = {
251
281
  "data-value",
252
282
  "contenteditable",
253
283
  }
254
- ALLOWED_ATTRIBUTES["p"] = {"align", "style"}
284
+
285
+ ALLOWED_ATTRIBUTES["p"] = GENERALLY_ALLOWED_ATTRS | {"align"}
255
286
 
256
287
  # def safe_css(attr, css):
257
288
  # if attr == "style":
258
289
  # return re.sub("(width|height):[^;]+;", "", css)
259
290
  # return css
260
291
 
261
- def sanitize(old):
292
+ def sanitized_soup(old):
262
293
 
263
294
  # Inspired by https://chase-seibert.github.io/blog/2011/01/28/sanitize-html-with-beautiful-soup.html
264
295
 
265
- old = old.strip()
266
- if not old:
267
- return old
268
-
269
296
  try:
270
297
  soup = BeautifulSoup(old, features="lxml")
271
298
  except HTMLParseError as e:
272
- logger.info("Could not sanitize %r : %s", old, e)
299
+ logger.warning("Could not sanitize %r : %s", old, e)
273
300
  return f"Could not sanitize content ({e})"
274
301
 
275
- for tag in soup.findAll():
302
+ for tag in soup.find_all():
276
303
  # print(tag)
277
304
  tag_name = tag.name.lower()
278
305
  if tag_name in blacklist:
@@ -282,11 +309,8 @@ def sanitize(old):
282
309
  tag.unwrap()
283
310
  elif tag_name in ALLOWED_TAGS:
284
311
  # tag is allowed. Make sure all the attributes are allowed.
285
- allowed = ALLOWED_ATTRIBUTES.get(tag_name, None)
286
- if allowed is None:
287
- tag.attrs = dict()
288
- else:
289
- tag.attrs = {k: v for k, v in tag.attrs.items() if k in allowed}
312
+ allowed = ALLOWED_ATTRIBUTES.get(tag_name, GENERALLY_ALLOWED_ATTRS)
313
+ tag.attrs = {k: v for k, v in tag.attrs.items() if k in allowed}
290
314
  else:
291
315
  # print(tag.name)
292
316
  # tag.decompose()
@@ -298,7 +322,7 @@ def sanitize(old):
298
322
  tag.attrs = dict()
299
323
 
300
324
  # remove all comments because they might contain scripts
301
- comments = soup.findAll(text=lambda text:isinstance(text, (Comment, Doctype)))
325
+ comments = soup.find_all(text=lambda text:isinstance(text, (Comment, Doctype)))
302
326
  for comment in comments:
303
327
  comment.extract()
304
328
 
@@ -308,4 +332,13 @@ def sanitize(old):
308
332
  if main_tag.name in useless_main_tags and not main_tag.attrs:
309
333
  main_tag.unwrap()
310
334
 
311
- return str(soup).strip()
335
+ return soup
336
+
337
+ def sanitize(s):
338
+ s = s.strip()
339
+ if not s:
340
+ return s
341
+ # do we want to remove whitespace between tags?
342
+ # s = re.sub(">\s+<", "><", s)
343
+ # return sanitized_soup(s).decode(formatter="html").strip()
344
+ return str(sanitized_soup(s)).strip()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lino
3
- Version: 25.1.6
3
+ Version: 25.2.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,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=0yrHbVQ2XWyabku43gsxie9HdEs3B8JvaUfMah_yJXM,5584
3
+ lino/__init__.py,sha256=L5fEz8yXvX5li-Ml36neDQc_SmeIeUm_wFYZp0vr_l4,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
7
- lino/help_texts.py,sha256=xLCUrDYM6fiYJSevxi6iq8xAO7XyKikm29HEJMv8HLo,90895
7
+ lino/help_texts.py,sha256=WgZHe3ntyEtZ0LiKSIMMEH6OYHq4bFDKj-noKw7LYVQ,91195
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=-mjuoflZilnFM97we-N1H_sEf1TQiNs62JwZ5m4XV1s,7813
@@ -28,10 +28,10 @@ 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=B8jCkE__GNIL820LCc10yOzJ7inCUyxn9u1KupS9y84,46398
32
- lino/core/actors.py,sha256=lsp-w2kC_t_-iqeHtIYIkIPoS_jbHgZ3MZlGJWH2dyc,73663
31
+ lino/core/actions.py,sha256=2QGQYpjQ_Fyvb3wb4TBGj8GO4f857aQ3YX3Uz6u15dw,46622
32
+ lino/core/actors.py,sha256=0MhLLWf3uXzO5nEV5D8Bc12dedlgLCWVBo4WcJyLQCc,73865
33
33
  lino/core/boundaction.py,sha256=tb0C4WwbJpAP3yKbR6OaibzcAkwVs3nfeuD0RjXTjIg,6665
34
- lino/core/callbacks.py,sha256=xkosb1l48o6WeSdj82k5udK9OmjI7-p6x4AJFjXiOf8,7518
34
+ lino/core/callbacks.py,sha256=uu1-znzxVDD-JETUebw-hYsNg_9ExQb1vfwbc7Psjro,7549
35
35
  lino/core/choicelists.py,sha256=8FpmfEREj0jITkx3qihjPfg8pPMBHWXprNfuje4b7N4,36525
36
36
  lino/core/classproperty.py,sha256=_E95WPAs7BWbAuFpPvoYM2ZwW_mbq3rvF7o43WsMq_8,4316
37
37
  lino/core/constants.py,sha256=chvG1TrwD2gVMmL4nTOZtO8NcffcclcUv3zBE8mMoiQ,4503
@@ -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=0vK0F4LCqwwjLXA3sA7qG4jR9OvQF9EgIDVcsac9Qh0,57335
45
+ lino/core/fields.py,sha256=C14cCHHJclk0z6NlJFRPyXPJaVS1DhngQLTE6gPR0BE,57407
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
- lino/core/keyboard.py,sha256=imdO-J5npZijtddhM2C7CLo2K6Hp30egsXgOOa4-AqQ,1137
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=BoPtcqtTB1-ADp3ffnzEXyIx8lQ4HLaZWxo0eQrj-T4,10850
54
54
  lino/core/merge.py,sha256=sKtTeZtHdoDKerdHj4NXuXXNzpKDsfdPaiq-CY0NqQc,9094
55
- lino/core/model.py,sha256=MNTlg53WbKXPIne5wOHtO5V3nLdxoYTBMosz9JdFQJU,36386
55
+ lino/core/model.py,sha256=wKxb0bWi_5FgcZn8Pz-bjDGo-5Y1cwOVTZPrJbv5ljQ,36408
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=DAen9Jys3RfDMRQNbQFAo_h7iUipe7khhXTVT4RvcNY,92822
59
+ lino/core/requests.py,sha256=23pQckFF-R9IBfN7KVItlCodiKeGdmDH-UPOyR0N69M,92887
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=lEPAEF4OyBsF8NLy3y9O0GOcC5C1REc9ug9mIZR-mIs,83150
63
- lino/core/store.py,sha256=6B_sYwkIKuIRsibx8iRrICyqJggqHh7pMC5K3-e7k7I,51372
62
+ lino/core/site.py,sha256=s_kisoL35ZcbFbF18eyvARu7OcNA_61GPE3-_6rNJIc,83136
63
+ lino/core/store.py,sha256=eQyahBvsMvX2K_lJvJGSATLV0SGOOCfqpf0JDJprNNw,51351
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
@@ -76,28 +76,28 @@ lino/core/auth/middleware.py,sha256=1c_z4lP_Rhbw7pdCapprGkjIXX40OJgIlFyQew4O-Nc,
76
76
  lino/core/auth/utils.py,sha256=Nv7QbINYi64hGZZxV-Ix1iwhrb_KOfUfhJXAzoKy2ng,4130
77
77
  lino/core/management/__init__.py,sha256=fp1cONBXgq1IftPk5c4b63gRlYOWpT5VzCIKrx0aGlE,61
78
78
  lino/fake_migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- lino/locale/django.pot,sha256=d0LUP8ZhnGMBdClIcDMAeSO2RapiJJLXVH9nBTxVnyc,151864
79
+ lino/locale/django.pot,sha256=dHb03JkAaWWR22EfURJE5JBiFUbcyJ6jwwZ5ASh-Dps,152924
80
80
  lino/locale/bn/LC_MESSAGES/django.mo,sha256=ygs6NvTycQXv5Dwl8bpyy13u-uMIcNK2-xpJM3zSy3Y,14893
81
- lino/locale/bn/LC_MESSAGES/django.po,sha256=k9JbY2wzq65ngU3IW9LdQNFvlLyv4QWs-4lLZ9NZNfU,191106
82
- lino/locale/de/LC_MESSAGES/django.mo,sha256=uPHl6I7G3nZ1AtEJAw6t8JneOzaDpsr1q13IDUxCvUc,27199
83
- lino/locale/de/LC_MESSAGES/django.po,sha256=lnz8LmtWfdxPdMZKVaR5HzL02bktibrUbJ3CEl66qDI,166337
81
+ lino/locale/bn/LC_MESSAGES/django.po,sha256=DCTpcQcLOTC4DpA4NRvYoLVv5_Yvpp804BnjQgX6roM,192740
82
+ lino/locale/de/LC_MESSAGES/django.mo,sha256=iLKQzGYhaGPt9rUvOmbv-oJQA99SHZgdvtECCjEqS7o,27552
83
+ lino/locale/de/LC_MESSAGES/django.po,sha256=OWtq6Xr7u1me7oqkuetAUr7vjqpU-iIZWFqKxp29KUk,167411
84
84
  lino/locale/es/LC_MESSAGES/django.mo,sha256=r2zi4aulC-1zX1XcoGddo0mpdOpuuOpUxpWxGoYh8qc,2357
85
- lino/locale/es/LC_MESSAGES/django.po,sha256=JKSABlHW8LZFD6oK9Oh-gw9hwCAlfZjDg1Nl2nZUkTE,153744
85
+ lino/locale/es/LC_MESSAGES/django.po,sha256=0ZILbxeYQJ8nru55rqWK6-3Oty2WvIbzZovvKWV8gqw,155257
86
86
  lino/locale/et/LC_MESSAGES/django.mo,sha256=1RH5dX6YOBgk2tX_xpkriBRDh6qkxJDPrWysVeio_eM,5519
87
- lino/locale/et/LC_MESSAGES/django.po,sha256=0jGqXMllcz_7-T2S-lSeR-BeTMfI4_Rgz1h5Jy_D1xE,217301
87
+ lino/locale/et/LC_MESSAGES/django.po,sha256=1g1z5CWOZTWxKqJax7vaa4x5a8ndY5vuyPuZwysn5kc,218934
88
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
89
+ lino/locale/fr/LC_MESSAGES/django.po,sha256=hzwUrF6zQc6Uvr7b_3ygpOh-M7ogsjhXnkfB9e858VQ,164385
90
90
  lino/locale/nl/LC_MESSAGES/django.mo,sha256=cQ3DTQqc4dbwrAdm5d95Kf4pDoYqKdMdElAaRerC0XA,8115
91
- lino/locale/nl/LC_MESSAGES/django.po,sha256=u_oZzTdxdEdyMKAJfNVI3Vm1D-uKPCKYDPSXa1vn_qc,339218
91
+ lino/locale/nl/LC_MESSAGES/django.po,sha256=1fmmyBEEPuLpsLQMRbBEHotcf7lDWvkksKU11ZgQNkk,340860
92
92
  lino/locale/pt/LC_MESSAGES/django.mo,sha256=OCKgnomRXLl_QsikdFsqUwKXkVexvLvSWf5kizPJrRE,42461
93
93
  lino/locale/pt/LC_MESSAGES/django.po,sha256=pMhpgCeuj2O7G37gDSr-8jdAKs1P3hEy-K2Lg-GbCIU,80311
94
94
  lino/locale/pt_BR/LC_MESSAGES/django.mo,sha256=OCKgnomRXLl_QsikdFsqUwKXkVexvLvSWf5kizPJrRE,42461
95
- lino/locale/pt_BR/LC_MESSAGES/django.po,sha256=UnAroqpeLJFO6ESmktwxfV_9-pD2E7TA_XiuPSxzcqg,152771
96
- lino/locale/zh_Hant/LC_MESSAGES/django.po,sha256=KWejkd_imTiK-SX6BG_bfEGtGIWEQ-bxGqOXLEXAHF0,152693
95
+ lino/locale/pt_BR/LC_MESSAGES/django.po,sha256=61QR27iyU4ZXcErTj5DZj7GlyL-Fpwmn3E-tbXq1hyI,154284
96
+ lino/locale/zh_Hant/LC_MESSAGES/django.po,sha256=JeP8cSTQ5bjX12Nr3EcCVhIaR-1pBYls5qSYv8iFRDs,154206
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=zb9gSrgqOH2S-OJSKUNezprUEbJLBQf8tVGSVdSENik,5017
100
+ lino/management/commands/demotest.py,sha256=yvxpl1G0Clt-iu7lY0DK9HVhaWyl_tQhYx0YUpddTWM,5041
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
@@ -116,7 +116,7 @@ lino/management/commands/run.py,sha256=MiK53KIACYKDTKF6knJGwU-uzEApGnDxByi-3_nrT
116
116
  lino/management/commands/show.py,sha256=dS_TotAEeH8zo_wufQgca6q0Yj9qeWsJUOUcss6YD7E,1439
117
117
  lino/management/commands/syncscreenshots.py,sha256=XYZhqfm5_RwJzVFNGhHJKucl4j6T6mYo2GsDaUzvjAs,1561
118
118
  lino/management/commands/update_conf.py,sha256=saAaQdPhn3mNOoHcBxOFSf_vBEgM-aopTHq1sJN20Bo,1026
119
- lino/mixins/__init__.py,sha256=cSFXzy8i0Akp9PmUSJz8E5t3twO3Z2lyCTyTCEqAQSU,8931
119
+ lino/mixins/__init__.py,sha256=ADIq0rPGlAY4ifSaMvqahXvCMnbFzq2qAWcyyUkx4Ds,8930
120
120
  lino/mixins/dupable.py,sha256=ofyYrcT9WiYdVTkzgXyXaBu1kS-y197YnFTnZNALUHo,10233
121
121
  lino/mixins/duplicable.py,sha256=lQ5SEQmxPcOU9vETocgQI41uzgvunvXIy7HAnPeKDUI,4224
122
122
  lino/mixins/human.py,sha256=YDIfIHHAaVmzd3uGsJp_vDvkaBWOp09I7i4AGNy9YsQ,13255
@@ -164,8 +164,8 @@ lino/modlib/changes/__init__.py,sha256=3-CO7xI-U-rKDu_-WJg7N4FaIgqmFcj81uzyQlNYr
164
164
  lino/modlib/changes/models.py,sha256=kx3BGV82VWu1rA9N393zjPpPvy-k55NbOvV7KI1gfYc,9340
165
165
  lino/modlib/changes/utils.py,sha256=4jz8QXgaBxfmCBUvDeZeh7lkdwfTq7OBXBiFhMmANqA,2550
166
166
  lino/modlib/checkdata/__init__.py,sha256=raUCoYi4WZLKVLG3GqH0ml1eH_YJXqY-EgXsKUe6iRY,2829
167
- lino/modlib/checkdata/choicelists.py,sha256=kJBzlojZ05ZqahlopolRwsuNH5M99A7euRgE9K_h2ak,5135
168
- lino/modlib/checkdata/models.py,sha256=Z4hJ9Q7ox2ovLDHlX1MGwi-WfRkB4JQpMl6usPGMidg,11547
167
+ lino/modlib/checkdata/choicelists.py,sha256=OGv3mmr5DPPahoBliAOFIx_H6ysuW3ZpcrI4fIq1SB0,5244
168
+ lino/modlib/checkdata/models.py,sha256=3xXd1opiOjIlWtSQd1jg1XoLU8ZbGrkjbw0vDD7J2SE,11639
169
169
  lino/modlib/checkdata/roles.py,sha256=xjQ882-BxYUoHbv2pzebs7MWl6snA2fKivFDTRzW7sQ,295
170
170
  lino/modlib/checkdata/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  lino/modlib/checkdata/fixtures/checkdata.py,sha256=TY9yIBwB5nEw0e6RTXqRwYdiCaLkkYTwWmFGcVBw2ow,332
@@ -3496,7 +3496,7 @@ lino/modlib/gfks/fields.py,sha256=43yIsudT07bXuKD1Gsqvn15_F3UaeZQqZzuzK9dDdLc,32
3496
3496
  lino/modlib/gfks/mixins.py,sha256=BcITVETBR7zVj684diZGCii3rzm7lgrgzr2euy-D-iw,2626
3497
3497
  lino/modlib/gfks/models.py,sha256=bDbuvtpSW-wxNWLC3pKWsDQPyN4g6MFMTS-66aQ2DX8,6723
3498
3498
  lino/modlib/help/__init__.py,sha256=PlThatoYB6lThNahWkVL2ZatimW0d_9LAPTZIE7hiuE,4434
3499
- lino/modlib/help/models.py,sha256=8CPqo3h5Nf4OHcJDG_OnF_4qeAOCKzPzz1q0enqd9J0,3283
3499
+ lino/modlib/help/models.py,sha256=Ik-fkUH8KHiPajar-SYCbuaQGfIbbgfI6-9rMkr1Np8,3497
3500
3500
  lino/modlib/help/utils.py,sha256=dWmz0huCw7N4ENIsCUoGiXyn3AbkE96jVR4YwyzPjjo,3944
3501
3501
  lino/modlib/help/config/makehelp/actor.tpl.rst,sha256=Yl-ZAWvI93cVFLd7GG-qpn_vkGFvKe3iR0eWBJpHgMc,346
3502
3502
  lino/modlib/help/config/makehelp/actors.tpl.rst,sha256=wXMKYQnlhLi432QggVgRUWGuHRDiSX9NyXSdnSar7Io,249
@@ -3516,7 +3516,7 @@ lino/modlib/importfilters/__init__.py,sha256=i_eUIwJSRHlSFJueqxBkApcIWOdW-bb1xwp
3516
3516
  lino/modlib/importfilters/models.py,sha256=iESoL9hwcYG1TzfCbBCqhJS2tzFw5M3gVNgrCULkSWM,3227
3517
3517
  lino/modlib/ipdict/__init__.py,sha256=n2fkShCZ-KIztazI_JQztJBBgg3c2GeIIh-5Q6ukZmA,1169
3518
3518
  lino/modlib/ipdict/models.py,sha256=9-pjj_xXdndhQaQI8sgXcmODxurST_aFcShGwomiYKk,1774
3519
- lino/modlib/jinja/__init__.py,sha256=myTllY0VudAdqduK-xIMcbs08DwRbDSCkrAxZVmVdxA,3570
3519
+ lino/modlib/jinja/__init__.py,sha256=XSa-e1qZGabl8EmRDKPRtmzgBRole5ZbxAUBR_m-ds0,3418
3520
3520
  lino/modlib/jinja/choicelists.py,sha256=QHjWQWLnJCKSGnLIKeGqnCw41JYvcbTkCeXjBpWh23w,1466
3521
3521
  lino/modlib/jinja/loader.py,sha256=MX027X_UuQPqq0wOUr06QnOkdTzGpksNv0Om1CGp61I,1765
3522
3522
  lino/modlib/jinja/renderer.py,sha256=yywxocrNYSPvUcMjuYw9guiPoq50lfaIKkJOP_PHg5o,6142
@@ -3541,7 +3541,7 @@ lino/modlib/linod/utils.py,sha256=dE973Xib6Be1DvNsZ0M5wzY_jpkk35R21WKs-jQPorM,33
3541
3541
  lino/modlib/linod/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3542
3542
  lino/modlib/linod/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3543
3543
  lino/modlib/linod/management/commands/linod.py,sha256=9-zRm-Xgp3uWj6AlDZpjtzo_TqSPyxIkKIrI_jshxVI,3457
3544
- lino/modlib/memo/__init__.py,sha256=JEfB1Zb31d32gjfx7AQRBYwb4Z6YARc3hyRkYcRPaEk,5245
3544
+ lino/modlib/memo/__init__.py,sha256=Kghjmlz0y1km6SFq5m9nbDqD3CKfSplj57rso3IevLk,5247
3545
3545
  lino/modlib/memo/mixins.py,sha256=Wv844JL6WyvYI56QqcCdiHq8nocs8xcIM_eNzaWu3So,10919
3546
3546
  lino/modlib/memo/models.py,sha256=2UbKaixPWCnP1ZkoJx_DDTtltpfYVbU3uJ1hmsZDU8A,3146
3547
3547
  lino/modlib/memo/parser.py,sha256=lOSoXY5nj_CaM3jdd2e2s7-MbXCGRQu3SxQ3d1CMkEE,12994
@@ -3574,8 +3574,8 @@ lino/modlib/office/__init__.py,sha256=rOKD9zKt-VBvFFqoHBioNp299Igb1Sk2n466iCt6AS
3574
3574
  lino/modlib/office/roles.py,sha256=oQWTZ-_9_vssc9QW5A0YspMjG_V5gCiHSU0eE0AIH30,356
3575
3575
  lino/modlib/periods/__init__.py,sha256=MFTI4YTYw3zTxYVlD568rBxn02e_J9Yn10uZ6U5W-uQ,1069
3576
3576
  lino/modlib/periods/choicelists.py,sha256=_t_l40FlXYAyRnlOZzh4DR5wMCM1nIWiIfS7QKbXkmw,1304
3577
- lino/modlib/periods/mixins.py,sha256=2iHH3EMsGhhh35CvEdh_QjlUDrM-V9VuZJq8lkt5bM4,5009
3578
- lino/modlib/periods/models.py,sha256=UGaK6qbmkEuXmp8n8SIuwCxfswLXRNLuR-SqOfASTn4,7336
3577
+ lino/modlib/periods/mixins.py,sha256=QQXtu1Z6HjqDlL_xMM98FR7PQGKhYgjslhusOiWwPDA,4271
3578
+ lino/modlib/periods/models.py,sha256=hu1myxDqrBMIiORNYWBpAIDz-WjDe3LmF2JhrvG6DeI,8444
3579
3579
  lino/modlib/periods/fixtures/std.py,sha256=iV6a2DNAhfYvO1VspGkcncEmygHK94zWdDZlHUY8JSw,881
3580
3580
  lino/modlib/printing/__init__.py,sha256=u1fq44d073-IDH_t8hWs1sQdlAHdsCP85sfEOMSW5L4,689
3581
3581
  lino/modlib/printing/actions.py,sha256=CME19ZC6lYWO5qGoVX1b8P4q_wHSwvV19ELKEquMLJs,11704
@@ -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=JRv_NQ6xHMFFNBkoGgu53CBLmAI3bBShzEc0JmGo61U,9534
3637
+ lino/modlib/system/choicelists.py,sha256=u9Y2e_lZxFS_SMe-MDeOCNOfHc1PtQ6OjdPG9WwpaGk,9512
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
@@ -4600,7 +4600,7 @@ lino/utils/addressable.py,sha256=o7bmLbyvrmOoAT478s7XqjWKvnZ7zSXj4k7Xf0ccqf8,221
4600
4600
  lino/utils/ajax.py,sha256=npCS0WumhTQlBzXxQPKnp2sYCRcPsYcbFqzE2ykVc4Q,3254
4601
4601
  lino/utils/choosers.py,sha256=9jjeLz-QcWVBfR8_GdY4PNYoqIYM63OI3OvOL2l1ZaU,17604
4602
4602
  lino/utils/code.py,sha256=-2vc8npHQ5jsrRqzxmjRZZ8FWY7QJ7-sRg7-ZhOsUEU,7053
4603
- lino/utils/config.py,sha256=wkegrAmExYSNOGa8MIIg_fhjtQhzTnsHGom0a0HOf_Y,8456
4603
+ lino/utils/config.py,sha256=gtaJURPOwHyV_AW7i7_vin3KTj3UwZa4iviDbldwXGE,8568
4604
4604
  lino/utils/cycler.py,sha256=2LGMhMJX5At5ln4yZvmNleWROs-CA_YE_UCzxzvxK4U,1548
4605
4605
  lino/utils/daemoncommand.py,sha256=NjGShiz09fddIV0WU0jK2nzO_CwPj1MfdmgwAOYZi4M,11525
4606
4606
  lino/utils/dataserializer.py,sha256=-_xHXaGwDSO6-sYEHEa2BtEmKS8bW6gsYx4dV-GbvDs,3779
@@ -4609,7 +4609,7 @@ lino/utils/dbfreader.py,sha256=4sXOGBKX6DFQCEPkCMfnJAVneHMyDzJQB5tsYAq90vQ,12205
4609
4609
  lino/utils/dblogger.py,sha256=kr0YxQY6veymvNg5A4tsvkqW8haRWdwqL0C-_9_QTg0,721
4610
4610
  lino/utils/diag.py,sha256=evkU818hZSGpWdL0Du11QakT5_frvc5z4C93IEBlECg,18307
4611
4611
  lino/utils/djangotest.py,sha256=Phz1qNp0wDonZRja5dxbCk0Xl3a73gZNiKK8v9tAgZg,8334
4612
- lino/utils/dpy.py,sha256=4bNIxc05bpJHa4--fo540yg7sUZ7x5QriSPzW2KwFWk,20190
4612
+ lino/utils/dpy.py,sha256=Hw4ofFnhRPAE2PsPf9r5RpzcfVLQdIjtOe-XtMMLtuE,20661
4613
4613
  lino/utils/format_date.py,sha256=HZ3wbN-1OjhawYG8-w2_TwgT33yYDuUvU877j-3QX7Q,2888
4614
4614
  lino/utils/html.py,sha256=pcE0UQmdQGxxmb-p0mBb47zNbRMXLP9cxxrXTLs4gbY,3143
4615
4615
  lino/utils/html2odf.py,sha256=Hxw4HiIHY1ZCjb4_JLykVHbr6yAMhhHrnrCnLNDYKAs,4826
@@ -4636,7 +4636,7 @@ lino/utils/restify.py,sha256=QMVQXrmjDl6PPC7HJJGeDm125pcvrZKvcMpiscaPrsw,14066
4636
4636
  lino/utils/screenshots.py,sha256=T-szKC3EJfo4JcLio8Jj0xqaoSuJcZG6Jf9EF_B8WDQ,2040
4637
4637
  lino/utils/sendchanges.py,sha256=fcSqRyI3l8sEf9_LSqIyWGML6CORoYkjcFp2bs-YNlY,7097
4638
4638
  lino/utils/socks.py,sha256=0d67FDbrJ7PXl4AYzNNZgwCzV-fzIAAtWGxMEB7dw78,538
4639
- lino/utils/soup.py,sha256=zxNF7a4EoSEqkcP9jHu9tpQABd8zseemgOTNTNN3wzQ,8814
4639
+ lino/utils/soup.py,sha256=__Bt9WDoayUGPi98EzBrD3dlbVp_NNrD9_irB7yUugc,10753
4640
4640
  lino/utils/sql.py,sha256=kwCgv5E3n7uLjpXOEiaF2W2p8LeGXcP39xgtnqvzTP8,6795
4641
4641
  lino/utils/sqllog.py,sha256=kUCnBfFjExhItJ1w76WT9VWPaWWq8NQM-kSIMIIZnRU,3282
4642
4642
  lino/utils/ssin.py,sha256=Wo-9M0pG0uEYEGvmz8N--iRIqJe3ETtgLOXoung7qlE,4232
@@ -4649,8 +4649,8 @@ lino/utils/xml.py,sha256=4Z44W1e5HvTVrU8erkohgnwqY-5Cr2NHywaAJ5OgRvw,989
4649
4649
  lino/utils/mldbc/__init__.py,sha256=QqWRlzeXaOmFfbCk-vTY3SZMn1-FCf67XnpZdd_Nim0,1134
4650
4650
  lino/utils/mldbc/fields.py,sha256=tAX8G5UKigr9c6g0F3ARIjZZtg406mdaZ--PWSbiH9E,2873
4651
4651
  lino/utils/mldbc/mixins.py,sha256=CkYe5jDa7xp9fJq_V8zcZf8ocxgIjUgHc9KZccvA_Yw,1945
4652
- lino-25.1.6.dist-info/METADATA,sha256=WqVqvSO_n0TLfSy-ydW7pz01iQW5IDz8nz90x5fge4I,42534
4653
- lino-25.1.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4654
- lino-25.1.6.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4655
- lino-25.1.6.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4656
- lino-25.1.6.dist-info/RECORD,,
4652
+ lino-25.2.0.dist-info/METADATA,sha256=2neMBuGZIjjgExyCMaMWrx3LMHo9UAVl_urM7nCHE70,42534
4653
+ lino-25.2.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
4654
+ lino-25.2.0.dist-info/licenses/AUTHORS.rst,sha256=8VEm_G4HOmYEa4oi1nVoKKsdo4JanekEJCefWd2E8vk,981
4655
+ lino-25.2.0.dist-info/licenses/COPYING,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
4656
+ lino-25.2.0.dist-info/RECORD,,
File without changes