lino 24.10.3__py3-none-any.whl → 24.11.1__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 (80) hide show
  1. lino/__init__.py +1 -1
  2. lino/api/doctest.py +11 -10
  3. lino/api/rt.py +2 -3
  4. lino/config/admin_main_base.html +2 -2
  5. lino/core/actions.py +2 -4
  6. lino/core/actors.py +70 -35
  7. lino/core/choicelists.py +2 -2
  8. lino/core/dashboard.py +2 -1
  9. lino/core/dbtables.py +15 -15
  10. lino/core/elems.py +8 -4
  11. lino/core/fields.py +12 -3
  12. lino/core/inject.py +9 -2
  13. lino/core/kernel.py +11 -11
  14. lino/core/layouts.py +1 -1
  15. lino/core/model.py +25 -36
  16. lino/core/plugin.py +1 -0
  17. lino/core/renderer.py +21 -21
  18. lino/core/requests.py +94 -83
  19. lino/core/site.py +9 -90
  20. lino/core/store.py +16 -19
  21. lino/core/tables.py +0 -17
  22. lino/core/utils.py +32 -2
  23. lino/core/views.py +2 -1
  24. lino/help_texts.py +10 -5
  25. lino/locale/bn/LC_MESSAGES/django.po +1210 -907
  26. lino/locale/de/LC_MESSAGES/django.po +1760 -1375
  27. lino/locale/django.pot +1136 -906
  28. lino/locale/es/LC_MESSAGES/django.po +1709 -1347
  29. lino/locale/et/LC_MESSAGES/django.po +1206 -906
  30. lino/locale/fr/LC_MESSAGES/django.mo +0 -0
  31. lino/locale/fr/LC_MESSAGES/django.po +1193 -923
  32. lino/locale/nl/LC_MESSAGES/django.po +1247 -942
  33. lino/locale/pt_BR/LC_MESSAGES/django.po +1190 -903
  34. lino/locale/zh_Hant/LC_MESSAGES/django.po +1190 -903
  35. lino/management/commands/show.py +2 -4
  36. lino/mixins/periods.py +15 -7
  37. lino/mixins/polymorphic.py +3 -3
  38. lino/mixins/ref.py +6 -3
  39. lino/modlib/checkdata/__init__.py +3 -3
  40. lino/modlib/comments/choicelists.py +1 -1
  41. lino/modlib/comments/fixtures/demo2.py +4 -1
  42. lino/modlib/comments/mixins.py +9 -10
  43. lino/modlib/comments/models.py +4 -4
  44. lino/modlib/comments/ui.py +5 -0
  45. lino/modlib/extjs/ext_renderer.py +1 -1
  46. lino/modlib/linod/consumers.py +2 -3
  47. lino/modlib/linod/mixins.py +3 -2
  48. lino/modlib/memo/mixins.py +11 -209
  49. lino/modlib/notify/mixins.py +33 -32
  50. lino/modlib/periods/__init__.py +12 -1
  51. lino/modlib/periods/fixtures/std.py +2 -1
  52. lino/modlib/periods/mixins.py +0 -1
  53. lino/modlib/periods/models.py +79 -75
  54. lino/modlib/printing/actions.py +2 -0
  55. lino/modlib/printing/choicelists.py +3 -3
  56. lino/modlib/publisher/ui.py +2 -2
  57. lino/modlib/search/models.py +17 -11
  58. lino/modlib/system/__init__.py +0 -2
  59. lino/modlib/system/choicelists.py +55 -1
  60. lino/modlib/system/fixtures/__init__.py +0 -0
  61. lino/modlib/system/fixtures/std.py +5 -0
  62. lino/modlib/system/models.py +4 -2
  63. lino/modlib/uploads/__init__.py +10 -1
  64. lino/modlib/uploads/choicelists.py +3 -3
  65. lino/modlib/uploads/mixins.py +30 -32
  66. lino/modlib/uploads/models.py +89 -56
  67. lino/modlib/uploads/ui.py +12 -6
  68. lino/modlib/uploads/utils.py +107 -0
  69. lino/modlib/users/models.py +2 -2
  70. lino/modlib/weasyprint/__init__.py +2 -0
  71. lino/utils/__init__.py +14 -9
  72. lino/utils/djangotest.py +2 -1
  73. lino/utils/html.py +32 -1
  74. lino/utils/media.py +2 -3
  75. lino/utils/soup.py +311 -0
  76. {lino-24.10.3.dist-info → lino-24.11.1.dist-info}/METADATA +1 -3
  77. {lino-24.10.3.dist-info → lino-24.11.1.dist-info}/RECORD +80 -76
  78. {lino-24.10.3.dist-info → lino-24.11.1.dist-info}/WHEEL +1 -1
  79. {lino-24.10.3.dist-info → lino-24.11.1.dist-info}/licenses/AUTHORS.rst +0 -0
  80. {lino-24.10.3.dist-info → lino-24.11.1.dist-info}/licenses/COPYING +0 -0
@@ -3,11 +3,9 @@
3
3
  # License: GNU Affero General Public License v3 (see file COPYING for details)
4
4
 
5
5
  import argparse
6
-
7
- from django.conf import settings
6
+ from lino.api import rt
8
7
  from django.core.management.base import BaseCommand, CommandError
9
8
 
10
-
11
9
  class Command(BaseCommand):
12
10
  help = "Show the content of a specified table to standard output."
13
11
 
@@ -43,6 +41,6 @@ class Command(BaseCommand):
43
41
  spec = args[0]
44
42
 
45
43
  username = options["username"]
46
- ses = settings.SITE.login(username)
44
+ ses = rt.login(username)
47
45
 
48
46
  ses.show(spec, language=options["language"])
lino/mixins/periods.py CHANGED
@@ -204,6 +204,7 @@ class Ended(CombinedDateTime):
204
204
 
205
205
 
206
206
  class DateRangeObservable(Model):
207
+
207
208
  class Meta(object):
208
209
  abstract = True
209
210
 
@@ -214,11 +215,11 @@ class DateRangeObservable(Model):
214
215
  def setup_parameters(cls, fields):
215
216
  fields.update(
216
217
  start_date=models.DateField(
217
- _("Period from"),
218
+ _("Date range from"),
218
219
  blank=True,
219
220
  null=True,
220
221
  default=cls.get_default_start_date,
221
- help_text=_("Start date of observed period"),
222
+ help_text=_("Start date of observed date range."),
222
223
  )
223
224
  )
224
225
  fields.update(
@@ -227,7 +228,7 @@ class DateRangeObservable(Model):
227
228
  blank=True,
228
229
  null=True,
229
230
  default=cls.get_default_end_date,
230
- help_text=_("End date of observed period"),
231
+ help_text=_("End date of observed date range."),
231
232
  )
232
233
  )
233
234
  super().setup_parameters(fields)
@@ -235,8 +236,9 @@ class DateRangeObservable(Model):
235
236
 
236
237
  class DateRange(DateRangeObservable):
237
238
  """
238
- Mixin for models that represent a period defined by a start date and an end
239
- date.
239
+
240
+ A model mixin that adds two fields `start_date` and `end_date`.
241
+ :class:`DateRangeObservable`
240
242
 
241
243
  Designed for usage with
242
244
  :class:`lino.modlib.system.PeriodEvents`.
@@ -267,6 +269,12 @@ class DateRange(DateRangeObservable):
267
269
  def get_period_text(self):
268
270
  return rangetext(self, fdl, self.empty_period_text)
269
271
 
272
+ def covers_date(self, d):
273
+ if self.start_date and self.start_date > d:
274
+ return False
275
+ if self.end_date and self.end_date < d:
276
+ return False
277
+ return True
270
278
 
271
279
  DateRange.set_widget_options("start_date", width=10)
272
280
  DateRange.set_widget_options("end_date", width=10)
@@ -274,9 +282,9 @@ DateRange.set_widget_options("end_date", width=10)
274
282
 
275
283
  class ObservedDateRange(ParameterPanel):
276
284
  """:class:`lino.core.param_panel.ParameterPanel` with two fields
277
- `start_date` and `end_date` which default to empty.
285
+ `start_date` and `end_date`.
278
286
 
279
- Note that you must define yourself a get_request_queryset method in order to
287
+ You must define yourself a :meth:`get_request_queryset` method in order to
280
288
  actually use these two parameter fields.
281
289
 
282
290
  """
@@ -247,16 +247,16 @@ class Polymorphic(model.Model):
247
247
  buttons = self.get_mti_buttons(ar)
248
248
  return E.span(*buttons)
249
249
 
250
- def as_summary_item(self, ar, *args, **kwargs):
250
+ def as_summary_item(self, ar, text=None, **kwargs):
251
251
  # a = super(Polymorphic, self).get_detail_action(ar)
252
252
  a = self.get_detail_action(ar)
253
253
  if a is not None:
254
- return super().as_summary_item(ar, *args, **kwargs)
254
+ return super().as_summary_item(ar, text, **kwargs)
255
255
  for m in self._mtinav_models:
256
256
  if m is not self.__class__:
257
257
  obj = mti.get_child(self, m)
258
258
  if obj is not None:
259
259
  if obj.get_detail_action(ar) is not None:
260
- return obj.as_summary_item(ar, *args, **kwargs)
260
+ return obj.as_summary_item(ar, text, **kwargs)
261
261
  return str(self)
262
262
  # return "?!? {} has no detail_action for {}".format(self, ar)
lino/mixins/ref.py CHANGED
@@ -47,7 +47,7 @@ class Referrable(model.Model):
47
47
  @classmethod
48
48
  def on_analyze(cls, site):
49
49
  cls.set_widget_options("ref", width=cls.ref_max_length)
50
- super(Referrable, cls).on_analyze(site)
50
+ super().on_analyze(site)
51
51
 
52
52
  def on_duplicate(self, ar, master):
53
53
  """
@@ -56,7 +56,10 @@ class Referrable(model.Model):
56
56
  """
57
57
  if self.ref:
58
58
  self.ref += " (DUP)"
59
- super(Referrable, self).on_duplicate(ar, master)
59
+ super().on_duplicate(ar, master)
60
+
61
+ def __str__(self):
62
+ return self.ref or super().__str__()
60
63
 
61
64
  @staticmethod
62
65
  def ref_prefix(obj, ar=None):
@@ -96,7 +99,7 @@ class Referrable(model.Model):
96
99
  # if search_text.isdigit():
97
100
  if search_text.startswith("*"):
98
101
  return models.Q(**{prefix + "ref__icontains": search_text[1:]})
99
- return super(Referrable, cls).quick_search_filter(search_text, prefix)
102
+ return super().quick_search_filter(search_text, prefix)
100
103
 
101
104
 
102
105
  class StructuredReferrable(Referrable):
@@ -20,7 +20,8 @@ class Plugin(ad.Plugin):
20
20
  "The config descriptor for this plugin."
21
21
 
22
22
  verbose_name = _("Checkdata")
23
- needs_plugins = ["lino.modlib.users", "lino.modlib.gfks", "lino.modlib.linod"]
23
+ needs_plugins = ["lino.modlib.users", "lino.modlib.gfks",
24
+ "lino.modlib.office", "lino.modlib.linod"]
24
25
 
25
26
  # plugin settings
26
27
  responsible_user = None # the username (a string)
@@ -50,8 +51,7 @@ class Plugin(ad.Plugin):
50
51
  User = self.site.models.users.User
51
52
  try:
52
53
  self._responsible_user = User.objects.get(
53
- username=self.responsible_user
54
- )
54
+ username=self.responsible_user)
55
55
  except User.DoesNotExist:
56
56
  msg = "Invalid username '{0}' in `responsible_user` "
57
57
  msg = msg.format(self.responsible_user)
@@ -33,7 +33,7 @@ elif emotion_range == "social":
33
33
 
34
34
  class ObservedTime(ObservedEvent):
35
35
  def __init__(self, value, name, text):
36
- super(ObservedTime, self).__init__(value, text=text, name=name)
36
+ super().__init__(value, text=text, name=name)
37
37
 
38
38
  def add_filter(self, qs, pv):
39
39
  if pv.start_date:
@@ -14,6 +14,7 @@ from django.utils.timezone import make_aware
14
14
  from lino.modlib.comments.mixins import Commentable
15
15
 
16
16
  styled = """<h1 style="color: #5e9ca0;">Styled comment <span style="color: #2b2301;">pasted from word!</span> </h1>"""
17
+
17
18
  table = """<table class="editorDemoTable"><thead>
18
19
  <tr><td>Who</td><td>What</td><td>Done?</td></tr></thead><tbody><tr><td>Him</td><td>Bar</td><td>&nbsp;</td></tr><tr><td>Her</td><td>Foo the Bar</td><td><strong style="font-size: 17px; color: #2b2301;">x</strong></td></tr><tr><td>Them</td><td><span id="demoId">Floop the pig<br /></span></td><td>x</td></tr></tbody></table>"""
19
20
  lorem = """<p>Lorem ipsum <strong> dolor sit amet</strong>, consectetur adipiscing elit. Nunc cursus felis nisi, eu pellentesque lorem lobortis non. Aenean non sodales neque, vitae venenatis lectus. In eros dui, gravida et dolor at, pellentesque hendrerit magna. Quisque vel lectus dictum, rhoncus massa feugiat, condimentum sem. Donec elit nisl, placerat vitae imperdiet eget, hendrerit nec quam. Ut elementum ligula vitae odio efficitur rhoncus. Duis in blandit neque. Sed dictum mollis volutpat. Morbi at est et nisi euismod viverra. Nulla quis lacus vitae ante sollicitudin tincidunt. Donec nec enim in leo vulputate ultrices. Suspendisse potenti. Ut elit nibh, porta ut enim ac, convallis molestie risus. Praesent consectetur lacus lacus, in faucibus justo fringilla vel.</p>
@@ -22,7 +23,8 @@ short_lorem = """<p>Lorem ipsum <strong> dolor sit amet</strong>, consectetur ad
22
23
  <p>Phasellus gravida ullamcorper eros, sit amet blandit sapien laoreet quis.</p>
23
24
  <p>Donec accumsan mauris at risus lobortis, nec pretium tortor aliquam. Nulla vel enim vel eros venenatis congue.</p>"""
24
25
 
25
- breaking = '<p>breaking <!--[if gte mso 9]><xml>\n <o:OfficeDocumentSettings>\n <o:AllowPNG/>\n </o:OfficeDocumentSettings>\n</xml><![endif]--></p>\n<p><!--[if gte mso 9]><xml>\n <w:WordDocument>\n <w:View>Normal</w:View>\n <w:Zoom>0</w:Zoom>\n <w:TrackMoves/>\n <w:TrackFormatting/>\n <w:HyphenationZone>21</w:HyphenationZone>\n <w:PunctuationKerning/>\n <w:ValidateAgainstSchemas/>\n <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>\n <w:IgnoreMixedContent>false</w:IgnoreMixedContent>\n <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>\n <w:DoNotPromoteQF/>\n <w:LidThemeOther>FR-BE</w:LidThemeOther>\n <w:LidThemeAsian>X-NONE</w:LidThemeAsian>\n <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>\n <w:Compatibility>\n <w:BreakWrappedTables/>\n <w:SnapToGridInCell/>\n <w:WrapTextWithPunct/>\n <w:UseAsianBreakRules/>\n <w:DontGrowAutofit/>\n <w:SplitPgBreakAndParaMark/>\n <w:EnableOpenTypeKerning/>\n <w:DontFlipMirrorIndents/>\n <w:OverrideTableStyleHps/>\n </w:Compatibility>\n <m:mathPr>\n <m:mathFont m:val="Cambria Math"/>\n <m:brkBin m:val="before"/>\n <m:brkBinSub m:val="&#45;-"/>\n <m:smallFrac m:val="off"/>\n <m:dispDef/>\n <m:lMargin m:val="0"/>\n <m:rMargin m:val="0"/>\n <m:defJc m:val="centerGroup"/>\n <m:wrapIndent m:val="1440"/>\n <m:intLim m:val="subSup"/>\n <m:naryLim m:val="undOvr"/>\n </m:mathPr></w:WordDocument>\n</xml><![endif]--><!--[if gte mso 9]><xml>\n <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"\n DefSemiHidden="true" DefQFormat="false" DefPriority="99"\n LatentStyleCount="267">\n <w:LsdException Locked="false" Priority="0" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Normal"/>\n <w:LsdException Locked="false" Priority="9" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 1"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 2"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 3"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 4"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 5"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 6"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 7"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 8"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 9"/>\n <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>\n <w:LsdException Locked="false" Priority="10" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Title"/>\n <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>\n <w:LsdException Locked="false" Priority="11" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>\n <w:LsdException Locked="false" Priority="22" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Strong"/>\n <w:LsdException Locked="false" Priority="20" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>\n <w:LsdException Locked="false" Priority="59" SemiHidden="false"\n UnhideWhenUsed="false" Name="Table Grid"/>\n <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>\n <w:LsdException Locked="false" Priority="1" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 1"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 1"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 1"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>\n <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>\n <w:LsdException Locked="false" Priority="34" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>\n <w:LsdException Locked="false" Priority="29" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Quote"/>\n <w:LsdException Locked="false" Priority="30" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 1"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 1"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 2"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 2"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 2"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 2"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 2"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 3"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 3"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 3"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 3"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 3"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 4"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 4"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 4"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 4"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 4"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 5"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 5"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 5"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 5"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 5"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 6"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 6"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 6"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 6"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 6"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>\n <w:LsdException Locked="false" Priority="19" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>\n <w:LsdException Locked="false" Priority="21" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>\n <w:LsdException Locked="false" Priority="31" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>\n <w:LsdException Locked="false" Priority="32" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>\n <w:LsdException Locked="false" Priority="33" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>\n <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>\n <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>\n </w:LatentStyles>\n</xml><![endif]--><!--[if gte mso 10]>\n<style>\n /* Style Definitions */\n table.MsoNormalTable\n\t{mso-style-name:"Tableau Normal";\n\tmso-tstyle-rowband-size:0;\n\tmso-tstyle-colband-size:0;\n\tmso-style-noshow:yes;\n\tmso-style-priority:99;\n\tmso-style-parent:"";\n\tmso-padding-alt:0cm 5.4pt 0cm 5.4pt;\n\tmso-para-margin:0cm;\n\tmso-para-margin-bottom:.0001pt;\n\tmso-pagination:widow-orphan;\n\tfont-size:10.0pt;\n\tfont-family:"Times New Roman","serif";}\n</style>\n<![endif]--></p>\n<p class="MsoNormal" style="mso-outline-level: 1;"><strong><span style="font-size: 11.0pt; font-family: \'Calibri\',\'sans-serif\'; mso-ansi-language: FR;" lang="FR">De&nbsp;:</span></strong><span style="font-size: 11.0pt; font-family: \'Calibri\',\'sans-serif\'; mso-ansi-language: FR;" lang="FR"> <a href="mailto:lino@foo.net">lino@foo.net</a> [<a href="mailto:foo@bar.com">mailto:foo@bar.com</a>] <br /> <strong>Envoy&eacute;&nbsp;:</strong> mardi 18 octobre 2016 08:52<br /> <strong>&Agrave;&nbsp;:</strong> <a href="mailto:Far@baz.net">eexample@foo.com</a><br /> <strong>Objet&nbsp;:</strong> [welcht] YOU modified FOO BAR</span></p>\n<p class="MsoNormal">&nbsp;</p>\n<p>Dear Aur&eacute;lie ,</p>\n<p>this is to notify / BAR</p>\n<p>BAR modified </p>\n<p>TODO: include a summary of the modifications.</p>\n<p>Any subsequent notifications about foo/ until you view this notification in the Lino web interface. Please visit</p>\n<p class="MsoNormal"><a href="None">None</a></p>\n<p>and follow your welcome messages.</p>'
26
+ breaking = """<p>breaking <!--[if gte mso 9]><xml>\n <o:OfficeDocumentSettings>\n <o:AllowPNG/>\n </o:OfficeDocumentSettings>\n</xml><![endif]--></p>\n<p><!--[if gte mso 9]><xml>\n <w:WordDocument>\n <w:View>Normal</w:View>\n <w:Zoom>0</w:Zoom>\n <w:TrackMoves/>\n <w:TrackFormatting/>\n <w:HyphenationZone>21</w:HyphenationZone>\n <w:PunctuationKerning/>\n <w:ValidateAgainstSchemas/>\n <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>\n <w:IgnoreMixedContent>false</w:IgnoreMixedContent>\n <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>\n <w:DoNotPromoteQF/>\n <w:LidThemeOther>FR-BE</w:LidThemeOther>\n <w:LidThemeAsian>X-NONE</w:LidThemeAsian>\n <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>\n <w:Compatibility>\n <w:BreakWrappedTables/>\n <w:SnapToGridInCell/>\n <w:WrapTextWithPunct/>\n <w:UseAsianBreakRules/>\n <w:DontGrowAutofit/>\n <w:SplitPgBreakAndParaMark/>\n <w:EnableOpenTypeKerning/>\n <w:DontFlipMirrorIndents/>\n <w:OverrideTableStyleHps/>\n </w:Compatibility>\n <m:mathPr>\n <m:mathFont m:val="Cambria Math"/>\n <m:brkBin m:val="before"/>\n <m:brkBinSub m:val="&#45;-"/>\n <m:smallFrac m:val="off"/>\n <m:dispDef/>\n <m:lMargin m:val="0"/>\n <m:rMargin m:val="0"/>\n <m:defJc m:val="centerGroup"/>\n <m:wrapIndent m:val="1440"/>\n <m:intLim m:val="subSup"/>\n <m:naryLim m:val="undOvr"/>\n </m:mathPr></w:WordDocument>\n</xml><![endif]--><!--[if gte mso 9]><xml>\n <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"\n DefSemiHidden="true" DefQFormat="false" DefPriority="99"\n LatentStyleCount="267">\n <w:LsdException Locked="false" Priority="0" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Normal"/>\n <w:LsdException Locked="false" Priority="9" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>\n <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 1"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 2"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 3"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 4"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 5"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 6"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 7"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 8"/>\n <w:LsdException Locked="false" Priority="39" Name="toc 9"/>\n <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>\n <w:LsdException Locked="false" Priority="10" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Title"/>\n <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>\n <w:LsdException Locked="false" Priority="11" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>\n <w:LsdException Locked="false" Priority="22" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Strong"/>\n <w:LsdException Locked="false" Priority="20" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>\n <w:LsdException Locked="false" Priority="59" SemiHidden="false"\n UnhideWhenUsed="false" Name="Table Grid"/>\n <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>\n <w:LsdException Locked="false" Priority="1" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 1"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 1"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 1"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>\n <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>\n <w:LsdException Locked="false" Priority="34" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>\n <w:LsdException Locked="false" Priority="29" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Quote"/>\n <w:LsdException Locked="false" Priority="30" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 1"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 1"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 2"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 2"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 2"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 2"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 2"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 3"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 3"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 3"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 3"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 3"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 4"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 4"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 4"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 4"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 4"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 5"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 5"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 5"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 5"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 5"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>\n <w:LsdException Locked="false" Priority="60" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Shading Accent 6"/>\n <w:LsdException Locked="false" Priority="61" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light List Accent 6"/>\n <w:LsdException Locked="false" Priority="62" SemiHidden="false"\n UnhideWhenUsed="false" Name="Light Grid Accent 6"/>\n <w:LsdException Locked="false" Priority="63" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>\n <w:LsdException Locked="false" Priority="64" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>\n <w:LsdException Locked="false" Priority="65" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>\n <w:LsdException Locked="false" Priority="66" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>\n <w:LsdException Locked="false" Priority="67" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>\n <w:LsdException Locked="false" Priority="68" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>\n <w:LsdException Locked="false" Priority="69" SemiHidden="false"\n UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>\n <w:LsdException Locked="false" Priority="70" SemiHidden="false"\n UnhideWhenUsed="false" Name="Dark List Accent 6"/>\n <w:LsdException Locked="false" Priority="71" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>\n <w:LsdException Locked="false" Priority="72" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful List Accent 6"/>\n <w:LsdException Locked="false" Priority="73" SemiHidden="false"\n UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>\n <w:LsdException Locked="false" Priority="19" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>\n <w:LsdException Locked="false" Priority="21" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>\n <w:LsdException Locked="false" Priority="31" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>\n <w:LsdException Locked="false" Priority="32" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>\n <w:LsdException Locked="false" Priority="33" SemiHidden="false"\n UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>\n <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>\n <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>\n </w:LatentStyles>\n</xml><![endif]--><!--[if gte mso 10]>\n<style>\n /* Style Definitions */\n table.MsoNormalTable\n\t{mso-style-name:"Tableau Normal";\n\tmso-tstyle-rowband-size:0;\n\tmso-tstyle-colband-size:0;\n\tmso-style-noshow:yes;\n\tmso-style-priority:99;\n\tmso-style-parent:"";\n\tmso-padding-alt:0cm 5.4pt 0cm 5.4pt;\n\tmso-para-margin:0cm;\n\tmso-para-margin-bottom:.0001pt;\n\tmso-pagination:widow-orphan;\n\tfont-size:10.0pt;\n\tfont-family:"Times New Roman","serif";}\n</style>\n<![endif]--></p>\n<p class="MsoNormal" style="mso-outline-level: 1;"><strong><span style="font-size: 11.0pt; font-family: \'Calibri\',\'sans-serif\'; mso-ansi-language: FR;" lang="FR">De&nbsp;:</span></strong><span style="font-size: 11.0pt; font-family: \'Calibri\',\'sans-serif\'; mso-ansi-language: FR;" lang="FR"> <a href="mailto:lino@foo.net">lino@foo.net</a> [<a href="mailto:foo@bar.com">mailto:foo@bar.com</a>] <br /> <strong>Envoy&eacute;&nbsp;:</strong> mardi 18 octobre 2016 08:52<br /> <strong>&Agrave;&nbsp;:</strong> <a href="mailto:Far@baz.net">eexample@foo.com</a><br /> <strong>Objet&nbsp;:</strong> [welcht] YOU modified FOO BAR</span></p>\n<p class="MsoNormal">&nbsp;</p>\n<p>Dear Aur&eacute;lie ,</p>\n<p>this is to notify / BAR</p>\n<p>BAR modified </p>\n<p>TODO: include a summary of the modifications.</p>\n<p>Any subsequent notifications about foo/ until you view this notification in the Lino web interface. Please visit</p>\n<p class="MsoNormal"><a href="None">None</a></p>\n<p>and follow your welcome messages.</p>"""
27
+
26
28
  cond_comment = (
27
29
  "<p><!--[if gte foo 123]>A conditional comment<![endif]--></p>\n<p>Hello</p>"
28
30
  )
@@ -67,6 +69,7 @@ def objects():
67
69
  obj.after_ui_create(ses)
68
70
  obj.before_ui_save(ses, None)
69
71
  # obj.full_clean()
72
+ obj.created = now
70
73
  obj.modified = now
71
74
  yield obj
72
75
  obj.after_ui_save(ses, None)
@@ -89,10 +89,9 @@ class AddCommentField(dd.VirtualField):
89
89
 
90
90
 
91
91
  class Commentable(MemoReferrable):
92
- class Meta(object):
93
- abstract = True
94
92
 
95
- create_comment_template = _("Created new {model} {obj}.")
93
+ class Meta:
94
+ abstract = True
96
95
 
97
96
  # add_comment = AddCommentField("comments.CommentsByRFC")
98
97
 
@@ -102,8 +101,8 @@ class Commentable(MemoReferrable):
102
101
  def get_rfc_description(self, ar):
103
102
  return ""
104
103
 
105
- def get_comment_group(self):
106
- return None
104
+ # def get_comment_group(self):
105
+ # return None
107
106
 
108
107
  if dd.is_installed("comments"):
109
108
 
@@ -112,17 +111,17 @@ class Commentable(MemoReferrable):
112
111
  if rt.settings.SITE.loading_from_dump:
113
112
  return
114
113
 
115
- if self.create_comment_template is not None:
116
- txt = self.create_comment_template.format(
117
- model=self.__class__._meta.verbose_name, obj=self
118
- )
119
- # txt = self.get_create_comment(ar)
114
+ if (txt := self.get_create_comment_text(ar)) is not None:
120
115
  comment = rt.models.comments.Comment(body=txt, owner=self)
121
116
  comment.on_create(ar)
122
117
  comment.full_clean()
123
118
  comment.save_new_instance(ar)
124
119
  # print("20220916 save_new_instance() created", comment, txt)
125
120
 
121
+ def get_create_comment_text(self, ar):
122
+ return _("Created new {model} {obj}.").format(
123
+ model=self.__class__._meta.verbose_name, obj=self)
124
+
126
125
  @classmethod
127
126
  def add_comments_filter(cls, qs, ar):
128
127
  return qs
@@ -213,10 +213,10 @@ class Comment(
213
213
  # s += ar.row_as_paragraph(o.owner)
214
214
  s += ar.obj2htmls(o.owner)
215
215
  # s += ar.obj2htmls(o.owner)
216
- if False: # tickets show themselves their group in __str__()
217
- group = o.owner.get_comment_group()
218
- if group and group.ref:
219
- s += "@" + group.ref
216
+ # if False: # tickets show themselves their group in __str__()
217
+ # group = o.owner.get_comment_group()
218
+ # if group and group.ref:
219
+ # s += "@" + group.ref
220
220
 
221
221
  if False and o.num_reactions:
222
222
  txt = ngettext("{} reaction", "{} reactions", o.num_reactions).format(
@@ -118,6 +118,11 @@ class Comments(dd.Table):
118
118
  yield p
119
119
  yield "reply_to"
120
120
 
121
+ @classmethod
122
+ def comments_created(cls, user, sd, ed):
123
+ pv = dict(start_date=sd, end_date=ed, observed_event=CommentEvents.created)
124
+ return cls.request(user=user, param_values=pv)
125
+
121
126
  # @classmethod
122
127
  # def get_card_title(cls, ar, obj):
123
128
  # """Overrides the default behaviour"""
@@ -986,7 +986,7 @@ class ExtRenderer(JsCacheRenderer):
986
986
  tbl = dh.layout._datasource
987
987
  yield ""
988
988
  yield "Lino.%s = Ext.extend(Lino.ActionFormPanel,{" % dh.layout._formpanel_name
989
- for k, v in list(dh.main.ext_options().items()):
989
+ for k, v in dh.main.ext_options().items():
990
990
  if k != "items":
991
991
  yield " %s: %s," % (k, py2js(v))
992
992
  assert tbl.action_name is not None
@@ -57,9 +57,8 @@ class LinodConsumer(AsyncConsumer):
57
57
  async def run_background_tasks(self, event: dict):
58
58
  # 'run.background.tasks' in `pm linod`
59
59
  from lino.modlib.linod.mixins import start_task_runner
60
-
61
- # start_task_runner = settings.SITE.models.linod.start_task_runner
62
- ar = settings.SITE.login()
60
+ from lino.core.requests import BaseRequest
61
+ ar = BaseRequest()
63
62
  asyncio.ensure_future(start_task_runner(ar))
64
63
 
65
64
  async def send_push(self, event):
@@ -69,7 +69,7 @@ class Runnable(Sequenced, RecurrenceSet):
69
69
  message = dd.RichTextField(_("Logged messages"), format="plain", editable=False)
70
70
 
71
71
  # procedure = Procedures.field(strict=False, unique=True, editable=False)
72
- procedure = Procedures.field(strict=False, editable=False)
72
+ procedure = Procedures.field(strict=False)
73
73
  name = models.CharField(_("Name"), max_length=200, blank=True)
74
74
 
75
75
  run_now = RunNow()
@@ -203,7 +203,8 @@ async def start_task_runner(ar, max_count=None):
203
203
  nst = await sync_to_async(self.get_next_suggested_date)(
204
204
  self.last_end_time, ar.logger
205
205
  )
206
- next_time = min(next_time, nst)
206
+ if nst is not None:
207
+ next_time = min(next_time, nst)
207
208
 
208
209
  count += 1
209
210
  if max_count is not None and count >= max_count: